2009-12-11 90 views
2

我使用Python(和Win32扩展)在通过COM接口的Excel电子表格来执行宏,如下图所示:写作从微软VBA宏内到stdout

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?有没有另一种方法可以做到这一点,我不知道?

回答

1

一种解决方案是在Python中编写COM服务器。 VBA宏可以实例化COM服务器,然后发送它的消息。

将数据从VBA发送到您的Python COM服务器后,通过控制台应用程序写入stdout会非常棘手,但您可以写入文件,Web浏览器(通过COM自动化),Web服务器(例如通过HTTP),GUI编辑窗口(例如通过套接字)等等。

这是免费章节Python Programming on Win32。查看标题为“实现COM服务器”的部分。如果您对使用Python的Windows编程感兴趣,那么整本书就非常值得一读,尽管它现在已经显示了它的年代。

+1

感谢Ryan, 我想我会采取懒惰的方式,并将输出写入文本文件 - 我可以用我的Python脚本来获取。以前我没有想过这是一种选择。 – 2009-12-14 05:12:36

0

如果你写入标准输出会发生什么?或者:

print "Hello, world!" 

或:

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

甚至:

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

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

+1

我可能没有很好地解释我自己。我试图让Excel宏写入标准输出,而不是Python脚本。我只是使用Python来驱动COM接口。 – 2009-12-12 15:34:58

0

你几乎可以肯定必须使用Win32 API才能在这里找到任何地方。 Redirect stdout to an edit control (Win32)这个问题涉及到在GUI应用程序中使用stdin/stdout。不幸的是,提问者还没有解决他们的问题。

我对Windows中的什么机制支持stdin/stdout感兴趣。与它在Unix中的角色相比,它看起来非常像二等公民。

1

你可以使用VB6写一个VB6和读取标准输出,但是用Excel和VBA创建一个控制台应用程序?我不确定这是可能的。

我发现了一个简单的Python COM example,你可能已经调查过了。你可以让你的宏只是创建一个表单写入一个单元格,并让Python对这个单元格进行轮询? 你也可以通过Err.Raise() ......或者更糟糕的情况下使用环境变量来引发自定义错误......这些会比启动控制台更好。

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

还有一个Python DDE library以及severalexamples。一个警告;我记得任何DDE编码都是一个巨大的痛苦,并且依赖于一个名为DDESpy的工具。我很惊讶你不能通过COM来做你想做的事情,所以我想再调查一下,然后转向DDE