在Microsoft VBA宏中从stdout输出写入

3

我正在使用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应用程序内部编写到stdout?是否有其他我不知道的方法?

4个回答

1

你可以通过 VB6 有些戏剧性地写入和读取标准输出..但是用 Excel 和 VBA 创建控制台应用程序?我不确定是否可能。

我发现了一个简单的 Python COM 示例,也许你已经调查过了。你能否让你的宏创建一个工作表并写入单元格,并让 Python 轮询该单元格呢? 此外,你可以通过 Err.Raise() 引发自定义错误..或者最坏情况下使用环境变量..这比启动控制台要好。

既然我猜想你想要异步通信,另一个可能性是 DDE 或动态数据交换。在 90 年代中期,我们曾经使用一个内部脚本语言(DDE 客户端)与正在运行的 Excel 会话(DDE 服务器)通信,并请求输入数据、运行宏、返回单元格值等。这不太好,但它有效。

有一个Python DDE库,以及几个 示例。一个警告; 我记得任何DDE编码都非常痛苦,并且很大程度上依赖于一个叫做DDESpy的工具。我很惊讶你不能通过COM完成所需的操作,所以在转向DDE之前,我建议你再深入调查一下。


你能否让你的宏只创建一个工作表并写入单元格,然后让Python轮询该单元格?-- 我的关键点是在宏中使用Cells(1, 1) = MyTextVarActiveWorkbook.Save,并通过https://dev59.com/safja4cB1Zd3GeqPuVrr#47699930进行阅读。 - nmz787

1

一个解决方案是使用Python编写COM服务器。VBA宏可以实例化COM服务器,然后向其发送消息。

一旦您从VBA将数据发送到Python COM服务器,通过控制台应用程序将数据写入标准输出会很棘手,但您可以将其写入文件、Web浏览器(通过COM自动化)、Web服务器(例如通过HTTP)、GUI编辑窗口(例如通过套接字)等等。

这里有一章免费的 Python Programming on Win32。请查看标题为“实现COM服务器”的部分。如果您对使用Python进行Windows编程感兴趣,则整本书都值得阅读,尽管它现在已经过时。


1
谢谢Ryan, 我想我会采取懒人的方式,将输出写入文本文件 - 这样我就可以用我的Python脚本来获取它了。这在之前并没有出现在我的选项中。 - Jon Mills

0
你几乎肯定需要使用Win32 API才能在这里取得任何进展。问题将stdout重定向到编辑控件(Win32)是指在GUI应用程序中使用stdin / stdout。不幸的是,提问者尚未解决他们的问题。
我对Windows支持stdin / stdout的机制很感兴趣。与Unix中的角色相比,它似乎是一个二等公民。

-1
如果你写入stdout会发生什么?可能会出现以下情况:
print "Hello, world!"

或者:

import sys
sys.stdout.write("Hello, world!\n")

甚至可以:

import sys
sys.__stdout__.write("Hello, world!\n")

sys.stdout 是当前的标准输出文件,__stdout__ 是 Python 解释器启动时的原始标准输出。


1
我可能没有解释清楚。我试图让Excel宏写入标准输出,而不是Python脚本。我只是使用Python作为驱动COM接口的手段。 - Jon Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接