【问题标题】:Run Python script through Excel VBA通过 Excel VBA 运行 Python 脚本
【发布时间】:2021-07-09 07:00:45
【问题描述】:

我无法从 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 执行器窗口中。

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

【问题讨论】:

    标签: python excel vba connection


    【解决方案1】:

    解决了!!我不明白为什么,但是拆分 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链接。
    【解决方案2】:

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

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

    Further 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"
    

    两个字符串之间没有空格,实际上应该是:

    "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
    

    【讨论】:

    • 感谢您回答我!但不幸的是,即使你的代码版本也不适合我.. :((
    • @CarloCortellini Shell Command 工作吗?
    猜你喜欢
    • 2018-12-19
    • 2014-01-05
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多