通过Excel VBA运行Python脚本

3 人关注

我在从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

The python code is the following.

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

当我运行VBA时,Python执行器打开了,但它马上就关闭了,没有实际执行脚本。换句话说,"hello""hello, press enter"都没有出现在python执行器的窗口中,它突然关闭了。

我确信 python.exe 和 python 脚本的路径是正确的。我在""""""中都试过了,在这两种情况下都不能工作。很明显(这很简单!)如果我直接从Python执行器中运行,Python脚本就能工作。

python
excel
vba
connection
Carlo Cortellini
Carlo Cortellini
发布于 2021-07-09
2 个回答
Carlo Cortellini
Carlo Cortellini
发布于 2021-07-09
已采纳
0 人赞同

解决了!!我不明白为什么,但是把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ᴇʜ ,我会把你的回答评为积极的,因为你已经很客气了!!。

只需检查它是否在没有 objShell.Run PythonExe 的情况下工作。当然,你也可以接受你自己的答案作为解决方案(我想在1天之后)。
那么,这意味着它能工作,因为windows将 .py 文件类型与python自动链接。
Pᴇʜ
Pᴇʜ
发布于 2021-07-09
0 人赞同

你可能需要在 PythonExe & " " & PythonScript 之间加一个空格。所以你运行的命令是 "C:\…\python3.exe" "C:\…\BlackBoxAbsorbers.py" ,在程序路径和python脚本之间有空格。

还要注意, Dim PythonExe, PythonScript As String 只声明了 PythonScript As String ,而没有声明 PythonExe As Variant 。在VBA中,你需要指定一个类型给 every 变量。 Dim PythonExe As String, PythonScript As String 或默认为 Variant !

此外, objShell.Run PythonExe & PythonScript 是不能正确调试的。我建议把命令放到一个变量中,这样你就能把它打印在即时窗口中进行调试。

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"

而且在2根弦之间没有空格,实际上应该有的。

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

So I recommend:

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