Я действительно не думаю, что вы можете сделать это.Вам нужно было бы получить доступ к
$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.