我目前正致力于简化工作流程。它涉及Chatillon DFIS Force Meter,它使用串行连接传输数据。数据以文本形式发送到Chattillon程序,只能保存为.dat文件。我正在尝试设置一个Excel工作簿,它可以自动打开程序并使用不同的命令将信息直接输入Excel。命令将涉及更改单位,归零传感器和传输。
我已经做了一些环顾四周,发现Shell功能让您可以打开文件并应该允许您控制它,但我还没有找到通过Excel调用和操作程序的方法。如果有人可以帮助解决这个问题,那将非常感激。
提前致谢!
内特
Chatillon Program,基本上是用鼠标点击的按钮
答案 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
这是一个打开命令窗口并运行命令行可执行文件的示例,为其提供命令行开关'-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的文本框界面)插入的换行符。