RTF + Макрос

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

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

RTF + Макрос

Сообщение Buddy » Вт июл 28, 2020 17:05

Коллеги, можно ли как-нибудь прикрутить выполнение VBA-макроса при формировании RTF-отчета? Упоминания на форуме вроде есть, а конкретного примера нет. Требуется после формирования отчета его слегка дополнительно отформатировать. Макрос напишу сам, с этим проблем нет.
Аватара пользователя
Buddy
Постоянный обитатель
 
Сообщения: 112
Зарегистрирован: Чт июн 02, 2016 16:18
Откуда: Галактика СПб
Reputation point: 11

Re: RTF + Макрос

Сообщение Den » Вт июл 28, 2020 18:25

через VbSript поупражняться можно

http://gal.tyumbit.ru/viewtopic.php?f=8&t=10833
Den
Местный житель
 
Сообщения: 1836
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Reputation point: 60

Re: RTF + Макрос

Сообщение Buddy » Вт июл 28, 2020 18:29

Den, спасибо, интересное решение. Попробую применить его у себя.
Аватара пользователя
Buddy
Постоянный обитатель
 
Сообщения: 112
Зарегистрирован: Чт июн 02, 2016 16:18
Откуда: Галактика СПб
Reputation point: 11

Re: RTF + Макрос

Сообщение Buddy » Ср июл 29, 2020 19:18

Написал макрос, но он выдает ошибку на строчке 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, значит, решение должно работать и с ним.
Аватара пользователя
Buddy
Постоянный обитатель
 
Сообщения: 112
Зарегистрирован: Чт июн 02, 2016 16:18
Откуда: Галактика СПб
Reputation point: 11

Re: RTF + Макрос

Сообщение Den » Чт июл 30, 2020 12:40

Ну это не ошибка Гал, явно.
Я делал так когда то одному заказчику - все работало.
Сейчас открыл у себя тестовый rtf, запустил VBS скрипт из винды . В результате макрос отработал и в rtf , чтобы было указано в скрипте, поменялось
Den
Местный житель
 
Сообщения: 1836
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Reputation point: 60

Re: RTF + Макрос

Сообщение Buddy » Чт июл 30, 2020 14:34

Так у меня мой скрипт работает, если запустить вручную (при открытом Ворде).
А при запуске из Галактики не хочет.
Аватара пользователя
Buddy
Постоянный обитатель
 
Сообщения: 112
Зарегистрирован: Чт июн 02, 2016 16:18
Откуда: Галактика СПб
Reputation point: 11

Re: RTF + Макрос

Сообщение Den » Чт июл 30, 2020 15:07

Попробовал сгенерить скрипт из VIP и запустил его из Галактики.
Все ок отработало
Den
Местный житель
 
Сообщения: 1836
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Reputation point: 60

Re: RTF + Макрос

Сообщение Buddy » Чт июл 30, 2020 16:47

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

Код: Выделить всё
labelsopr.ShowFile('');
RunMacro;


Судя по всему, макрос начинается выполняться еще до полного открытия документа. Надо как-то поставить задержку между этими командами.
Аватара пользователя
Buddy
Постоянный обитатель
 
Сообщения: 112
Зарегистрирован: Чт июн 02, 2016 16:18
Откуда: Галактика СПб
Reputation point: 11

Re: RTF + Макрос

Сообщение Den » Чт июл 30, 2020 16:58

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

добавить цикл, ради иинтереса, секунд на 10 )
Den
Местный житель
 
Сообщения: 1836
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Reputation point: 60

Re: RTF + Макрос

Сообщение Buddy » Чт июл 30, 2020 17:06

Документ очень маленький вообще-то. А как добавить цикл на 10 секунд?
Аватара пользователя
Buddy
Постоянный обитатель
 
Сообщения: 112
Зарегистрирован: Чт июн 02, 2016 16:18
Откуда: Галактика СПб
Reputation point: 11

Re: RTF + Макрос

Сообщение edward_K » Пн авг 03, 2020 23:41

Delay кажись, время в милисекундах
edward_K
Заслуженный деятель интернет-сообщества
 
Сообщения: 5164
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: SPB galaxy spb
Reputation point: 115


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3