分享

Excel VBA 自己手写一个函数

 晴耕雨读天 2023-05-07 发布于广西

今天讲一下如何使用VBA来手写一个自定义函数,其实说得少许专业些,写自定义函数就是创建Function过程。废话不多说,直接开始。

打开Excel,找到开发工具选项卡,找到Visual Basic选项卡,点击进入VBA编辑器。在左边一栏 “工程-VBAProject” 窗口空白处鼠标右击 “插入”,然后选择 “模块” ,点击 “模块”,右边整个一大块白色区域就是我们写VBA代码的地方。

文章图片1
文章图片2

今天因为是创建自定义函数,为了做演示具体就先创建一个名称为 “加法” 的函数,开头先输入:Function 加法(),按回车。

文章图片3

这里函数中文名英文名随意,只要不和平时使用的Excel工作表函数重名即可,命名也是为了方便自己看得懂吧。如上图显示结尾处,自动补上了End Function,开头和结尾中间部分我们要补齐代码来创建这个 “加法” 函数。

先写上代码:

Function 加法(数字1 As Integer, 数字2 As Integer)

加法 = 数字1 + 数字2

End Function

代码保存好之后,该 “加法” 函数已经能在此工作表上面使用了,来看一下效果。

文章图片4

在C1单元格里,输入 “=加法(2,6)”,也就是两数相加,答案是8,该自定义函数没有问题。

代码虽然没有问题,但注意这么写不是很恰当,先看看会有什么问题。首先,它只能够做到两个整数间的运算,如果其中一个数是小数就算不准。

文章图片5

还是在原来C1单元格里,输入 “=加法(2,0.8)”,结果给返回的是3而不是2.8,为什么会这样是因为公式里面2个参数,数据类型都定义成了整型,返回的会是整数,所以公式最后得出结果由2.8四舍五入变成了3。

还有就是这个公式,只相当于单元格里整数的相加是准确的,如涉及小数,还是会出现前面的问题。

文章图片6

所以得出结论,公式的两个参数都给定义成整型不是很适合,在实际应用中,自定义函数的参数往往会定义成Range单元格对象,这样方便新定义的函数能引用单元格作为参数。

重新修改一下代码;

Function 加法(数字1 As Range, 数字2 As Range)

加法 = 数字1 + 数字2

End Function

修改的代码保存好以后再去试一下看看结果:

文章图片7

如上图所见,公式运行后返回了正确的结果。所以说在VBA中事先定义好正确的数据类型还是很重要的。许多学习VBA的书籍,上来就讲数据类型,然后每个数据类型有相应的解释说明,对初学者来说很不友好,有的人直接死记硬背,最后都劝退了。所以这篇文章不会按教科书上的顺序,直接一上来就用实例来讲解,边做实例边说理论知识,希望能帮助到大家。

来看一下还有哪些理论知识点,都画在图上了,请查看。

文章图片8
文章图片9

前面介绍了2个数据类型,整型Integer和对象型Range,现在简单说一下形参和实参。作为函数公式里面有参数,这很容易理解。在工作表里该加法公式中单元格C1和D1代表了实参,实参传递给自定义函数里的形参,最后通过代码中函数的表达式进行计算,最终的结果为:2.8

到现在创建自定义函数基础部分已经讲完了,现在再做个实例提高一下,也为了巩固一下所学的知识。

实例就做个很简单的提取身份证年月日吧,尝试创建一个自定义函数,直接提取18位身份证的年月日。先看文档:

文章图片10

这是虚拟的身份证号,为了方便演示,数据做得非常的简单。当中数字部分就是要提取的出生年月,其实这个要提取出来用工作表函数MID就能做。在B2单元格输入公式:=MID(A2,7,8),搞定。

文章图片11

这个实例要做的是创建一个自定义函数直接一步到位,只要引用A列任意一个单元格就把出生年月日提取出来,看看要怎么写代码?

首先,前面的MID函数是可以用来借鉴的,因为MID函数也是VBA里的内置函数可以调用的,这样的话代码就容易多了。直接上代码:

Function 出生日期(rng As Range)

出生日期 = Mid(rng, 7, 8)

End Function

这里创建的自定义函数名称叫 “出生日期”,用来提取身份证出生年月日部分,在工作表中比MID函数少写了2个参数。代码很简单,这里真的不多做说明了,多敲几遍肯定能懂了。

来看一下结果,和旁边公式的运算结果一模一样。

文章图片12

以上就是VBA里创建自定义函数的部分,篇幅有限,只能简单介绍到这里了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多