RTF + Макрос

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Buddy
Постоянный обитатель
Сообщения: 122
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

RTF + Макрос

Сообщение Buddy »

Коллеги, можно ли как-нибудь прикрутить выполнение VBA-макроса при формировании RTF-отчета? Упоминания на форуме вроде есть, а конкретного примера нет. Требуется после формирования отчета его слегка дополнительно отформатировать. Макрос напишу сам, с этим проблем нет.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: RTF + Макрос

Сообщение Den »

через VbSript поупражняться можно
Buddy
Постоянный обитатель
Сообщения: 122
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: RTF + Макрос

Сообщение Buddy »

Den, спасибо, интересное решение. Попробую применить его у себя.
Buddy
Постоянный обитатель
Сообщения: 122
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: RTF + Макрос

Сообщение Buddy »

Написал макрос, но он выдает ошибку на строчке Set oWord = GetObject(,"Word.Application")

Код: Выделить всё

Procedure RunMacro;
{
  var FileName, VBSFileName : string;
  FileName := CreateTmpFileName;
  VBSFileName := TranslatePath ( GetStringParameter ( 'Files','OutputFilesDirectory', 0 ) + 'soprlabel.vbs' );
  LogStrToFile ( FileName, oem2ansi( 'Dim oWord' ));
  LogStrToFile ( FileName, oem2ansi( 'Set oWord = GetObject(,"Word.Application")' ));
  LogStrToFile ( FileName, oem2ansi( 'If Not (oWord Is Nothing) then' ));
  LogStrToFile ( FileName, oem2ansi( ' Dim oDoc' ));
  LogStrToFile ( FileName, oem2ansi( ' Set oDoc = oWord.Documents.Item(1)' ));
  LogStrToFile ( FileName, oem2ansi( ' Dim t' ));
  LogStrToFile ( FileName, oem2ansi( ' For t=1 To oDoc.Tables.Count' ));
  LogStrToFile ( FileName, oem2ansi( '  Do While Len(oDoc.Tables(t).Cell(oDoc.Tables(t).Rows.Count, 1).Range.Text) = 2' ));
  LogStrToFile ( FileName, oem2ansi( '   oDoc.Tables(t).Rows(oDoc.Tables(t).Rows.Count).Delete' ));
  LogStrToFile ( FileName, oem2ansi( '  Loop' ));
  LogStrToFile ( FileName, oem2ansi( ' Next' ));
  LogStrToFile ( FileName, oem2ansi( 'End If' ));
  LogStrToFile ( FileName, oem2ansi( 'WScript.Quit 0' ));

  if FileExist ( VBSFileName )
    DeleteFile ( VBSFileName );
  if CopyMoveFile ( FileName, VBSFileName, true, ecmfClientFrom + ecmfClientTo )
    ExecProgram ( 'start', VBSFileName, 'Запуск макроса...',pfSilent,0 );
  if FileExist ( VBSFileName )
    DeleteFile ( VBSFileName );
}  
Запускаю после вызова ShowFile:

Код: Выделить всё

 labelsopr.ShowFile('');
 RunMacro;  
Текст ошибки:
Изображение

Беглый гуглеж по ошибке быстрого результата не дал - например, советуют использовать не GetObject, а CreateObject, но ведь в статье именно фигурирует GetObject, значит, решение должно работать и с ним.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: RTF + Макрос

Сообщение Den »

Ну это не ошибка Гал, явно.
Я делал так когда то одному заказчику - все работало.
Сейчас открыл у себя тестовый rtf, запустил VBS скрипт из винды . В результате макрос отработал и в rtf , чтобы было указано в скрипте, поменялось
Buddy
Постоянный обитатель
Сообщения: 122
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: RTF + Макрос

Сообщение Buddy »

Так у меня мой скрипт работает, если запустить вручную (при открытом Ворде).
А при запуске из Галактики не хочет.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: RTF + Макрос

Сообщение Den »

Попробовал сгенерить скрипт из VIP и запустил его из Галактики.
Все ок отработало
Buddy
Постоянный обитатель
Сообщения: 122
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: RTF + Макрос

Сообщение Buddy »

Я понял, в чем проблема.
Она в этом месте:

Код: Выделить всё

labelsopr.ShowFile('');
RunMacro; 
Судя по всему, макрос начинается выполняться еще до полного открытия документа. Надо как-то поставить задержку между этими командами.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: RTF + Макрос

Сообщение Den »

Такой большой документ что ли. Странно что так )
Ну между
labelsopr.ShowFile('');
и
RunMacro;

добавить цикл, ради иинтереса, секунд на 10 )
Buddy
Постоянный обитатель
Сообщения: 122
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: RTF + Макрос

Сообщение Buddy »

Документ очень маленький вообще-то. А как добавить цикл на 10 секунд?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: RTF + Макрос

Сообщение edward_K »

Delay кажись, время в милисекундах
Ответить