【问题标题】:How can I run a Perl script through an ActiveX Control within Excel?如何通过 Excel 中的 ActiveX 控件运行 Perl 脚本?
【发布时间】:2010-01-20 12:55:31
【问题描述】:

我想通过单击 Excel 电子表格中的按钮来运行 Perl 脚本。

由于按钮被分配执行一个 VB 宏,该宏应该有效地执行程序。

作为我的第一个 VB 脚本,这是我想出的,它引发了一个恼人的 Run-time error '424': Object required 错误。

Sub RunPerlScript()
    System.Diagnostics.process.Start ("perlscript.pl")
End Sub

我怎样才能让这个脚本做我想做的事?

【问题讨论】:

    标签: perl excel vba vb6 activex


    【解决方案1】:

    这个 sn-p 不是我写的,但它似乎可以很好地回答你的问题。

    来自文章How to execute a perl script from VBA

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Sub RunPerl()
        MsgBox ("Start of macro")
        Dim oWsc As Object
        Set oWsc = CreateObject("WScript.Shell")
        Dim oExec As Object
        Set oExec = oWsc.Exec("perl C:\temp\myperl.pl StartParam")
        While oExec.Status <> 1 ' Wait for process
            Sleep 1000
        Wend
        MsgBox ("STDOUT" + oExec.StdOut.ReadAll())
        MsgBox ("STDERR" + oExec.StdErr.ReadAll())
        Set oWsc = Nothing
        MsgBox ("End of macro")
    End Sub
    

    您可能需要先安装 ActivePerl

    【讨论】:

    • 我不明白您所说的“通过 ActiveX 控件”是什么意思。希望我的回答能满足你的要求。
    • 看起来不错,但需要测试一下。我的系统上正在运行 Strawberry……会告诉你它是怎么回事。
    • codeape 说 VBA 宏中不能有对象。我有预感他是对的......
    • @Zaid 不,他说“你不能使用 .NET 类”,你试图使用 System.Diagnostics.process.Start 这是一个 .NET 类。他的解决方案,使用Shell 更简单,并且可以工作,但是当过程完成时您不会收到通知,您也无法访问输出。如果您不需要这些东西,请使用Shell;否则使用我链接到的解决方案。
    • 第一行声明要从 VBA 调用的 Windows API 函数。顺便说一句,您在行尾缺少)Sleep 使当前线程休眠指定的时间(以毫秒为单位)。它被用来在每次检查之间让 Excel 休眠 1 秒,以查看 Perl 脚本是否已完成。我会观察到锁定 Excel 并让它不响应用户输入需要很长时间 - 我建议 50 或 100 毫秒就可以了。无论如何+1,用于同步解决方案,让您访问STDOUT。你肯定需要安装 ActivePerl 才能运行 Perl 脚本。
    【解决方案2】:

    您不能在 VBA 宏中使用 .NET 类。

    使用 VBA Shell 函数。

    Shell "p:\ath\to\perlscript.pl"
    

    文档:

    外壳函数

    运行一个可执行程序并返回 一个 Variant (Double) 代表 程序的任务 ID(如果成功), 否则返回零。

    语法

    Shell(路径名[,windowstyle])

    Shell 函数语法有这些 命名参数:

    部件描述路径名必填; 变体(字符串)。程序名称 执行和任何需要的参数 或命令行开关;可能包括 目录或文件夹和驱动器。在 Macintosh,您可以使用 MacID 指定应用程序的函数 签名而不是它的名字。这 以下示例使用签名 对于 Microsoft Word:外壳 MacID("MSWD") 窗口样式 可选。 Variant (Integer) 对应于 窗口的样式,其中 程序要运行。如果窗口样式 省略,程序启动 用焦点最小化。在 Macintosh 上 (系统 7.0 或更高版本),windowstyle 只决定是否 应用程序获得焦点时 运行。

    windowstyle 命名参数有 这些值:

    常量值描述 vbHide 0 窗口被隐藏并且焦点被传递 到隐藏的窗口。 vbHide 常数不适用于 麦金塔平台。 vbNormalFocus 1 窗口有焦点并恢复到 它的原始大小和位置。 vbMinimizedFocus 2 窗口显示 作为具有焦点的图标。 vbMaximizedFocus 3 窗口最大化 有重点。 vbNormalNoFocus 4 窗口 恢复到最近的大小 和位置。目前活跃的 窗口保持活动状态。 vbMinimizedNoFocus 6 窗口是 显示为图标。目前的 活动窗口保持活动状态。

    【讨论】:

    • 看起来这就是我所追求的。不幸的是,我必须安装 ActivePerl 才能启动脚本,但Shell 绝对是我的最佳选择......
    【解决方案3】:

    ActiveState 的 PDK 有 PerlCtrl,它允许您将 perl 脚本打包为 ActiveX 控件。它将您的脚本和所有依赖项收集到一个整洁的 DLL 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-05
      • 2016-01-27
      • 2018-12-19
      • 2010-09-26
      • 2014-06-20
      • 1970-01-01
      • 2018-09-06
      • 2013-01-02
      相关资源
      最近更新 更多