0

目前我正在尝试通过 Perl OLE 在 Microsoft Access 中执行宏

我想知道如何正确调用运行宏。我试过了

1) $oDatabase -> DoCmd.RunMacro("Macro1");
2)$oDatabase -> DoCmd -> RunMacro("Macro1");

但是他们向我抛出“无法在未定义的值上调用方法“DoCmd””或“无用的连接”

这甚至可以通过 Win::32 OLE 执行 DoCmd 吗?任何帮助将不胜感激。

这是一个完整的代码。它尝试查找当前打开的 Microsoft Access。

use strict; 
use warnings; 
use Win32::OLE;

my $oAccess;
my $oDatabase;

my $filename = "C:\\Sample.accdb"; 
$oAccess = Win32::OLE->GetActiveObject('Access.Application');

$oDatabase = $oAccess->OpenCurrentDatabase($filename);
$oDatabase -> DoCmd.RunMacro("Macro1");
4

2 回答 2

1

根据微软相当混乱的文档DoCmd是Application 对象的一个​​属性,而RunMacro是 DoCmd 的一个方法。在 Win32::OLE 中,方法使用方法语法,属性使用哈希语法。(点 '.' 是 Visual Basic 语法。在 Perl 5 中,使用 '->')。

所以你的代码的最后两行应该是(我认为):

$oAccess->OpenCurrentDatabase($filename);
$oAccess->{DoCmd}->RunMacro("Macro1");

我没有 Access 2007,所以我无法对此进行测试。

请注意,OpenCurrentDatabase不返回任何内容,这就是为什么当您尝试调用 $oDatabase(即 undef)上的方法时,您会得到“无法在未定义的值上调用方法“DoCmd””。

Microsoft 文档的链接于 2009 年 8 月 23 日有效,但 Microsoft 从未阅读过Cool URIs don't change,因此您的里程可能会有所不同。

于 2009-08-23T22:24:51.977 回答
-1

正如 HansUp 所说,您应该使用 Access 的 Application 实例变量来使用 DoCmd。
在您的情况下,它将转化为

$oAccess->DoCmd.RunMacro("macro1");

注意:我不知道 Perl :)

于 2009-08-22T00:54:40.647 回答