【发布时间】:2023-04-03 19:53:02
【问题描述】:
我知道如何在 Windows(7 或 10)的 MS Word 中使用 vba 来运行 python 脚本。这是一个例子:
RegExpPatrn = "[RegExp search string]"
PythonScriptFullName = Chr(34) & "[PythonScriptFullname.py]" & Chr(34)
PyExe = "C:\Python27\python2.7.exe"
CmdLin = PyExe & " " & PythonScriptFullName & " " & RegExpPatrn
Set objWshShell = CreateObject("WScript.Shell")
objWshShell.Run strCmdLin01, 1, True
但我不知道如何将 Python 脚本的结果(例如,正则表达式文件搜索)返回给调用 Python 脚本的 vba 宏。
如果有人有任何建议,我将不胜感激。
我读过“管道”,但我不明白该怎么做。
我已经阅读了有关使用环境变量的信息,但我无法使用 python 创建一个环境变量,我可以在 python 脚本运行后检索该环境变量。
如果有人有任何建议,我将不胜感激。
马克
。
.
**
SOLUTION 于 2016 年 11 月 10 日添加,感谢 user235218 和 Tim Williams:
**
以下是:
-
我的python脚本;
-
我的 vba 子版本;和
-
我的 vba 函数版本。
这是我的 python 脚本:
print("This is my Python script's output")
这是我的 vba 子版本:
Sub subTestfnShellOutput()
Dim strPythonPath As String
Dim strPyScript As String
Dim strCmd As String
strPythonPath = "C:\Python27\python2.7.exe"
strPyScript = "C:\Apps\UtilitiesByMarc\Test_2016-11-09_StackOverFlowSoution_aaa_.py"
strCmd = strPythonPath & " " & strPyScript
'Debug.Print fnShellOutput("python D:\temp\test.py") ''>> hello world
MsgBox fnShellOutput(strCmd) ''>> hello world
End Sub 'subTestfnShellOutput
这是我的 vba 函数版本:
Function fnShellOutput(cmd As String) As String
' https://stackoverflow.com/questions/39516875/return-result-from-python-to-vba
Dim oShell As Object, oCmd As String
Dim oExec As Object, oOutput As Object
Dim arg As Variant
Dim s As String, sLine As String
Set oShell = CreateObject("WScript.Shell")
Set oExec = oShell.Exec(cmd)
Set oOutput = oExec.StdOut
While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbNewLine
Wend
"""November 10, 2016 Addendum: It works now that I replaced 'ShellOutput = s' with
'fnShellOutput = s'"""
fnShellOutput = s
Set oOutput = Nothing
Set oExec = Nothing
Set oShell = Nothing
End Function 'fnShellOutput
【问题讨论】:
-
可能最简单的实现是修改 python 脚本以在已知位置写入文本文件,然后让 VBA 查询该文件。但这在分布式环境中变得难以实现。正确的方法是将您的python程序注册为具有可访问方法(基本上是API)的COM服务器,然后您的VBA可以创建该对象的实例并调用它的方法,这些方法直接返回给调用者(VBA )。
-
谢谢。在进行一些研究以了解将 python 程序注册为 COM 服务器意味着什么时,我遇到了 Pyro4,它表面上是一个库,它使您能够构建应用程序,其中对象可以通过网络相互通信,只需最少编程努力。如果我不知道在哪里可以看到显示如何将 python 程序注册为 COM 服务器,然后按照您的指示使用它的示例,我可以稍后与您联系吗?
-
你的函数被称为
fnShellOutput
,但你使用ShellOutput
设置返回值 -
如果该更改无法解决问题,那么您需要准确解释运行版本时会发生什么。
-
成功了!!!!!!非常感谢!!!!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:返回 Word vba 由 Windows 中的 vba 宏调用的 python 脚本的结果 - Python技术站