在Microsoft VBA宏中向stdout写入数据
我正在使用Python(还有Win32扩展)通过COM接口在Excel表格中执行宏,下面是我的代码:
import win32com.client
o = win32com.client.Dispatch("Excel.Application")
o.Visible = 1
o.Workbooks.Open (r"C:\test.xls")
o.Application.Run("macro1")
我想要实现的是,让Excel宏输出一些文本警告信息,这样我的Python代码就可以通过COM或者标准输出(stdout)等方式捕捉到这些信息。请问在Microsoft VBA应用程序中可以从内部写入标准输出吗?有没有我不知道的其他方法可以做到这一点?
4 个回答
你几乎肯定需要使用Win32 API才能在这里取得进展。这个问题将标准输出重定向到编辑控件(Win32)提到了在图形界面应用程序中使用标准输入和标准输出。可惜的是,提问者还没有解决他们的问题。
我对Windows中支持标准输入和标准输出的机制很感兴趣。相比于在Unix中的重要性,它在Windows中似乎显得有些不那么重要。
用VB6写入和读取标准输出(stdout)有点麻烦,但用Excel和VBA创建一个控制台应用程序?我不太确定这是否可行。
我找到一个简单的Python COM示例,你可能已经看过了。你可以让你的宏创建一个工作表,然后写入一个单元格,接着用Python去读取那个单元格的内容吗?另外,你还可以通过Err.Raise()
来抛出自定义错误……或者更简单的办法是使用环境变量,这些方法都比打开一个控制台要好。
我猜测你想要的是异步通信,另一种可能性是动态数据交换(DDE)。在90年代中期,我们有一个内部脚本语言(DDE客户端)可以和正在运行的Excel会话(DDE服务器)进行对话,要求它输入数据、运行宏、返回单元格的值等等。虽然不太好用,但确实能工作。
有一个Python DDE库,还有几个示例。有个警告;我记得任何DDE编码都是个大麻烦,还很依赖一个叫DDESpy的工具。我很惊讶你不能通过COM实现你需要的功能,所以在转向DDE之前,建议你再多研究一下。
一种解决方案是用Python写一个COM服务器。然后,VBA宏可以创建这个COM服务器,并给它发送消息。
当你把数据从VBA发送到Python的COM服务器后,通过控制台应用程序写入标准输出会有点麻烦,但你可以选择写入文件、通过COM自动化写入网页浏览器、通过HTTP写入网页服务器,或者通过套接字写入图形界面编辑窗口等等。
这里有一本免费的章节,来自于《Python在Win32上的编程》。可以看看里面关于“实现COM服务器”的部分。如果你对用Python进行Windows编程感兴趣,这本书整体都值得一读,尽管现在看起来有点过时。