11.3自定义函数(UDF)

如你所知,Excel的工作表函数功能非常强大,使用也很方便。如果Excel提供的函数还不够用,可以用VBA自己定义函数并在工作表中像内部工作表函数一样使用。除此以外,本节主要介绍用VBA调用Python自定义函数在工作表中直接使用。

用VBA自定义函数

在Excel VBA编程环境中添加模块,在模块代码窗口输入下面的函数mysum,计算两个给定数据的和。保存为启用宏的Excel工作簿文件vba-udf.xlsm。在下载资料包中的Samples目录下的ch11\ vba-python子目录下可以找到它。

code.python
Function mysum(a As Double, b As Double) As Double
mysum = a + b
End Function

然后在Excel主界面的工作表A1单元格中输入公式"=mysum(1,2)",回车,得到1和2的和3,如图11-8所示。

Document Image

图11-8 用VBA自定义函数

所以,使用这种方式能够实现自定义工作表函数。

VBA调用Python自定义函数的准备工作

11.3.1小节介绍了使用VBA函数自定义工作表函数,但本节介绍的重点是用VBA调用Python自定义函数。在进行具体操作之前需要做一些准备工作。

第1个准备工作是在Excel主界面的“开发工具”功能区单击“宏安全性”按钮,打开“信任中心”对话框,如图11-9所示。在左侧菜单中单击“宏设置”选项,然后在右边选择“信任对VBA工程对象模型的访问”核选框。

Document Image

图11-9 选择“信任对VBA工程对象模型的访问”核选框

第2个准备工作是加载xlwings加载项,此步请参考11.2.1小节内容,不再赘述。

编写Python文件并在VBA中调用

准备工作做好以后,在Python IDLE脚本编辑器或者记事本中编写Python文件,并保存为.py文件。该.py文件在下载资料包中的Samples目录下的ch11\ vba-python子目录下可以找到,文件名为vba-py-mysum.py。文件代码如下所示,包含一个my_sum函数,实现两个给定变量的求和运算。代码用到了xw.func修饰符。

code.python
1	import xlwings as xw
2
3	@xw.func
4	def my_sum(x,y):
5	   return x+y

然后在Excel主界面,将文件保存为启用宏的工作簿文件vba_py_mysum.xlsm,保存在与py文件相同的目录下,并且跟.py文件的名称相同。该文件在下载资料包中的Samples目录下的ch11\ vba-python子目录下可以找到。

在A1单元格输入公式"=my_sum(1,2)",回车,得到1和2的和3,如图11-10所示。

Document Image

图11-10 用VBA调用Python自定义函数

常见错误

用VBA调用Python自定义函数时可能出现的错误主要有下面这2个。

第1个是"…pywintypes.com_error:…"错误,具体出错信息类似图11-11所示。出现该错误,是因为没有进行11.3.2小节所介绍的第1步准备工作。进行相应设置即可解决问题。

Document Image

图11-11 "…pywintypes.com_error:…"出错信息

第2个是“要求对象”错误。该错误在编写好py文件和同名xlsm文件后,在工作表的单元格中输入自定义函数公式并回车时触发。在单元格中显示“要求对象”。出现该错误,是因为没有在Excel VBA编程环境中引用xlwings宏文件。如11.2.3小节介绍进行引用后进行自定义函数的操作,即可解决问题。