使用Win32 :: OLE在Access 2007中执行宏

时间:2009-08-21 23:35:43

标签: perl winapi ms-access ole

目前我正在尝试通过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");

2 个答案:

答案 0 :(得分:1)

根据Microsoft's rather confusing documentationDoCmd是Application对象的属性,而RunMacro是DoCmd的方法。在Win32 :: OLE中,方法使用方法语法和属性使用哈希语法。 (点'。'是Visual Basic语法。在Perl 5中,使用' - >')。

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

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

我没有Access 2007所以我无法测试它。

请注意,OpenCurrentDatabase不会返回任何内容,这就是当您尝试在$ oDatabase上调用方法时(未定义),您在“未定义的值”上获取“无法调用方法”DoCmd的原因

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

答案 1 :(得分:-1)

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

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

注意:我不知道Perl:)