使用XLwings将variables从Excel传递给Python

我想在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 

确保你正确地提供了参数:

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

RunPython()中的文本应该是一个有效的Python脚本。 所以“Tim Williams”的评论是一个快速的解决scheme。 你只需要小心避免在namevariables中的字符来破坏python脚本。

如果您需要大量编写UDF(用户定义函数),或者需要传递值来获取输出,然后通过VBA处理结果,请尝试使用ExcelPython而不是Xlwings。

请注意,ExcelPython和Xlwings可以一起工作,你可以没有冲突。

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

总结不同之处:

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

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

如前所述,这两个组件没有冲突,你可以同时拥有这两个组件。 如果2位作者也同意,将它们合并是一个好主意。