【问题标题】:Using Win32::OLE to execute macro in Access 2007在 Access 2007 中使用 Win32::OLE 执行宏
【发布时间】:2009-08-21 23:35:42
【问题描述】:

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

【问题讨论】:

  • 我认为其他人实际上已经回答了您的问题,但我会问您到底要运行 macro 来做什么。宏是在 Access 应用程序中完成任何事情的糟糕方法。宏有什么作用?很可能它可以通过其他一些方法更直接地完成,即真实代码。

标签: perl winapi ms-access ole


【解决方案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,因此您的里程可能会有所不同。

【讨论】:

    【解决方案2】:

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

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

    注意:我不懂 Perl :)

    【讨论】:

    • 投反对票时,请说明原因。谢谢:)
    • 我不是投票者,但我猜它被否决了,因为这不是在 Perl 中这样做的正确语法。
    • 谢谢 cjm。我从 OP 的问题中得到它,我说我不知道​​ PERL :)
    • 不幸的是,他的一半问题是语法错误。 :-)
    猜你喜欢
    • 2014-10-09
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多