【问题标题】:How to run macro from specific workbook w/ Win32::OLE如何使用 Win32::OLE 从特定工作簿运行宏
【发布时间】:2014-10-09 07:43:55
【问题描述】:

(使用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),但它似乎没有说明如何从特定工作簿运行宏。再想一想,如果两个工作簿具有相同的宏名称,我可能会发现无法指定要运行哪个工作簿是一个问题,但由于某种原因,它们会做不同的事情。

有什么建议吗?

【问题讨论】:

  • 我对 PERL 不太了解,但可能$Excel->Workbooks->open('c:\somefile.xls');

标签: perl excel vba


【解决方案1】:

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

#!/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::OLEperl Win32::OLE cheat sheet 的绝佳参考

【讨论】:

  • 感谢您的链接,这很有帮助。您的代码涉及打开文件,但我不需要这样做:我只想从所有已打开的特定工作簿中访问宏
  • @resfasa 我的代码是一个独立的示例,因此每个人都可以获得答案的好处,无论他们访问 Excel 的方法不同。您需要复制的部分是我选择特定工作簿并激活它的位置。然后调用你的宏。
  • 这是真的 - 您的代码是一个很好的独立示例,它并不是我所需要的正是(无需打开文件即可执行此操作的选项),请参阅我的问题的第一行(工作簿已经打开)。为什么投反对票?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2018-11-10
相关资源
最近更新 更多