laifik |
Отправлено: 17.09.2003, 09:49 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 70
|
Все-таки, может кто знает, как запустить макрос в шаблоне Word-а из приложения С++ Builder? Просмотрела форумы, всю возможную документацию. Есть пример только на Excel, но он не подходит.
Есть какая-то функция, о которой я не догадываюсь.
Заранее благодарю. |
|
Gedeon |
Отправлено: 17.09.2003, 10:53 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Да есть возможность запускать макрос ворда, даже с передачей ему параметров, но это можно делать только с помощью компонента TWordApplication со вкладки Office2k, по крайней мере в форумах я не нашел ничего (чуть с ума не сошел пока до этого додумался), тут еще в примере ухищрения проверки открытого ворда, а также открытого документа, чтобы не вылетала ошибка:
CODE |
AnsiString A1, A2, A3, A4, A5, A6, A7, A8, A9;
A1 = "Параметр1";
A2 = "Параметр2";
A3 = "Параметр3";
A4 = "Параметр4";
A5 = "Параметр5";
A6 = "Параметр6";
A7 = "Параметр7";
A8 = "Параметр8";
A9 = "Параметр9";
WideString macr("RetainCard");
AnsiString DotName = ExtractFilePath(Application->ExeName) + "Retain_card.dot";
Variant msWord;
bool isWordRunning = true;
AnsiString msWordTitle = "MyWordFromBuilder";
// сначала пытаемся переключиться на активный Word
try {
msWord = Variant::GetActiveObject("Word.Basic");
}
catch (EOleSysError& e) {
isWordRunning = false;
}
if(!isWordRunning){
/* Это нужно для того чтобы не вылетала ошибка, если ворд был открыт из программы и затем закрыт пользователем*/
WordApplication1->Disconnect();
}
else{
if(!((short)msWord.Exec(PropertyGet("AppIsRunning") << msWordTitle)==-1))
/* Это нужно для того чтобы не вылетала ошибка, если документ ворда был открыт из программы и затем закрыт пользователем*/
WordApplication1->Disconnect();
}
WordApplication1->Documents-> Add(&TVariant(DotName), EmptyParam, EmptyParam, EmptyParam);
WideString StringCaption = "MyWordFromBuilder";
wchar_t* caption;
WordApplication1->set_Caption(StringCaption.c_bstr());
WordApplication1->set_Visible(1);
/* А это собственно запуск самого макроса с передачей ему 9 параметров, если они не нужны то их поменять на EmptyParam*/
WordApplication1-> Run(macr.c_bstr(),
&TVariant(A1),&TVariant(A2),&TVariant(A3),
&TVariant(A4),&TVariant(A5),&TVariant(A6),
&TVariant(A7),&TVariant(A8),&TVariant(A9),
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
|
|
|
Gedeon |
Отправлено: 17.09.2003, 10:56 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Да, кстати, макрос в ворде называется RetainCard
|
|
Гость_laifik |
Отправлено: 17.09.2003, 13:07 |
|
Не зарегистрирован
|
Ура, убрав все ненужное в вашем примере, все отлично прошло. Огромное спасибо. Вовек не додумалась бы.
Вот, собственно, все, что у меня осталось при том, что Word уже был запущен:
WideString macr("Macros1");
// Запуск самого макроса
WordApp-> Run(macr.c_bstr(),
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
Еще раз спасибо!!! |
|
|