相关文章推荐
打盹的针织衫  ·  bootstrap-multiselect ...·  2 年前    · 
玩滑板的野马  ·  TypeError: first ...·  2 年前    · 

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

40 人关注

试图在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。

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

python
excel
vba
shell
py2exe
Ege Ozlem
Ege Ozlem
发布于 2013-08-09
11 个回答
Rajgopal C
Rajgopal C
发布于 2022-02-15
已采纳
0 人赞同

Try this:

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- 表示可改变的领域

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

我已经试过这些。它启动了Python解释器,但没有做其他事情。我相信 "shell "只运行exe文件,不允许我运行我的脚本。
对不起,我不知道我之前做错了什么。现在成功了。非常感谢! 我使用了RetVal = Shell("C:\python27\python.exe C:\Python27\CallOptimizer.py")
@EgeOzlem 你能不能分享一下你在VBA中执行的Python脚本的样本,以及它对VBA调用的回报?
我认为它是有效的,但是当从VBA宏中运行时,Python程序没有产生预期的输出。它独立运行时很好。 有什么办法能让我捕捉到python程序的输出吗?
我如何使用 Shell 调用带有传递参数的函数?
ASH
ASH
发布于 2022-02-15
0 人赞同

我刚刚看到了这个旧帖子。 上面列出的东西对我来说其实都没有用。 我测试了下面的脚本,它在我的系统上运行良好。 在此分享,以利于那些在我之后来到这个地方的其他人。

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
    
WLiu
用三倍的双引号"""Path"""来处理文件夹路径中的空格要好得多,谢谢你的脚本。
Brad
Brad
发布于 2022-02-15
0 人赞同

有几种方法来解决这个问题

Pyinx - 一个相当轻量级的工具,允许你从excel进程空间内调用Python。 http://code.google.com/p/pyinex/

几年前我曾用过这个方法(那时它正在积极开发),效果相当好

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

https://datanitro.com/product.html

I've never used it though

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

如果你真的要把你的数据输出到excel中,甚至有一些相当好的Python工具可以做到。 如果这样做效果会更好,请告诉我,我会得到链接。

谢谢你的建议。我不能完全放弃excel,因为这个项目时间紧迫,python代码是由别人开发的,我需要为这个代码开发一个简单的界面,而我对Python没有经验。对我来说,最好的方法是使用VBA。也许,在未来我可能会考虑这个问题。不过还是要谢谢你。
Joop
我可以推荐DataNitro。 优秀的整合。 不过价格有点贵
Omi
Omi
发布于 2022-02-15
0 人赞同

对于那些想知道为什么在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中,你需要使用三倍引号。

Pablo Vilas
Pablo Vilas
发布于 2022-02-15
0 人赞同

This code will works:

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

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

谢谢你的回答。 不过,如果你能提供一点解释,而不仅仅是代码,那就更好了。
ActiveWorkbook.Path返回工作簿的当前目录。shell命令通过Windows的cmc打开文件。
ehremo
ehremo
发布于 2022-02-15
0 人赞同

你也可以尝试 ExcelPython 它允许你操作Python对象并从VBA中调用代码。

T Roc
T Roc
发布于 2022-02-15
0 人赞同

Try this:

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

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

should say RetVal = Shell("python.exe <full path to python script>",vbNormalFocus) and replace <full path to python script> with the full path to your script.
Saul Han
Saul Han
发布于 2022-02-15
0 人赞同

对于那些想知道为什么一个窗口闪了一下就消失而不做任何事情的人来说,这个问题可能与你的Python脚本中的相对路径有关,例如,你使用了".\"。即使Python脚本和Excel工作簿在同一个目录下,当前目录也可能不同。如果你不想修改你的代码,把它改成绝对路径。只要在运行Python脚本之前通过以下方式改变你的当前Excel目录即可。

ChDir ActiveWorkbook.Path

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

Dede95
Dede95
发布于 2022-02-15
0 人赞同

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

julioq
julioq
发布于 2022-02-15
0 人赞同

在我的例子中,由于我的脚本和我的ms access文档在不同的目录下,而且在该脚本中我导入了其他脚本的变量,所以我不得不先改变目录。然后我就可以正确地使用shell函数了。

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