【问题标题】:Writing to stdout from within a Microsoft VBA macro从 Microsoft VBA 宏中写入标准输出
【发布时间】:2010-12-25 17:46:40
【问题描述】:

我正在使用 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 应用程序中写入标准输出?还有其他我不知道的方法吗?

【问题讨论】:

    标签: python vba com excel stdout


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢瑞恩,我想我会采取懒惰的方式,并将输出写入文本文件 - 我可以使用我的 Python 脚本来获取它。这是我以前没有想到的选择。
    【解决方案2】:

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

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

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

    Python DDE libraryseveral examples。一个警告;我记得任何 DDE 编码都是一个巨大的痛苦,并且很大程度上依赖于一个名为 DDESpy 的工具。我很惊讶你不能通过 COM 做你需要的事情,所以我会在转向 DDE 之前进行更多调查。

    【讨论】:

      【解决方案3】:

      您几乎可以肯定必须使用 Win32 API 才能到达这里。问题Redirect stdout to an edit control (Win32) 指的是在GUI 应用程序中使用标准输入/标准输出。不幸的是,提问者还没有解决他们的问题。

      我对 Windows 中支持标准输入/标准输出的机制感兴趣。与它在 Unix 中的角色相比,它似乎是一个二等公民。

      【讨论】:

        【解决方案4】:

        如果你写到标准输出会发生什么?要么:

        print "Hello, world!"
        

        或:

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

        甚至:

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

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

        【讨论】:

        • 我可能没有很好地解释自己。我试图让 Excel 宏写入标准输出,而不是 Python 脚本。我只是使用 Python 作为驱动 COM 接口的一种手段。
        猜你喜欢
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 2019-09-01
        • 1970-01-01
        • 2012-01-25
        相关资源
        最近更新 更多