自定义函数选附代码注释By蓝桥玄霜前言我们平时在工作表单元格的公式中常常使用函数,Excel自带的常用的函数多达300多个,功能强大,丰富多彩,博大精深。在Excel内置函数和扩展函数中有十多个应用领域的函数,如数学与三角函数、统计函数、文本和数据函数、查找和引用函数、数据库函数、财务函数、日期和时间函数、信息函数、工程函数和宏表函数等等。但是我们每个人还可能有各种各样的问题而不能直接应用这些函数得到解决,于是Excel也提供了VBA可以让我们自己编一个自定义函数来解决自己特定的需求。以下挑选一些自定义函数,由简到繁,附以代码注释,供大家参考。第1例折扣函数一、题目:要求编写一个当销售数量大于等于100时,售价打九折的计算折扣的自定义函数。二、代码:FunctionZekou(sul,jiag)AsDoubleIfsul=100ThenZekou=sul*jiag*0.1ElseZekou=0EndIfZekou=Application.Round(Zekou,2)EndFunction三、代码详解1、FunctionZekou(sul,jiag)AsDouble:自定义函数的开始语句。自定义函数总是以Function开头,以EndFunction语句结束。自定义函数的代码一定要放在标准模块里面。Zekou是函数名,名字可取一个较短的描述信名称,这样容易记忆。如sul数量和jiag价格,这里用的是拼音字母。函数后括号里的两个变量叫做函数的参数。两个参数都没有显式声明数据类型,都是可变型数据类型variant。ASDouble表示函数返回值的数据类型是双精度浮点型数据。2、Ifsul=100Then如果sul(数量)大于等于100,那么这是标准的If…Then…Else判断语句,意思是如果第一个条件成立,或者说满足了第一个条件,那么执行Then以后的语句;否则执行Else以后的语句。3、Zekou=sul*jiag*0.1折扣=数量×价格×0.14、Else否则执行下面的语句,5、Zekou=0折扣=0,即数量小于100时,不打折扣。6、Zekou=Application.Round(Zekou,2)这里用了工作表的Round函数,返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。这里是按照2位小数进行四舍五入运算的折扣数值。四、自定义函数用法B2=450,C2=100.00,D2=Zekou(B2,C2)‘返回4500.00如图-1所示。图-1折扣函数用法第2例两点之间距离的自定义函数一、题目:要求编写已知同一平面上两点的坐标值,求两点之间距离的自定义函数。二、代码:Functiondist(x1,y1,x2,y2)dist=Sqr((x2-x1)^2+(y2-y1)^2)EndFunction三、代码详解1、Functiondist(x1,y1,x2,y2):自定义函数的开始语句。自定义函数名称为dist,参数是两点的坐标值x1、y1、x2、y2。2、dist=Sqr((x2-x1)^2+(y2-y1)^2):这是一个求两点间距离的公式,x坐标值差的平方与y坐标值差的平方之和的平方根就是两点之间的距离。其中Sqr是VBA函数,返回一个Double(双精度数据),指定参数的平方根。四、自定义函数用法B2、B3单元格是点1的坐标值,D2、D3单元格是点2的坐标值,两点之间的距离为C5=dist(B2,B3,D2,D3)‘返回156792如图-2所示。图-2dist函数的用法第3例十进制角度转化为度分秒的自定义函数一、题目:要求编写把一个十进制的角度,转化为角的度分秒形式的自定义函数。二、代码:Functiondfm(angle3)'度转化为度分秒Ifangle30Thendeg1=-Int(Abs(angle3))Elsedeg1=Int(angle3)EndIfmin1=(Abs(angle3)-Abs(deg1))*60min2=Int(min1)sec1=Int((min1-min2)*60)dfm=deg1&°&min2&'&sec1&EndFunction三、代码详解1、Functiondfm(angle3):自定义函数的开始语句。自定义函数名称为dfm,度分秒的拼音首字母,参数是angle3。2、Ifangle30Then:如果角度小于0,那么执行下面的语句,否则执行else后面的语句。3、deg1=-Int(Abs(angle3)):这句用了两个VBA函数,先是绝对值函数Abs,对负的角度取其绝对值,然后是取整函数Int,取角度的整数,加上-(负)以后赋值给变量deg1(整数度)。这里为什么要先用绝对值函数Abs呢?因为如果直接对负数取整,就会产生错误,如-36,直接对负数取整得到的是-37,而不是-36。4、deg1=Int(angle3):如果角度是正的,只需要用取整函数Int,取角度的整数,赋值给变量deg1。5、min1=(Abs(angle3)-Abs(deg1))*60:把角度的绝对值减去度绝对值的差乘以60,得到的值赋给变量min1(小数分)。6、min2=Int(min1):把分取整的值赋给变量min2(整数分)。7、sec1=Int((min1-min2)*60):把小数分减去整数分的差取整后乘以60,得到的值赋给变量sec1(整数秒)。8、dfm=deg1&°&min2&'&sec1&:用字符连接运算符&把整数度整数分整数秒,中间加上度分秒的数学符号连接起来所形成的字符串赋给函数dfm。四、自定义函数用法A2、A3单元格的值是十进制的角度值,B2=dfm(A2)‘返回65°19’17”,B3=dfm(A3)‘返回-36°41’7”如图-3所示。图-3dfm函数的用法第4例个人所得税自定义函数一、题目:要求编写一个计算个人所得税的自定义函数。二、代码:Functiongrsds(ysr,Optionalqzd=2000)AsSingleDimsuilAsSingle,sukousuAsSingle,ynseAsSingleynse=ysr-qzdSelectCaseynseCase0To500suil=0.05:sukousu=0Case501To2000suil=0.1:sukousu=25Case2001To5000suil=0.15:sukousu=125Case5001To20000suil=0.2:sukousu=375Case20001To40000suil=0.25:sukousu=1375Case40001To60000suil=0.3:sukousu=3375Case60001To80000suil=0.35:sukousu=6375Case60001To100000suil=0.4:sukousu=10375CaseElsesuil=0.45:sukousu=15375EndSelectIfynse=0Thengrsds=0Elsegrsds=Round(ynse*suil-sukousu,2)EndIfEndFunction三、代码详解1、Functiongrsds(ysr,Optionalqzd=2000)AsSingle:自定义函数的开始语句。以Function开始,grsds是函数名,名字可任意取名,这里用了个人所得税各字的拼音首字母,其它变量也是如此,如月收入ysr和起征点qzd。函数后括号里的两个变量叫做函数的参数,在变量前加有Optional的表示是可选的参数,即可以用也可以不用它,这里=2000表示该变量的默认值为2000,即如果不用它,变量qzd就=2000。ASSingle表示变量都声明为单精度浮点型变量。Single(单精度浮点型)变量存储为32位(4个字节)浮点数值的形式,它的范围在负数的时候是从-3.402823E38到-1.401298E-45,而在正数的时候是从1.401298E-45到3.402823E38。Single的类型声明字符为感叹号(!)。2、DimsuilAsSingle,sukousuAsSingle,ynseAsSingle:三个变量都声明为单精度浮点型变量。其中suil代表(税率)、sukousu代表(速扣数)、ynse代表(应纳税额)。3、ynse=ysr-qzd:把月收入(ysr)-起征点(qzd)的值赋给变量应纳税额(ynse)。由于qzd变量可选而且有默认值2000,所以如果公式中省略该参数,该参数就等于2000。4、SelectCaseynse和EndSelect:是一组判断语句的一对开头和结束语句。Ynse就是判断的条件。SelectCase与If…Then…Else判断语句很相似,但是前者允许在许多的条件值这种选择。你可以有任意数量的Case行,并且在每行上可包含多个值,还可以使用To子句来包含一个值范围。比如下面的Case0To500语句。5、Case0To500:如果应纳税额(ynse)的值在0~500之间的话,就执行下面的语句。如果应纳税额(ynse)的值不在0~500之间的话,就不执行下面的语句7而依次执行其它的Case语句。6、suil=0.05:sukousu=0:如税率=0.05,速扣数=0。接着执行EndSelect语句退出判断语句。直接执行Ifynse=0Then语句。7、其它的Case语句相同。最后一个CaseElse语句表示如果上面所有的条件都不符合(也就是应纳税额大于100000时)那么税率=0.45:速扣数=15375,退出判断语句。8、Ifynse=0Then:这是标准的If…Then…Else判断语句,如果应纳税额小于等于0的话,那么。9、grsds=0:那么个人所得税=0。否则10、grsds=Round(ynse*suil-sukousu,2):个人所得税=应纳税额×税率-速扣数。这里用了Round函数,返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。这里是按照2位小数进行四舍五入运算的个人所得税数值。四、自定义函数用法A2=4500,B2=grsds(A2)‘返回250A3=6000,B3=grsds(A3,)‘返回475A4=8000,B4=grsds(A3,2000)‘返回825如图-4所示。图-4个人所得税函数用法第5例直角三角形未知边边长函数一、题目:要求编写一个已知直角三角形两条边的边长求另一条未知边边长的自定义函数。二、代码:Functionbc(Optionalshort1,Optionalshort2,Optionallongside)IfNot(IsMissing(short1))AndNot(IsMissing(short2))Thenbc=Sqr(short1^2+short2^2)ElseIfNot(IsMissing(short1))AndNot(IsMissing(longside))Thenbc=Sqr(longside^2-short1^2)ElseIfNot(IsMissing(short2))AndNot(IsMissing(longside))Thenbc=Sqr(longside^2-short2^2)Elsebc=需要有两条已知的边。EndIfEndFunction三、代码详解1、Functionbc(Optionalshort1,Optionalshort2,Optionallongside):自定义函数的开始语句。自定义函数总是以Function开头,以EndFunction语句结束。这里三个变量都是可选参数,实际上必须有两个参数。代码中会判断引用的参数是短边1还是短边2,或者是长边,然后进行计算。2、IfNot(IsMissing(short1))AndNot(IsMissing(short2))Then:这是标准的If…Then…Else判断语句,意思是如果有短边1并且有短边2,那么执行下面的语句,其中IsMissing是VBA函数,该函数返回一个Boolean(布尔)