如何在Excel VBA上调用Python脚本?

问题描述 投票:0回答:11

我正在尝试在 Vba 上调用 python 脚本,但我对此很陌生。

我尝试使用 py2exe 将主脚本转换为 exe,然后从 VBA(shell)调用它,但主脚本调用其他脚本,因此它变得复杂,我把它搞砸了(我的 exe 不起作用)。另外,主脚本文件很大,我不想修改太多。

底线,有没有办法从 excel vba 调用主脚本,而不将脚本转换为 exe 文件。

到目前为止,我尝试过:

RetVal = Shell("C:\python27\python.exe " & "import " & "C:\\" & "MainScriptFile")

它启动 python.exe,但不执行任何其他操作。然后我尝试了:

RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")

它启动命令提示符,但甚至不启动 python。

附注我查了论坛里所有的相关问题,都没有解决我的问题。

python excel vba shell py2exe
11个回答
39
投票

试试这个:

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

应提供

<>
内的所有详细信息。
<>
- 表示可更改字段

我想这应该可行。但话又说回来,如果您的脚本要调用不同文件夹中的其他文件,则可能会导致错误,除非您的脚本已正确处理它。


23
投票

我刚刚看到这篇旧帖子。上面列出的任何内容实际上对我都不起作用。我测试了下面的脚本,它在我的系统上运行良好。在此分享,以造福于我之后来到这个地方的其他人。

Sub RunPython()

Dim objShell As Object
Dim PythonExe, PythonScript As String
    
    Set objShell = VBA.CreateObject("Wscript.Shell")

    PythonExe = """C:\your_path\Python\Python38\python.exe"""
    PythonScript = "C:\your_path\from_vba.py"
    
    objShell.Run PythonExe & PythonScript
    
End Sub

5
投票

有几种方法可以解决这个问题。

Pyinx - 一个非常轻量级的工具,允许您从 Excel 进程空间内调用 Python。

我几年前就用过这个(当时它正在积极开发中)并且效果很好。

如果你不介意付钱,这看起来相当不错:

https://datanitro.com/product.html

不过我从来没用过。


虽然如果您已经在使用 Python 编写,也许您可以完全放弃 Excel 并使用纯 Python 来完成所有操作?维护一个代码库 (Python) 比维护两个代码库(Python + 无论您拥有什么 Excel 覆盖层)要容易得多。

如果您确实需要将数据输出到 Excel 中,Python 中甚至有一些非常好的工具。


3
投票

对于那些想知道为什么在从 VBA 调用 shell 命令后窗口闪烁并消失而没有执行 python 脚本应执行的任何操作的人: 在我的程序中

Sub runpython()

Dim Ret_Val
args = """F:\my folder\helloworld.py"""
Ret_Val = Shell("C:\Users\username\AppData\Local\Programs\Python\Python36\python.exe " & " " & args, vbNormalFocus)
If Ret_Val = 0 Then
   MsgBox "Couldn't run python script!", vbOKOnly
End If
End Sub

在 args = """F:\myfolder\helloworld.py""" 行中,我必须使用三引号才能使其工作。如果我只使用常规引号,例如: args = "F:\myfolder\helloworld.py" 程序将无法工作。原因是路径(我的文件夹)中有空格。如果路径中有空格,在VBA中,需要使用三引号。


2
投票

此代码将起作用:

 your_path= ActiveWorkbook.Path & "\your_python_file.py" 
 Shell "RunDll32.Exe Url.Dll,FileProtocolHandler " & your_path, vbNormalFocus 

ActiveWorkbook.Path 返回工作簿的当前目录。 shell命令通过Windows的shell打开文件。


0
投票

您还可以尝试ExcelPython,它允许您操作Python对象并从VBA调用代码。


0
投票

试试这个:

retVal = Shell("python.exe <full path to your python script>", vbNormalFocus)

<full path to your python script>
替换为完整路径


0
投票

对于那些想知道为什么窗口闪烁并没有执行任何操作就消失的人来说,问题可能与 Python 脚本中的相对路径有关。例如你用了“.\”。即使Python脚本和Excel工作簿位于同一目录中,当前目录仍然可能不同。如果你不想修改你的代码就将其改为绝对路径。只需在运行 python 脚本之前更改当前的 Excel 目录:

ChDir ActiveWorkbook.Path

我这里只是举个例子。如果确实出现闪存,首先要检查的问题之一是当前工作目录。


0
投票

ChDir "" 是我的解决方案。我使用 WORD 中的 vba 启动 python3 脚本。


0
投票

就我而言,由于我的脚本位于与 ms access 文档不同的目录中,并且在该脚本中我从其他脚本导入变量,因此我必须首先更改目录。这样我就可以正确使用shell函数了。

   ChDir "C:\Users\directory_where_the_script_is"
   Call Shell("C:\Users\...\python.exe " & "your_script_name.py", 1)

0
投票

对我来说这不起作用 RetVal = Shell(" " & ActiveWorkBook.Path & "")

对我来说:

RetVal = Shell("python3" & " " & "C:

© www.soinside.com 2019 - 2024. All rights reserved.