PDA

Показать полную графическую версию : [решено] Помогите пожалуйста написать макросс для Word


Vovchik1900
07-05-2011, 07:14
Здравствуйте.

Помогите пожалуйста решить задачку. Дело вот в чем:
Имеем *.doc или *.docx файл. В нем находится текст. Текст разделен на абзацы. Есть программа, которая может выделять текст по абзацам: выделила абзац, через некоторое время сняла выделение и выделила следующий, потом опять сняла и так пока документ не закончится. Программа внешняя.

Так вот задача в чем: нужно, чтобы после того как было снято выделение с первого абзаца появлялось окно в котором бы показывалась картинка. Картинка любая. Картинку можно выбрать заранее. Все картинки лежат где-нибудь в папке(или где-нибудь еще) и вызываются по порядку.

То есть примерно такой алгоритм:
выделился абзац---снялось выделение(появилось окно, в окне появилась картинка)---выделился следующий абзац---снялось выделение(в окне появилась другая картинка)---выделился третий абзац---снялось выделение(в окне появилась следующая картинка)

Помогите пожалуйста с кодом. если не трудно.

pva
07-05-2011, 13:11
Предлагаю сделать так: внешний скрипт заменяет программу, которая выделяет абзацы.
Он открывает doc-файл и надеется что он окажется вордовским (точно знает только система). Затем выделяет пресловутые абзацы и вызывает внешнее приложение для показа картинок, например mspaint. Но можно любой браузер.

// набросок скрипта (не проверен, только демонстрирует идею)

var doc = WScript.GetObject("my_doc.doc", "Word.Document"),
shell = WScirpt.CreateObject("WScript.Shell");

doc.application.visible = true;

for(var i=1; i<=doc.paragraph.count; ++i) // надо бы подумать над условием
{
doc.selection.range = doc.paragraph.item(i);
WScript.Sleep(5000);
doc.selection.range.clear();
shell.run("mspaint " + i + ".jpg");
}

Подробное описание как чего делать с вордом есть в руководстве по использованию VBA в справочной системе Microsoft Office. Описание WScript и WshShell - в MSDN.
Можно открывать картинку при помощи GetObject, но возвращаемый объект будет определяться системой (точнее классом, под которым эта картинка зарегистрирована). В зависимости от настроек системы, может оказаться так, что откроется фотошоп (что ИМХО не подходящее средство просмотра). Ещё можно просить системы "показать", "распечатать", "редактировать", что вроде бы и гибкое, и предсказуемое решение. Если по пути найду как это сделать из скрипта - напишу.

Iska
07-05-2011, 17:13
Можно открывать картинку при помощи GetObject, но возвращаемый объект будет определяться системой (точнее классом, под которым эта картинка зарегистрирована). »
Не лучший способ, ибо нет никакой гарантии, что подобный объект будет наличествовать и будет зарегистрирован в системе.
Ещё можно просить системы "показать", "распечатать", "редактировать", что вроде бы и гибкое, и предсказуемое решение. »
Standard Canonical Verbs and Their Behaviors (http://msdn.microsoft.com/en-us/library/bb776883(v=vs.85).aspx#canonical):
…WScirpt.CreateObject("Shell.Application").NameSpace(<Folder>).Items(<FolderItem>).Verbs(<verb>).DoIt

lxa85
07-05-2011, 22:00
у меня сейчас word 2010 под руками нет. Но ЕМНИП в нем можно записывать действия, что очень здорово облегает написание макроса.
Т.е. берем документ, открывает макросы, говорим "начать запись", выполняем ряд действий, говорим "прекратить запись" и получаем почти готовый шаблон. Чуть его подправить, и дело в шляпе.
Программа внешняя. »
Т.е. вообще внешняя? И как она работает с Word? Через Office API?
Если так, то внимательно скуриваем документацию (http://msdn.microsoft.com/ru-ru/library/ff936213.aspx)

Vovchik1900
08-05-2011, 06:59
pva,

Можно открывать картинку при помощи GetObject »

А как через эту функцию сделать? Про привязку изображения к программе я позабочусь.) Думаю, что хватит стандартного просмоторщика фото в виндовс (вин7).

Предлагаю сделать так: внешний скрипт заменяет программу, которая выделяет абзацы. »

Не никак. Нужно чтобы именно внешняя программа выделяла абзацы.

Ещё можно просить системы "показать", "распечатать", "редактировать", что вроде бы и гибкое, и предсказуемое решение. »

да ну. хватит только открыть.

lxa85,

ЕМНИП »

Это чего?

Т.е. вообще внешняя? И как она работает с Word? Через Office API? »

в ворд интегрируется как надстройка. вроде, COM интерфейс. В настройках ворда так показало.

lxa85
08-05-2011, 09:34
ЕМНИП - Если Мне Не Изменяет Память
в ворд интегрируется как надстройка. вроде, COM интерфейс. В настройках ворда так показало. »
а можно ее к сообщению прикрепить?

Vovchik1900
08-05-2011, 12:41
lxa85,
Там вроде dll файл. Вы о нем?

Vovchik1900
09-05-2011, 07:52
Вот он.

pva
10-05-2011, 21:33
Вот оно, о чём я говорил:

var appli = WScript.CreateObject("Shell.Application");

appli.ShellExecute("d:\\photo\\test-1.jpg", null, null, "open", 1);
WScript.Sleep(5000);
appli.ShellExecute("d:\\photo\\ava12.jpg", null, null, "open", 1);
WScript.Sleep(5000);

Только не знаю, как закрыть потом окошки.

Vovchik1900
11-05-2011, 17:31
ВСЕМ БОООЛЬШОЕ СПАСИБО!!!!!




© OSzone.net 2001-2012