【问题标题】:Using VBA to control another program entirely使用 VBA 完全控制另一个程序
【发布时间】:2020-08-15 03:26:16
【问题描述】:

我目前正在努力简化工作流程。它涉及使用串行连接传输数据的 Chatillon DFIS 测力计。数据以文本形式发送到 Chattillon 程序,并且只能保存为 .dat 文件。我正在尝试设置一个 Excel 工作簿,它可以自动打开程序并使用不同的命令将信息直接放入 Excel。命令将涉及更改单位、将传感器归零和传输。

我环顾四周,发现 Shell 功能可以让您访问打开文件,应该可以帮助您控制它,但我还没有找到通过 Excel 调用和操作程序的方法。

Chatillon Program,基本上是用鼠标点击的按钮

【问题讨论】:

  • 我之前注意到了 sendkeys。使用它们来调用数据会很好,但我如何将“输入”与传输联系起来?
  • 查找 API 函数 FindWindowFindwindowEx 他们应该让您开始了解如何浏览打开的进程及其子窗口。 SendMessage 有时可用于单击或输入内容,但并非总是如此。在最坏的情况下,您可以选择按钮并输入或定位光标并单击。

标签: excel serial-port vba


【解决方案1】:

Excel 和 VBA 可以控制外部应用程序如果它们具有 COM 接口 - 也就是说,如果您可以将应用程序声明为对象,创建对象的实例,并查看其方法和属性。

如果您有可能为您的程序获取一个 COM 包装器,那就这样做吧。

如果你不能...你不会喜欢使用 I/O 流和 Windows Shell 对象来完成它,因为命令行 DOS 界面作为用户界面并不是特别友好,而且它们比当您尝试将它们用作 VBA 中的 API 时,在糕点厂跳霹雳舞。

首先,您需要由 Windows 脚本宿主对象模型公开的“WshShell”对象。您可以通过后期绑定来声明和实例化它,如下所示:


Dim objWshell As Object
Set objWshell = CreateObject("WScript.Shell")
但正确的方法(这将为您提供属性和方法的 Intellisense 下拉菜单)是使用“工具:参考...”对话框创建对父库的引用,该引用通常位于 C:\Windows \System32\wshom.ocx

然后您可以将 Shell 对象声明为:


Dim objWshell As IWshRuntimeLibrary.WshShell
Set objWshell = New IWshRuntimeLibrary.WshShell

运行命令行可执行文件并读取 VBA 中的 I/O 流

这是一个打开命令窗口并运行命令行可执行文件的示例,向其提供命令行开关“-s”和封装在双引号中的参数。

请注意,我正在运行的可执行文件不是“regsvr32.exe”——我的 shell 对象正在执行 cmd.exe,它是 I/O 流的源和接收器。

当然,您可以直接运行您的应用程序。它可能会起作用。但是,当您调用 .StdOut.ReadLine 或 .StdOut.ReadAll 时,输出流锁定或“挂起”您的调用函数及其 VBA 线程是很常见的 - 您已收到警告。


With objWshell.Exec("CMD /K")

  

       .StdIn.WriteBlankLines 3

    .StdIn.WriteLine "C:"

    .StdIn.WriteLine "CD C:\"

 

    .StdIn.WriteLine "regsvr32.exe -s " & Chr(34) & "%LIBDIR%\FXPricer.dll" & Chr(34)

    .StdIn.WriteBlankLines 1

 

    Do Until .StdOut.AtEndOfStream

        Debug.Print .StdOut.ReadLine

    Loop


     Do Until .StdErr.AtEndOfStream

        Debug.Print .StdOut.ReadLine

    Loop


    .Terminate


End With
分享和享受。而且,与往常一样,请注意浏览器(或 StackOverflow 的文本框界面)在源代码示例中插入的换行符。

【讨论】:

  • 比糕点厂里的霹雳舞还要脆——当然是+1
  • 同意。我认为,即使其余的没有用,该评论也可以证明整个答案的合理性。
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多