C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Макрос Word из Builder
laifik
  Отправлено: 17.09.2003, 09:49


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Все-таки, может кто знает, как запустить макрос в шаблоне Word-а из приложения С++ Builder? Просмотрела форумы, всю возможную документацию. Есть пример только на Excel, но он не подходит.
Есть какая-то функция, о которой я не догадываюсь.
Заранее благодарю. sad.gif
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);

Еще раз спасибо!!! biggrin.gif

Вернуться в Вопросы программирования в C++Builder