【问题标题】:how to run VBA macro from perl code如何从 perl 代码运行 VBA 宏
【发布时间】:2012-03-01 16:22:28
【问题描述】:

我是 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;

【问题讨论】:

  • 在不指定 Book1 的情况下尝试 $excel->Run('Macro1')
  • 我尝试了很多方法,但无法将宏添加到 excel。每次它都会出错:
    Win32::OLE(0.1704) 错误 0x80020003:METHOD/PROPERTYGET 中的“未找到成员”
    # my $mod = $sheet->VBProject->VBComponents->Add(vbextFileTypeModule);
    # 甚至尝试使用 vbext_ct_StdModule & 1 但没有一个工作
    my $mod = $sheet->VBProject->VBComponents->Item( 'ThisWorkbook' )->CodeModule;
    $mod->AddFromString( Public Sub Display
    MsgBox "Hello";
    End Sub
    MODTEXT
    $showButton->{OnAction} = 'Display';
    谁能提供相同的解决方案.

标签: perl perl-module


【解决方案1】:

我真的不认为你能做到这一点。您需要访问

$workbook->VBProject->VBComponents

但是传递动态创建宏的典型方法是调用VBComponents 集合的AddFile、AddFromTemplate 或Importmethod,它们都需要Excel 将自行读取的文件的路径。它不像 Perl 的扩展,并且也将接受打开的文件流。

当然,您始终可以编写机制来获取脚本内字符串,将其转储到临时文件中,然后将该文件名发送到 Excel。然而,由于微软已经大大加强了它的偏执狂,我想知道你需要清除多少安全障碍才能让 Excel 从临时文件目录运行宏。

加载后,只需$xl->run( 'Bookname!Macro' )。但我认为针对攻击的保护措施势必会阻碍您这样做。


更新:

是的,我只是尝试了一些类似的方法并得到“不信任对 Visual Basic 项目的编程访问”。就像我说的,如果不是完全失败的话,预计会有很多障碍。

但是,您可以使用 this advice 解决此问题。

实际上,事实证明我错了,下面的代码允许您向代码模块添加行为。

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.

【讨论】:

  • 在$excel-&gt;Workbooks-&gt;open( 'C:\Users\Me\Documents\Book1.xlsx' ); 这一行中,您引用了扩展名为“xlsx”的工作簿。这不是启用宏的工作簿,我相信这就是您收到“无法运行宏......”消息的原因。为了克服这个问题,该文件将被保存为 Excel 启用宏的工作簿,其扩展名为 xlsm。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多