如何从具有Win32 :: OLE的特定工作簿运行宏

时间:2014-08-15 14:51:36

标签: perl excel-vba vba excel

(使用Win32:OLE w / Perl)

如果多个工作簿已经打开,有没有办法指定运行Excel宏的工作簿?

我使用以下代码,但如果打开多个Excel工作簿,有时会失败。我知道有一个明显的解决方案只关闭其他工作簿,但我的工作通常涉及使用另一个Excel工作簿(这是一个麻烦,以保持关闭和重新打开)。所以我希望有一种方法可以指定运行宏的工作簿(可能类似于指定其他参数的方式,例如Win32::GUI的标题)。

以下是一个当前只适用于一个工作簿的示例:

use Win32::OLE;
my $excel = Win32::OLE->GetActiveObject('Excel.Application');
$excel->Run("macroName"); 

我正在运行的宏导出当前工作簿的所有工作表,因此从正确的工作簿运行它是很重要的。我查看了这个问题(How do I use Perl to run a macro in an **already open** Excel workbook),但似乎并没有解决如何选择运行工作簿的宏的问题。

我还在阅读这篇文章(http://docs.activestate.com/activeperl/5.6/faq/Windows/ActivePerl-Winfaq12.html),但它似乎没有显示出如何从特定工作簿运行宏的方法。如果两个工作簿具有相同的宏名称,我可以看到,如果两个工作簿具有相同的宏名称,我可以看到无法指定哪个工作簿可以运行。但是由于某些原因,这些工作簿会做不同的事情。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您需要在工作簿中选择所需的工作表。例如打开文件,选择第二个工作簿(按名称)并激活它:

#!/usr/bin/perl
use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';

my $excelfile = 'd:\\Book1.xls';

my $Excel = Win32::OLE->GetActiveObject('Excel.Application') 
    || Win32::OLE->new('Excel.Application');
$Excel->{'Visible'} = 1;
my $Book = $Excel->Workbooks->Open("$excelfile") or die "$!";

my $Sheet = $Book->Worksheets("Sheet2");
$Sheet->Activate();   

这是使用Win32::OLE - perl Win32::OLE cheat sheet

的绝佳参考