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