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

2025-02-18 09:23:00
admin
原创
85
摘要:问题描述:我正在尝试在 VBA 上调用 Python 脚本,但我对此还很陌生。我尝试使用 py2exe 将主脚本转换为 EXE 文件,然后从 VBA(shell)调用它,但主脚本调用其他脚本,因此变得复杂,我把它搞乱了(我的 EXE 文件无法运行)。此外,主脚本是一个大文件,我不想对其进行大量修改。底线是,有...

问题描述:

我正在尝试在 VBA 上调用 Python 脚本,但我对此还很陌生。

我尝试使用 py2exe 将主脚本转换为 EXE 文件,然后从 VBA(shell)调用它,但主脚本调用其他脚本,因此变得复杂,我把它搞乱了(我的 EXE 文件无法运行)。此外,主脚本是一个大文件,我不想对其进行大量修改。

底线是,有没有办法从 Excel VBA 调用主脚本,而无需将脚本转换为 EXE 文件?

到目前为止,我尝试过:

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

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

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

它启动了命令提示符,但甚至没有启动 Python 解释器。

PS:我查看了论坛中所有相关问题,但它们并没有解决我的问题。


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

<>必须提供其中的所有详细信息。-<>表示可更改的字段

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

解决方案 2:

前面列出的答案对我来说都不起作用。我测试了下面的脚本,它在我的系统上运行良好。

Sub RunPython()

    Dim objShell As Object
    Dim PythonExe, PythonScript As String

    Set objShell = VBA.CreateObject("Wscript.Shell")

    PythonExe = """C:your_pathPythonPython38python.exe"""
    PythonScript = "C:your_pathrom_vba.py"

    objShell.Run PythonExe & PythonScript

End Sub

解决方案 3:

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

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

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

如果你不介意付钱的话,这看起来不错:

https://dataninto.com/product.html

但我从来没有用过它。


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

如果您确实需要将数据输出到 Excel,Python 中也有一些非常好的工具可用于此。

解决方案 4:

对于那些不明白为什么在从 VBA 调用 shell 命令后,窗口会闪烁并消失而没有执行 Python 脚本应该执行的任何操作的人来说:

在我的程序中

Sub runpython()

    Dim Ret_Val
    args = """F:my folderhelloworld.py"""
    Ret_Val = Shell("C:Users/usernameAppDataLocalProgramsPythonPython36python.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:

该代码将起作用:

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

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

解决方案 6:

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

解决方案 7:

尝试一下:

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

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

解决方案 8:

如果其他人遇到该问题,请确保您的脚本不包含任何相对路径引用,因为它在从 VBA 运行时将不起作用。

解决方案 9:

对于那些不明白为什么窗口会闪烁然后消失而不执行任何操作的人来说,问题可能与 Python 脚本中的 RELATIVE 路径有关。例如,您使用了“。”。

即使 Python 脚本和 Excel 工作簿位于同一目录中,当前目录仍可能不同。如果您不想修改代码以将其更改为绝对路径。只需在运行 Python 脚本之前更改当前的 Excel 目录即可:

ChDir ActiveWorkbook.Path

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

解决方案 10:

ChDir "<Python script path>"是我的解决方案。我使用Microsoft Word中的 VBA来启动 Python 3 脚本。

解决方案 11:

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

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

解决方案 12:

对我来说这是行不通的:

RetVal = Shell("<full path to python.exe>" & ActiveWorkBook.Path & "<Python script name>")

对我来说这是:

RetVal = Shell("python3" & " " & "C:acxyz.py")

解决方案 13:

我认为先前的答案有一个灾难性的问题:

运行宏后,cmd窗口会立即自动关闭。如果输出不符合预期,您将完全没有调试信息。

最后,我找到了一种更好的方法,在这种情况下,cmd窗口保持打开状态并显示所有信息(printPython 的)和error log

代码如下:

Sub RunPythonScript()
    cwd = ActiveWorkbook.Path ' Current working directory
    workbookName = ActiveWorkbook.Name
    pythonScriptName = "main.py"
    workbookNameWithPath = cwd & "\" & workbookName
    pythonScriptNameWithPath = cwd & "\" & pythonScriptName
    pythonExePath = "C:UsersUSERNAMEAppDataLocalProgramsPythonPython39python.exe" ' Change path as output of "where python"

    Shell "cmd.exe /k """"" & pythonExePath & """ """ & pythonScriptNameWithPath & """""", vbNormalFocus
End Sub
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2757  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1693  
  在全球化的浪潮下,企业的业务范围不断拓展,跨文化协作变得愈发普遍。不同文化背景的团队成员在合作过程中,由于语言、价值观、工作习惯等方面的差异,往往会面临诸多沟通挑战。而产品生命周期管理(PLM)系统作为企业管理产品全生命周期的重要工具,如何有效支持跨文化协作成为了关键问题。通过合理运用沟通策略,PLM系统能够在跨文化团...
plm是什么软件   15  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色,其中文档版本控制是确保产品数据准确性、完整性和可追溯性的关键环节。有效的文档版本控制能够避免因版本混乱导致的错误、重复工作以及沟通不畅等问题,提升企业整体的运营效率和产品质量。接下来,我们将深入探讨 PLM 系统实现文档版本控制的 6...
plm是什么意思   19  
  PLM(产品生命周期管理)项目管理旨在通过有效整合流程、数据和人员,优化产品从概念到退役的整个生命周期。在这个过程中,敏捷测试成为确保产品质量、加速交付的关键环节。敏捷测试强调快速反馈、持续改进以及与开发的紧密协作,对传统的测试流程提出了新的挑战与机遇。通过对测试流程的优化,能够更好地适应PLM项目的动态变化,提升产品...
plm管理系统   18  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用