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

时间:2015-12-08 23:15:56

标签: python excel vba xlwings

我正在尝试在Python中编写一个简单的用户定义函数,我将值从Excel通过Xlwings传递给我。我遇到了一些带有加载项的示例,您需要导入用户定义的函数,但这看起来过于复杂。

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

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

2 个答案:

答案 0 :(得分:1)

确保您正确提供参数:

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

答案 1 :(得分:0)

RunPython()中的文本应该是一个有效的python脚本。所以“蒂姆威廉姆斯”的评论是一个快速的解决方案。你只需要小心避免'name变量中的字符来破坏python脚本。

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

注意,ExcelPython和Xlwings可以一起工作,两者都可以没有冲突。

我认为你最好通过这个例子来理解差异。我的理解仅限于我的知识,这可能不正确。

总结差异:

  • ExcelPython需要安装一个安装程序,它在UDF中很好用,如果你想要传入和传出参数,并且函数缓存在内存中会有所帮助,所以稍后调用会非常快。
  • 只需添加VBA模块即可轻松实现Xlwings,无需安装程序。它每次都在后台触发Python来运行脚本(每次调用都会启动一个新进程),在脚本中你可以通过COM操作(读/写)Excel。

我在开始时遇到了同样的问题,但后来我发现在Excel端使用VBA(intellisense)和在UDF上使用ExcelPython(简单地处理并返回数据)是一个很好的组合,所以我觉得ExcelPython只是什么我需要。

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