【问题标题】:How to call python script on excel vba?如何在excel vba上调用python脚本?
【发布时间】:2013-08-10 17:28:38
【问题描述】:

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


【解决方案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>")

&lt;&gt; 中的所有详细信息都将提供。 &lt;&gt; - 表示可变字段

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

【讨论】:

  • 我已经试过了。它启动 python 解释器,但什么也不做。我相信“shell”只运行 exe 文件,不允许我运行我的脚本。
  • 对不起,我不知道我之前做错了什么。它现在起作用了。非常感谢!我用过:RetVal = Shell("C:\python27\python.exe C:\Python27\CallOptimizer.py")
  • @EgeOzlem 您能否分享一个您从 VBA 执行的 Python 脚本示例?以及它返回到 VBA 调用的内容是什么?
  • 认为它可以工作,但是当从 VBA 宏运行时,python 程序不会产生预期的输出。它独立工作正常。知道我是否可以捕获 python 程序的输出吗??
  • 如何使用 Shell 调用函数并传递参数?
【解决方案2】:

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

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

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

如果您不介意付款,这看起来不错

https://datanitro.com/product.html

我没用过


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

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

【讨论】:

  • 感谢您的建议。我不能完全放弃 excel,因为这个项目对时间很敏感,python 代码是由其他人开发的,我需要为这段代码开发一个简单的接口,而且我对 Python 没有经验。对我来说最好的方法是使用 VBA。也许,将来我可能会考虑这一点。不过还是谢谢。
  • 我可以推荐 DataNitro。优秀的集成。虽然有点贵
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    试试这个:

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

    &lt;full path to your python script&gt;替换为完整路径

    【讨论】:

    • 应该说 RetVal = Shell("python.exe ",vbNormalFocus) 并将 替换为脚本的完整路径。
    【解决方案5】:

    此代码将起作用:

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

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

    【讨论】:

    • 感谢您的回答。但是,如果您能提供一点解释,而不仅仅是代码,它将得到改进。
    • ActiveWorkbook.Path 返回工作簿的当前目录。 shell命令通过Windows的cmc打开文件。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      ChDir ActiveWorkbook.Path
      

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

      【讨论】:

        【解决方案8】:

        我刚刚看到这个旧帖子。上面列出的任何内容都没有真正为我工作。我测试了下面的脚本,它在我的系统上运行良好。在这里分享,是为了让我之后来到这里的其他人受益。

        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
        

        【讨论】:

        • 使用三重双引号 """Path""" 处理文件夹路径中的空格要好得多,感谢脚本。
        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-23
            • 2021-04-23
            • 2012-10-19
            • 2014-01-14
            • 2020-05-24
            • 1970-01-01
            • 2011-06-01
            • 1970-01-01
            相关资源
            最近更新 更多