Страница 1 из 1

RTF + Макрос

Добавлено: 28 июл 2020, 16:05
Buddy
Коллеги, можно ли как-нибудь прикрутить выполнение VBA-макроса при формировании RTF-отчета? Упоминания на форуме вроде есть, а конкретного примера нет. Требуется после формирования отчета его слегка дополнительно отформатировать. Макрос напишу сам, с этим проблем нет.

Re: RTF + Макрос

Добавлено: 28 июл 2020, 17:25
Den
через VbSript поупражняться можно

Re: RTF + Макрос

Добавлено: 28 июл 2020, 17:29
Buddy
Den, спасибо, интересное решение. Попробую применить его у себя.

Re: RTF + Макрос

Добавлено: 29 июл 2020, 18:18
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, значит, решение должно работать и с ним.

Re: RTF + Макрос

Добавлено: 30 июл 2020, 11:40
Den
Ну это не ошибка Гал, явно.
Я делал так когда то одному заказчику - все работало.
Сейчас открыл у себя тестовый rtf, запустил VBS скрипт из винды . В результате макрос отработал и в rtf , чтобы было указано в скрипте, поменялось

Re: RTF + Макрос

Добавлено: 30 июл 2020, 13:34
Buddy
Так у меня мой скрипт работает, если запустить вручную (при открытом Ворде).
А при запуске из Галактики не хочет.

Re: RTF + Макрос

Добавлено: 30 июл 2020, 14:07
Den
Попробовал сгенерить скрипт из VIP и запустил его из Галактики.
Все ок отработало

Re: RTF + Макрос

Добавлено: 30 июл 2020, 15:47
Buddy
Я понял, в чем проблема.
Она в этом месте:

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

labelsopr.ShowFile('');
RunMacro; 
Судя по всему, макрос начинается выполняться еще до полного открытия документа. Надо как-то поставить задержку между этими командами.

Re: RTF + Макрос

Добавлено: 30 июл 2020, 15:58
Den
Такой большой документ что ли. Странно что так )
Ну между
labelsopr.ShowFile('');
и
RunMacro;

добавить цикл, ради иинтереса, секунд на 10 )

Re: RTF + Макрос

Добавлено: 30 июл 2020, 16:06
Buddy
Документ очень маленький вообще-то. А как добавить цикл на 10 секунд?

Re: RTF + Макрос

Добавлено: 03 авг 2020, 22:41
edward_K
Delay кажись, время в милисекундах