Как запустить макрос VBA из кода Perl - PullRequest
1 голос
/ 29 февраля 2012

Я новичок в Perl, и я пытаюсь написать модуль, который будет запускать макрос Excel на уже открытом листе Excel. есть фрагмент кода, который описывает, как запустить макрос из другого листа Excel, но я хочу, чтобы код макроса был подпрограммой в том же файле. Как это реализовать? Может ли кто-нибудь помочь?

use strict;
use warnings;
use Win32::OLE;
my $excel= Win32::OLE->new('Excel.Application')or die "Could not create Excel.Application!\n;
$excel->Workbooks->open( 'C:\Users\Me\Documents\Book1.xlsx' );
$excel->run( 'Book1!Macro1' );

# Here i want that Macro1 as sub in this file itself & not from book1

$excel->quit;

1 Ответ

1 голос
/ 29 февраля 2012

Я действительно не думаю, что вы можете сделать это.Вам нужно было бы получить доступ к

$workbook->VBProject->VBComponents

, но тогда типичный способ передать создание макроса на лету - это вызвать AddFile, AddFromTemplate или Import метод VBComponents коллекции. для всех которых требуются пути к файлам, которые Excel будет сам читать.Это не так, как расширение Perl и будет также принимать поток открытых файлов.

Конечно, вы всегда можете написать механизм, который будет принимать строку в сценарии, выгружать ее во временный файл и отправлять это имя в Excel.Однако, поскольку Microsoft значительно усилила свою паранойю, мне интересно, сколько барьеров безопасности вам нужно будет устранить, чтобы Excel запустил макрос из каталога временных файлов.

После того, как вы загрузите это, это просто вопрос $xl->run( 'Bookname!Macro' ).Но я думаю, что защита от атак обязательно помешает вам сделать это.


Обновление:

Да, я просто попробовал что-то в этом духе и получил "Программный доступ к Visual Basic Projectне доверяют ".Как я уже сказал, ожидайте много препятствий, если не полный провал.

Однако вы можете обойти это с этим советом .

На самом деле, оказывается, я был не прав, приведенный ниже код позволяет добавить поведение в модуль кода.

my $prj = $wb->VBProject;
my $mod = $prj->VBComponents->Item( 'ThisWorkbook' )->CodeModule;
$mod->addFromString( <<"END_VB" );
Public Sub Doodad
    MsgBox( "I am Doodad! Hear me roar!" )
End Sub
END_VB

Однако когда я сделал это:

$excel->Run( $wb->Name . '!Doodad' ); 

Я получил это:

Cannot run the macro 'Book1!Doodad'. The macro may not be available in this
workbook or all macros may be disabled.
...