从Excel/VBA调用Python脚本

12 投票
6 回答
58809 浏览
提问于 2025-04-16 03:17

我有一段Python代码,它可以读取三个参数(标量)和一个文本文件,然后返回一个双精度向量。我想在VBA中写一个宏来调用这段Python代码,并把结果写入同一个Excel表格里。我想知道最简单的方法是什么,以下是我找到的一些方法:

  • 在VBA中调用shell()函数,但似乎获取返回值并不简单。

  • 把Python代码注册为COM对象,然后从VBA中调用它——我不知道怎么做,如果你有一些例子,那就太好了。

  • 在自定义工具箱中创建一个自定义工具,在VBA中创建一个地理处理对象,然后添加工具箱,这样我们就可以通过地理处理对象直接使用自定义工具,但我也不知道怎么做……

有没有什么建议?

6 个回答

3

这里有一个关于如何在Python和Excel之间使用的好链接:

continuum.io/using-excel

里面提到了几个工具,比如xlwings、DataNitro、ExPy、PyXLL、XLLoop、openpyxl、xlrd、xlsxwriter和xlwt。

我还发现ExcelPython正在积极开发中。

  1. https://github.com/ericremoreynolds/excelpython

2.

使用VBA和Python可以做到以下几点:

你可以编写Python脚本,输入数据并生成文本文件或从控制台输出。然后,VBA会准备好输入数据,调用已经编译好的Python脚本,并读取它的输出结果。

3.

你还可以考虑使用Google文档、OpenOffice或LibreOffice,这些都支持Python脚本。

这是假设你觉得使用COM或微软脚本接口的选项不够满足你的需求。


这不是免费的方法,但值得一提(在《福布斯》和《纽约时报》上都有报道):

https://datanitro.com


这对于商业用途不是免费的:

PyXLL - 这是一个Excel插件,可以让你在Excel中调用用Python编写的函数。

4

你需要把Python代码当作宏来调用吗?其实你可以在Python脚本中使用COM钩子,这样就可以直接控制Excel,而不需要使用其他语言。

import win32com.client

# Start Excel
xlApp = win32com.client.Dispatch( "Excel.Application" )
workbook = xlApp.Workbooks.Open( <some-file> )
sheet = workbook.Sheets( <some-sheet> )
sheet.Activate( )

# Get values
spam = sheet.Cells( 1, 1 ).Value

# Process values
...

# Write values
sheet.Cells( ..., ... ).Value = <result>

# Goodbye Excel
workbook.Save( )
workbook.Close( )
xlApp.Quit( )
17

请仔细按照以下步骤操作:

  1. 去Activestate网站下载 ActivePython 2.5.7 的安装包。
    我在使用2.6.x版本时遇到了DLL的问题。
  2. 在你的Windows电脑上安装它。
  3. 安装完成后,打开命令提示符,进入以下路径:

    C:\Python25\lib\site-packages\win32comext\axscript\client

  4. 执行 \> python pyscript.py,你应该会看到“Registered: Python”的消息。

  5. 打开Excel,进入工作表。

  6. 点击工具 > 宏 > Visual Basic编辑器。
  7. 添加对Microsoft Script控制的引用 alt text
  8. 添加一个新的用户表单。在用户表单中添加一个命令按钮。
  9. 切换到代码编辑器,插入以下代码:

    Dim WithEvents PyScript As MSScriptControl.ScriptControl

    Private Sub CommandButton1_Click()
       If PyScript Is Nothing Then
           Set PyScript = New MSScriptControl.ScriptControl
           PyScript.Language = "python"
           PyScript.AddObject "Sheet", Workbooks(1).Sheets(1)
           PyScript.AllowUI = True
       End If
       PyScript.ExecuteStatement "Sheet.cells(1,1).value='Hello'"
    End Sub
    

执行。享受这个过程,并根据需要进行扩展。

撰写回答