我正在尝试在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
答案 0 :(得分:1)
确保您正确提供参数:
RunPython ("import Test; Test.sayhi('" & name & "')")
答案 1 :(得分:0)
RunPython()中的文本应该是一个有效的python脚本。所以“蒂姆威廉姆斯”的评论是一个快速的解决方案。你只需要小心避免'name变量中的字符来破坏python脚本。
如果你需要编写很多UDF(用户定义函数),或者需要传入值来获取输出然后通过VBA处理结果,请尝试使用ExcelPython而不是Xlwings。
注意,ExcelPython和Xlwings可以一起工作,两者都可以没有冲突。
我认为你最好通过这个例子来理解差异。我的理解仅限于我的知识,这可能不正确。
总结差异:
我在开始时遇到了同样的问题,但后来我发现在Excel端使用VBA(intellisense)和在UDF上使用ExcelPython(简单地处理并返回数据)是一个很好的组合,所以我觉得ExcelPython只是什么我需要。
如前所述,2个组件没有冲突,你可以同时拥有两个组件。如果2位作者也同意,那么将它们组合起来是个好主意。