如何在excel vba上调用python脚本?

时间:2013-08-08 20:31:36

标签: python shell excel-vba py2exe vba

尝试在Vba上调用python脚本,我是一个新手。我尝试使用py2exe将主脚本转换为exe,然后从VBA(shell)调用它,但主脚本调用其他脚本,因此它变得复杂,我搞砸了(我的exe不起作用)。此外,主脚本是一个大文件,我不想修改它。

Bottomline,有没有办法从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。

P.S。我在论坛上检查了所有相关问题,他们没有解决我的问题。

10 个答案:

答案 0 :(得分:23)

试试这个:

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

<>中的所有详细信息都将被提供。 <> - 表示可更改字段

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

答案 1 :(得分:7)

我刚遇到这个旧帖子。上面列出的所有内容对我来说都不起作用。我测试了以下脚本,并且在我的系统上运行良好。在这里分享,以造福于我之后的其他人。

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

答案 2 :(得分:5)

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

Pyinx - 一个非常轻量级的工具,允许您通过excel进程空间调用Python http://code.google.com/p/pyinex/

几年前我曾经使用过这个(当它被积极开发时),并且效果很好

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

https://datanitro.com/product.html

我从未使用过它


虽然如果你已经用Python编写,也许你可以完全放弃excel并用纯python做一切?维护一个代码库(python)而不是2(python +你所拥有的任何excel叠加层)要容易得多。

如果你真的必须将你的数据输出到excel中,那么在Python中甚至还有一些非常好的工具。如果这可能更好,请告诉我,我会得到链接。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

对于那些想知道为什么窗口闪烁并在没有执行任何操作的情况下消失的人来说,python脚本是在从VBA调用shell命令之后要做的: 在我的程序中

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中,您需要使用三引号。

答案 5 :(得分:0)

对于那些想知道为什么窗口闪烁而不执行任何操作的人来说,问题可能与Python脚本中的RELATIVE路径有关。例如您使用了“。\”。即使Python脚本和Excel工作簿在同一目录中,当前目录也可能不同。如果您不想修改代码以将其更改为绝对路径。只需通过以下方式运行python脚本,即可更改当前的Excel目录:

ChDir ActiveWorkbook.Path

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:-1)

试试这个:

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

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

答案 9 :(得分:-1)

此代码将起作用:

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