2

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

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

VBA:

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

蟒蛇(Test.py):

from xlwings import Workbook, Range

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

错误:

NameError: name 'name' is not defined
4

2 回答 2

5

确保您正确提供了参数:

RunPython ("import Test; Test.sayhi('" &  name & "')") 
于 2015-12-09T15:31:32.777 回答
0

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

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

注意,ExcelPython 和 Xlwings 可以一起工作,你可以同时拥有两者而不会发生冲突。

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

总结一下区别:

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

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

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

于 2015-12-09T02:34:23.113 回答