4

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

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

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

4

1 回答 1

9

如果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 的文本框界面)在源代码示例中插入的换行符。

于 2012-09-14T12:20:46.837 回答