使用 XLwings 将变量从 Excel 传递到 Python

Passing a variable from Excel to Python with XLwings

我正在尝试在 Python 中编写一个简单的用户定义函数,我通过 XlwingsExcel 传递一个值。我 运行 浏览了一些带有加载项的示例,您需要导入用户定义的函数,但这似乎过于复杂。

为什么我的示例不起作用?

VBA:

Function Hello(name As String) As String
    RunPython ("import Test; Test.sayhi(name)")
End Function

Python (Test.py):

from xlwings import Workbook, Range

def sayhi(name):
    wb = Workbook.caller()
    return 'Hello {}'.format(name)

错误:

NameError: name 'name' is not defined

运行Python() 中的文本应该是有效的 python 脚本。所以来自 "Tim Williams" 的评论是一个快速的解决方案。您只需要注意避免 name 变量中的 ' 字符破坏 python 脚本。

如果你需要大量编写UDF(User Defined Function),或者需要传值得到输出然后通过[=43=处理结果],试试ExcelPython 而不是 Xlwings。

请注意,ExcelPython 和 Xlwings 可以一起使用,您可以同时使用它们而不会发生冲突。

我认为你最好玩这个例子来理解其中的区别。我的理解仅限于我的知识,这可能不正确。

总结差异:

  • ExcelPython需要安装安装程序,在UDF中很好,如果你想传入和传出参数,函数会缓存在内存中,所以稍后电话会很快。
  • Xlwings 更简单,只需添加 VBA 模块,无需安装程序。它每次在后台触发Python到运行脚本(每次调用启动一个新进程),在脚本中你可以通过COM操作(read/write)Excel。

我一开始也有同样的问题,但后来我发现在Excel端(intellisense)使用VBA加上UDF上的ExcelPython(简单处理和 return 数据返回)是一个很好的组合,所以我认为 ExcelPython 只是我需要的。

如前所述,2个组件没有冲突,可以同时拥有。如果2位作者也同意的话,把他们结合起来也是个不错的主意。

确保您提供的参数正确:

RunPython ("import Test; Test.sayhi('" &  name & "')")