如何在 Excel VBA 上调用 Python 脚本?
- 2025-02-18 09:23:00
- admin 原创
- 85
问题描述:
我正在尝试在 VBA 上调用 Python 脚本,但我对此还很陌生。
我尝试使用 py2exe 将主脚本转换为 EXE 文件,然后从 VBA(shell)调用它,但主脚本调用其他脚本,因此变得复杂,我把它搞乱了(我的 EXE 文件无法运行)。此外,主脚本是一个大文件,我不想对其进行大量修改。
底线是,有没有办法从 Excel VBA 调用主脚本,而无需将脚本转换为 EXE 文件?
到目前为止,我尝试过:
RetVal = Shell("C:python27python.exe " & "import " & "C:\\\" & "MainScriptFile")
它启动了 python.exe,但没有执行任何其他操作。然后我尝试:
RetVal = Shell("C:WindowsSystem32cmd.exe " & "python " & "C:\\Python27\\hello.py")
它启动了命令提示符,但甚至没有启动 Python 解释器。
PS:我查看了论坛中所有相关问题,但它们并没有解决我的问题。
解决方案 1:
尝试一下:
RetVal = Shell("<full path to python.exe> " & "<full path to your python script>")
或者,如果 Python 脚本与工作簿位于同一文件夹中,那么您可以尝试:
RetVal = Shell("<full path to python.exe> " & ActiveWorkBook.Path & "<python script name>")
<>
必须提供其中的所有详细信息。-<>
表示可更改的字段
我想这应该可行。但是话又说回来,如果您的脚本要调用位于不同文件夹中的其他文件,除非您的脚本已正确处理它,否则可能会导致错误。
解决方案 2:
前面列出的答案对我来说都不起作用。我测试了下面的脚本,它在我的系统上运行良好。
Sub RunPython()
Dim objShell As Object
Dim PythonExe, PythonScript As String
Set objShell = VBA.CreateObject("Wscript.Shell")
PythonExe = """C:your_pathPythonPython38python.exe"""
PythonScript = "C:your_pathrom_vba.py"
objShell.Run PythonExe & PythonScript
End Sub
解决方案 3:
有几种方法可以解决这个问题。
Pyinx - 一个非常轻量级的工具,允许您从 Excel 进程空间内调用 Python。
我几年前就使用过这个(当时它正在积极开发中),效果很好。
如果你不介意付钱的话,这看起来不错:
https://dataninto.com/product.html
但我从来没有用过它。
但是如果你已经在用 Python 编写代码,也许你可以完全放弃 Excel,用纯 Python 完成所有工作?维护一个代码库 (Python) 比维护两个代码库 (Python + 任何 Excel 覆盖) 要容易得多。
如果您确实需要将数据输出到 Excel,Python 中也有一些非常好的工具可用于此。
解决方案 4:
对于那些不明白为什么在从 VBA 调用 shell 命令后,窗口会闪烁并消失而没有执行 Python 脚本应该执行的任何操作的人来说:
在我的程序中
Sub runpython()
Dim Ret_Val
args = """F:my folderhelloworld.py"""
Ret_Val = Shell("C:Users/usernameAppDataLocalProgramsPythonPython36python.exe " & " " & args, vbNormalFocus)
If Ret_Val = 0 Then
MsgBox "Couldn't run python script!", vbOKOnly
End If
End Sub
在行 args = """F:\my folder\helloworld.py""" 中,我必须使用三引号才能使其工作。如果我只使用常规引号,例如:args = "F:\my folder\helloworld.py",程序将无法运行。原因是路径(我的文件夹)中有一个空格。如果路径中有空格,在 VBA 中,您需要使用三引号。
解决方案 5:
该代码将起作用:
your_path= ActiveWorkbook.Path & "your_python_file.py"
Shell "RunDll32.Exe Url.Dll,FileProtocolHandler " & your_path, vbNormalFocus
ActiveWorkbook.Path 返回工作簿的当前目录。shell命令通过Windows的shell打开文件。
解决方案 6:
您还可以尝试ExcelPython,它允许您操作 Python 对象并从 VBA 调用代码。
解决方案 7:
尝试一下:
retVal = Shell("python.exe <full path to your python script>", vbNormalFocus)
替换<full path to your python script>
为完整路径
解决方案 8:
如果其他人遇到该问题,请确保您的脚本不包含任何相对路径引用,因为它在从 VBA 运行时将不起作用。
解决方案 9:
对于那些不明白为什么窗口会闪烁然后消失而不执行任何操作的人来说,问题可能与 Python 脚本中的 RELATIVE 路径有关。例如,您使用了“。”。
即使 Python 脚本和 Excel 工作簿位于同一目录中,当前目录仍可能不同。如果您不想修改代码以将其更改为绝对路径。只需在运行 Python 脚本之前更改当前的 Excel 目录即可:
ChDir ActiveWorkbook.Path
我这里只是举个例子。如果确实出现了闪烁,首先要检查的问题之一就是当前的工作目录。
解决方案 10:
ChDir "<Python script path>"
是我的解决方案。我使用Microsoft Word中的 VBA来启动 Python 3 脚本。
解决方案 11:
就我的情况而言,由于我的脚本与Microsoft Access文档位于不同的目录中,并且在该脚本中我从其他脚本导入变量,因此我必须先更改目录。然后我才能正确使用 shell 函数。
ChDir "C:Usersdirectory_where_the_script_is"
Call Shell("C:Users...python.exe " & "your_script_name.py", 1)
解决方案 12:
对我来说这是行不通的:
RetVal = Shell("<full path to python.exe>" & ActiveWorkBook.Path & "<Python script name>")
对我来说这是:
RetVal = Shell("python3" & " " & "C:acxyz.py")
解决方案 13:
我认为先前的答案有一个灾难性的问题:
运行宏后,cmd
窗口会立即自动关闭。如果输出不符合预期,您将完全没有调试信息。
最后,我找到了一种更好的方法,在这种情况下,cmd
窗口保持打开状态并显示所有信息(print
Python 的)和error log
。
代码如下:
Sub RunPythonScript()
cwd = ActiveWorkbook.Path ' Current working directory
workbookName = ActiveWorkbook.Name
pythonScriptName = "main.py"
workbookNameWithPath = cwd & "\" & workbookName
pythonScriptNameWithPath = cwd & "\" & pythonScriptName
pythonExePath = "C:UsersUSERNAMEAppDataLocalProgramsPythonPython39python.exe" ' Change path as output of "where python"
Shell "cmd.exe /k """"" & pythonExePath & """ """ & pythonScriptNameWithPath & """""", vbNormalFocus
End Sub
扫码咨询,免费领取项目管理大礼包!