如何在 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>")

<>
内的所有细节都将被提供。
<>
- 表示可变字段

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


21
投票

我刚看到这个旧帖子。上面列出的任何东西实际上对我都没有用。我测试了下面的脚本,它在我的系统上运行良好。在这里分享,以造福于我之后来到这里的其他人。

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 http://code.google.com/p/pyinex/

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

如果你不介意付钱,这看起来很不错

https://datanitro.com/product.html

虽然我从来没有用过它


不过如果你已经在用 Python 编写代码,也许你可以完全放弃 excel 并在纯 python 中做所有事情?维护一个代码库(python)比维护 2 个(python + 你拥有的任何 excel 覆盖)要容易得多。

如果你真的必须将数据输出到 excel 中,Python 中甚至有一些非常好的工具。如果这样效果更好,请告诉我,我会获取链接。


2
投票

对于那些想知道为什么在从 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:\my folder\helloworld.py""" 行中,我必须使用三重引号才能工作。如果我只使用常规引号,例如:args = "F:\my folder\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 Workbook 在同一个目录中,Current Directory 仍然可能不同。如果不想修改代码就改成绝对路径。在运行 python 脚本之前只需更改当前的 Excel 目录:

ChDir ActiveWorkbook.Path

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


0
投票

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


0
投票

就我而言,因为我的脚本与我的 ms 访问文档位于不同的目录中,并且在该脚本中我从其他脚本导入变量,所以我必须先更改目录。然后我就可以正确使用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.