运行 Python 脚本通过 Excel VBA

Run Python script through Excel VBA

我在 运行 从 Excel VBA 中创建 python 脚本时遇到问题。这是 VBA 代码:

Sub RunPython()
    
    Dim objShell As Object
    Dim PythonExe, PythonScript As String
    Set objShell = VBA.CreateObject("Wscript.Shell")
    PythonExe = """C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""" 
    PythonScript = """C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"""  
    objShell.Run PythonExe & PythonScript

End Sub

python代码如下。

print("hello")
input("hello, press enter")

当我 运行 VBA 时,python 执行器打开但它立即关闭而没有实际执行脚本。也就是说,"hello""hello, press enter"都没有出现在python执行器window上,突然关闭

我确定 python.exe 和 python 脚本的路径是正确的。我用 """""" 都试过了,但在这两种情况下都不起作用。显然(超级简单!)如果我直接从 python 执行器运行 python 脚本工作。

您可能需要 PythonExe & " " & PythonScript 之间的 space。因此,您 运行 的命令是 "C:\…\python3.exe" "C:\…\BlackBoxAbsorbers.py",在程序路径和 python 脚本之间带有 space。

另请注意 Dim PythonExe, PythonScript As String 仅声明 PythonScript As StringPythonExe As Variant。在 VBA 中,您需要为 每个 变量指定一个类型:Dim PythonExe As String, PythonScript As String 或者默认为 Variant

此外 objShell.Run PythonExe & PythonScript 无法正确调试。我建议将命令放入一个变量中,这样您就可以立即打印它 window 以进行调试:

Dim Command As String
Command = PythonExe & PythonScript

Debug.Print Command

objShell.Run Command 

如果执行此操作,您将看到命令的输出为:

"C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"

并且两个字符串之间没有 space,实际上应该是:

"C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe" "C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"

所以我推荐:

Public Sub RunPython()    
    Dim objShell As Object
    Set objShell = VBA.CreateObject("Wscript.Shell")

    Dim PythonExe As String
    PythonExe = """C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""" 

    Dim PythonScript As String
    PythonScript = """C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"""  

    Dim Command As String
    Command = PythonExe & " " & PythonScript

    objShell.Run Command
End Sub

已解决!!我不明白为什么,但是拆分 objShell.Run PythonExe 和 objShell.Run PythonScript 它工作正常!像这样:

Public Sub RunPython()    
    Dim objShell As Object
    Set objShell = VBA.CreateObject("Wscript.Shell")

    Dim PythonExe As String
    PythonExe = """C:\Users\carlo\AppData\Local\Microsoft\WindowsApps\python3.exe""" 

    Dim PythonScript As String
    PythonScript = """C:\Users\carlo\Desktop\MSc_Thesis\ML applications\BlackBox\BlackBoxAbsorbers.py"""  
    
     objShell.Run PythonExe
     objShell.Run PythonScript

End Sub

无论如何谢谢@Pᴇʜ,我会给你的回答好评,因为你一直很友善!