VBA自定义函数选合集代码注释.docx
- 文档编号:30037883
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:29
- 大小:465.93KB
VBA自定义函数选合集代码注释.docx
《VBA自定义函数选合集代码注释.docx》由会员分享,可在线阅读,更多相关《VBA自定义函数选合集代码注释.docx(29页珍藏版)》请在冰豆网上搜索。
VBA自定义函数选合集代码注释
自定义函数选
附代码注释
By蓝桥玄霜
前言
我们平时在工作表单元格的公式中常常使用函数,Excel自带的常用的函数多达300多个,功能强大,丰富多彩,博大精深。
在Excel内置函数和扩展函数中有十多个应用领域的函数,如数学与三角函数、统计函数、文本和数据函数、查找和引用函数、数据库函数、财务函数、日期和时间函数、信息函数、工程函数和宏表函数等等。
但是我们每个人还可能有各种各样的问题而不能直接应用这些函数得到解决,于是Excel也提供了VBA可以让我们自己编一个自定义函数来解决自己特定的需求。
以下挑选一些自定义函数,由简到繁,附以代码注释,供大家参考。
第1例折扣函数
一、题目:
要求编写一个当销售数量大于等于100时,售价打九折的计算折扣的自定义函数。
二、代码:
FunctionZekou(sul,jiag)AsDouble
Ifsul>=100Then
Zekou=sul*jiag*0.1
Else
Zekou=0
EndIf
Zekou=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.1
4、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)'度转化为度分秒
Ifangle3<0Then
deg1=-Int(Abs(angle3))
Else
deg1=Int(angle3)
EndIf
min1=(Abs(angle3)-Abs(deg1))*60
min2=Int(min1)
sec1=Int((min1-min2)*60)
dfm=deg1&"°"&min2&"'"&sec1&""""
EndFunction
三、代码详解
1、Functiondfm(angle3):
自定义函数的开始语句。
自定义函数名称为dfm,度分秒的拼音首字母,参数是angle3。
2、Ifangle3<0Then:
如果角度小于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)AsSingle
DimsuilAsSingle,sukousuAsSingle,ynseAsSingle
ynse=ysr-qzd
SelectCaseynse
Case0To500
suil=0.05:
sukousu=0
Case501To2000
suil=0.1:
sukousu=25
Case2001To5000
suil=0.15:
sukousu=125
Case5001To20000
suil=0.2:
sukousu=375
Case20001To40000
suil=0.25:
sukousu=1375
Case40001To60000
suil=0.3:
sukousu=3375
Case60001To80000
suil=0.35:
sukousu=6375
Case60001To100000
suil=0.4:
sukousu=10375
CaseElse
suil=0.45:
sukousu=15375
EndSelect
Ifynse<=0Then
grsds=0
Else
grsds=Round(ynse*suil-sukousu,2)
EndIf
EndFunction
三、代码详解
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)‘返回250
A3=6000,B3=grsds(A3,)‘返回475
A4=8000,B4=grsds(A3,2000)‘返回825
如图-4所示。
图-4个人所得税函数用法
第5例直角三角形未知边边长函数
一、题目:
要求编写一个已知直角三角形两条边的边长求另一条未知边边长的自定义函数。
二、代码:
Functionbc(Optionalshort1,Optionalshort2,Optionallongside)
IfNot(IsMissing(short1))AndNot(IsMissing(short2))Then
bc=Sqr(short1^2+short2^2)
ElseIfNot(IsMissing(short1))AndNot(IsMissing(longside))Then
bc=Sqr(longside^2-short1^2)
ElseIfNot(IsMissing(short2))AndNot(IsMissing(longside))Then
bc=Sqr(longside^2-short2^2)
Else
bc="需要有两条已知的边。
"
EndIf
EndFunction
三、代码详解
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(布尔)值,Boolean(布尔)值有两个:
True(真)和False(假)。
指出一个可选的Variant(变体型)参数是否已经传递给过程,如果传递给过程了,则函数返回False(假),反之函数返回True(真)。
在(IsMissing(short1))前面加Not逻辑运算符,则返回一个逻辑非,即如果有参数1,IsMissing(short1)返回False(假),加了Not以后返回了True(真)。
我们平常说的“不假”,也就是“真”了。
3、bc=Sqr(short1^2+short2^2):
计算公式是短边1的平方+短边2的平方的和再开平方。
这里用了Sqr函数,它也是一个VBA函数,返回指定参数的平方根。
4、ElseIfNot(IsMissing(short1))AndNot(IsMissing(longside))Then:
如果第一个条件不满足,但是有短边1并且有长边,那么执行下面的语句。
5、bc=Sqr(longside^2–short1^2):
计算公式是长边的平方-短边1的平方的差再开平方。
6、ElseIfNot(IsMissing(short2))AndNot(IsMissing(longside))Then:
如果第二个条件也不满足,但是有短边2并且有长边,那么执行下面的语句。
7、bc=Sqr(longside^2–short1^2):
计算公式是长边的平方-短边2的平方的差再开平方。
8、Else:
如果以上条件都不满足,那么执行下面的语句。
9、bc="需要有两条已知的边。
":
把一个字符串返回给函数bc。
四、自定义函数用法
A1、A2是边长,A1=26.36,A2=30.24,B3=bc(A1,A2,)‘返回40.12注意:
这里省略了第3个参数长边;
B4=bc(A1,,A2)‘返回14.82注意:
这里用了第3个参数长边,省略了第2个参数短边2。
B5=bc(,A1,A2)‘返回14.82注意:
这里用了第3个参数长边,省略了第1个参数短边1。
B6=bc(A1,,)‘返回"需要有两条已知的边。
"注意:
省略了2个参数。
如图-5所示。
图-5bc函数用法
第6例两直线交点坐标的自定义函数
一、题目:
要求编写已知两条直线的直线方程,求两条直线交点的坐标的自定义函数。
二、代码:
Functionjiaox1(coea1,coeb1,coec1,coea2,coeb2,coec2)
jiaox1=-(coec1*coeb2-coec2*coeb1)/(coea1*coeb2-coea2*coeb1)
EndFunction
Functionjiaoy1(coea1,coeb1,coec1,coea2,coeb2,coec2)
jiaoy1=-(coea1*coec2-coea2*coec1)/(coea1*coeb2-coea2*coeb1)
EndFunction
三、代码详解
1、Functionjiaox1(coea1,coeb1,coec1,coea2,coeb2,coec2):
自定义函数的开始语句。
自定义函数名称为jiaox1,参数分别是直线方程的系数值coea1、coeb1、coec1、coea2、coeb2、coec2。
2、jiaox1=-(coec1*coeb2-coec2*coeb1)/(coea1*coeb2-coea2*coeb1):
交点的X坐标jiaox1,右边为交点的X坐标的计算公式。
交点的Y坐标jiaoy1的计算公式类似。
四、自定义函数用法
直线的标准方程为:
Ax+By+C=0
直线1的方程为:
y=2x+1coea1=2;coeb1=-1;coec1=1
直线2的方程为:
y=-x+4coea2=-1;coeb2=-1;coec2=4
A2、D2、G2单元格是直线1方程的系数,A4、D4、G4单元格是直线2方程的系数,两直线交点的X1坐标为C7=jiaox1(A2,D2,G2,A4,D4,G4)‘返回1
两直线交点的Y1坐标为C7=jiaoy1(A2,D2,G2,A4,D4,G4)‘返回3
如图-6所示。
图-6jiaoy1函数的用法
第7例两直线夹角的自定义函数
一、题目:
要求编写一个已知两条直线上的四个点的坐标,求两直线的夹角的自定义函数。
二、代码:
Functionjiaj(x1,y1,x2,y2,x3,y3,x4,y4)'两直线的夹角
'2009-5-20修改
'直线1逆时针转向直线2之夹角
If(x1=x2Andy1=y2)Or(x3=x4Andy3=y4)Thenjiaj="不是两条直线!
":
ExitFunction
Ifx1=x2Then'直线1平行Y轴
Ifx3=x4Then'直线2平行Y轴
jiaj="两条直线平行不相交!
":
ExitFunction
Else
kkk2=(y3-y4)/(x3-x4)
jiaj=Application.Degrees(Atn(kkk2))
Ifjiaj<0Then
jiaj=90+jiaj
Else
jiaj=90-jiaj
EndIf
EndIf
ElseIfx3=x4Then
kkk1=(y1-y2)/(x1-x2)
jiaj=Application.Degrees(Atn(kkk1))
jiaj=90-jiaj
Else
kkk1=(y1-y2)/(x1-x2):
kkk2=(y3-y4)/(x3-x4)
If(1+kkk1*kkk2)<>0Then
jiaj=(kkk2-kkk1)/(1+kkk1*kkk2)
jiaj=Application.Degrees(Atn(jiaj))
Ifjiaj<0Then
jiaj=180+jiaj
Else
jiaj=180-jiaj
EndIf
EndIf
EndIf
jiaj=dfm(jiaj)
EndFunction
三、代码详解
1、Functionjiaj(x1,y1,x2,y2,x3,y3,x4,y4):
自定义函数的开始语句。
自定义函数名称为jiaj,八个参数分别是4个点的坐标值。
2、If(x1=x2Andy1=y2)Or(x3=x4Andy3=y4)Thenjiaj="不是两条直线!
":
ExitFunction:
如果每一条直线的x、y坐标值两两相等,那么这是两个点,不是直线了;所以jiaj返回“不是两条直线!
”,并退出。
3、Ifx1=x2Then:
下面对直线1的x坐标值进行一些判断,如果x1=x2,则直线1垂直x轴;那么执行下面的代码;
4、Ifx3=x4Then:
再对直线2的x坐标值进行判断,如果x3=x4,则直线2也垂直x轴;如果直线2垂直x轴,那么执行下面的代码;
5、jiaj="两条直线平行不相交!
":
ExitFunction:
返回信息并退出函数。
6、kkk2=(y3-y4)/(x3-x4):
如果直线2不垂直x轴,那么求得直线2的斜率kkk2;
7、jiaj=Application.Degrees(Atn(kkk2)):
这里运用了两个函数,一个是VBA函数Atn,反正切函数;另一个是Excel的函数Degrees,将弧度转为十进制的度。
Excel的函数在VBA中不能直接引用,必须在函数前面加Application对象;而VBA函数Atn可以直接运用。
Atn(kkk2)返回夹角的弧度值,再用Degrees函数将弧度转为十进制的度。
这时的变量jiaj的值还不是两直线十进制的夹角,而是直线2与x轴的十进制夹角;
8、Ifjiaj<0Then:
如果夹角小于0那么执行下面的代码;这里实际是判断直线2的斜率是否小于0,
9、jiaj=90+jiaj:
如果夹角小于0那么两直线十进制的夹角就等于90+jiaj;
10、jiaj=90-jiaj:
否则两直线十进制的夹角就等于90-jiaj;
11、下面的判断与上面的类似,不再多说了;
12、kkk1=(y1-y2)/(x1-x2):
kkk2=(y3-y4)/(x3-x4):
变量kkk1和kkk2分别是两条直线的斜率,计算公式等于y1-y2的值除以x1-x2的值。
kkk2前面的“:
”表示后面是另一个语句,相当于另起一行。
13、If(1+kkk1*kkk2)<>0Then:
如果1+kkk1*kkk2的值不等于0,那么执行下面的语句;
14、jiaj=(kkk2-kkk1)/(1+kkk1*kkk2):
这里变量jiaj的值等于上述的公式计算的值,还不是两直线的夹角;
15、Ifjiaj<0Thenjiaj=180+jiaj:
如果jiaj小于0,那么jiaj就等于180+jiaj。
两条直线的夹角的大小在0~180°之间,自定义函数jiaj是以x1,y1,x2,y2两点组成的直线
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VBA 自定义 函数 选合集 代码 注释