使用VBA完全控制另一个程序

时间:2012-09-11 17:04:50

标签: excel-vba serial-port vba excel

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

我已经做了一些环顾四周,发现Shell功能让您可以打开文件并应该允许您控制它,但我还没有找到通过Excel调用和操作程序的方法。如果有人可以帮助解决这个问题,那将非常感激。

提前致谢!

内特

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

1 个答案:

答案 0 :(得分:7)

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的文本框界面)插入的换行符。