【问题标题】:Excel VBA to start shell script in background with specified environmentExcel VBA在指定环境的后台启动shell脚本
【发布时间】:2025-12-30 12:55:11
【问题描述】:

我想使用 Excel 宏启动 Python 脚本以在后台运行。

我必须能够指定它使用系统 PATH(我不想假设 python 安装在哪里)以及一个特定的工作目录,它会在其中找到它需要的其他文件。

目前我使用以下,但这会阻止 Excel 进程,直到它完成。

Sub RunPython()
    shellScript = "python Daily.py"
    Dim wsh As Object
    Set wsh = VBA.CreateObject("WScript.Shell")
    wsh.CurrentDirectory = Application.ThisWorkbook.Path
    Set wshSystemEnv = wsh.Environment("Process")
    Set WshShellExec = wsh.exec(shellScript)
    Range("C7").Value = WshShellExec.StdErr.ReadAll ' Show error, if any
End Sub

如何在后台进程中运行它?

如果有方法在进程完成后调用另一个 VBA 子例程,则加分!

【问题讨论】:

标签: vba excel shell wsh


【解决方案1】:

嗯,这里的问题是 Excel VBA 不支持多线程,这意味着所有代码都只能线性运行!而且因为 shell 应该返回一些你想写入单元格的东西,所以它当然要等到 python 脚本完成。所以运行这段代码的 Excel 实例会一直等待 py 脚本。

建议的解决方法
使用Shell "python Daily.py" 运行脚本并将输出重定向到一个文件中:Shell "python Daily.py >output.txt"

然后运行一个循环检查文件是否存在

Do
    DoEvents 'make Excel responsive
Loop While Not FileExists("output.txt")

例如使用这个函数

Function FileExists(ByVal fName As String) As Boolean
    On Error Resume Next
    FileExists = ((GetAttr(fName) And vbDirectory) <> vbDirectory)
End Function    

请注意,当该循环运行时,您将无法运行另一个宏,但 Excel 可以响应。

否则,您可以使用How to have vba execute every 10 minutes? 来表示。每 1 分钟检查一次文件是否存在,然后运行一个过程。

在运行 py 脚本之前不要忘记删除 output.txt 文件。

【讨论】: