首页 vba自定义函数小结

vba自定义函数小结

举报
开通vip

vba自定义函数小结小结:函数参数前面标记byval,实现的是实参与形参之间的值传递,即形参具有了实参的值或者说建立了一个实参的副本给了形参,这样对形参的操作不会影响实参;函数参数前面标记byref,实现的是实参与形参之间的引用传递,这样对形参的操作会影响实参,或者说对形参的操作等同于对实参的操作;在函数内部使用“r=形参”,实现的是把形参的副本给r,在函数中对r操作不会影像形参,如果使用“setr=形参”,那么对r的操作会影响形参,这里实现的效果是r只是形参的一个别名而已,所以对r的操作等同于对形参的操作。在函数中形参前面不标记by...

vba自定义函数小结
小结:函数参数前面标记byval,实现的是实参与形参之间的值传递,即形参具有了实参的值或者说建立了一个实参的副本给了形参,这样对形参的操作不会影响实参;函数参数前面标记byref,实现的是实参与形参之间的引用传递,这样对形参的操作会影响实参,或者说对形参的操作等同于对实参的操作;在函数内部使用“r=形参”,实现的是把形参的副本给r,在函数中对r操作不会影像形参,如果使用“setr=形参”,那么对r的操作会影响形参,这里实现的效果是r只是形参的一个别名而已,所以对r的操作等同于对形参的操作。在函数中形参前面不标记byref和byval,默认是引用传递byref,但是这种情况下如果实参是excel中worksheet的range区域,则默认是值传递。有时调试结果不符合预期,比如值传递,对””r=形参”中的r操作,居然影响形参了,这可能是由于excel一时程序错乱导致,关闭重启就好了。PublicFunctiontjbcf(rng)r=rng'Setr=rng'注意带着set是错误的k=0IfUBound(r,1)>1AndUBound(r,2)=1ThenFori=1ToUBound(r,1)f=0Forj=1Toi-1Ifr(i,1)=r(j,1)Thenf=1ExitForEndIfNextjIff=0Andr(i,1)<>""Thenk=k+1EndIfNextiEndIfIfUBound(r,1)=1AndUBound(r,2)>1ThenFori=1ToUBound(r,2)f=0Forj=1Toi-1Ifr(1,i)=r(1,j)Thenf=1ExitForEndIfNextjIff=0Andr(1,i)<>""Thenk=k+1EndIfNextiEndIfIfUBound(r,1)>1AndUBound(r,2)>1ThenFori=1ToUBound(r,1)Forj=1ToUBound(r,2)Ifr(i,j)=""Thenf=1GoTokkEndIff=0Form=1Toi-1Forn=1ToUBound(r,2)Ifr(i,j)=r(m,n)Thenf=1GoTokkEndIfNextnNextmForn=1Toj-1Ifr(i,j)=r(i,n)Thenf=1GoTokkEndIfNextnkk:Iff=0Thenk=k+1EndIfNextjNextiEndIftjbcf=kEndFunctionPublicFunctiongetnum(str,m)ss=""Fori=mToLen(str)IfInStr("0123456789.",Mid(str,i,1))<>0Thenss=ss&Mid(str,i,1)ElseGoTokkEndIfNextikk:getnum=Val(ss)'注意是val不是value,在sheet中是value函数,在vb中则是val函数EndFunctionPublicFunctiongetnum2(str,m)ss=""f=0Fori=mToLen(str)IfInStr("0123456789.",Mid(str,i,1))<>0Thenss=ss&Mid(str,i,1)ElseIff=1Andss<>""ThenGoTokkEndIff=1EndIfNextikk:getnum2=Val(ss)EndFunctionPublicFunctionNewMmult(a,b)a1=a'把rangea的值赋给a1,a是几行几列的range,a1就是几行几列的数组。注意a1是一个variant数组,即a1中的不同元素可以属性不同,a1中某个元素是字符,另一个可以是整数。b1=b'把rangeb的值赋给b1Fori=1ToUBound(a1,1)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数Forj=1ToUBound(a1,2)'UBound(a1,2)指的是数组a1第2维度的大小,即a1的列数Ifa1(i,j)=""Then'判断a1(i,j)是不是空白,如果是,那就赋0值。a1(i,j)=0EndIfNextjNextiFori=1ToUBound(b1,1)Forj=1ToUBound(b1,2)Ifb1(i,j)=""Thenb1(i,j)=0EndIfNextjNextiNewMmult=Application.MMult(a1,b1)EndFunctionPublicFunctionsim(str1,str2)IfLen(str2)=0Thensim=0GoTokkEndIfsim=0Fori=1ToLen(str2)IfInStr(str1,Mid(str2,i,1))<>0Thensim=sim+1EndIfNextisim=sim/Len(str2)kk:EndFunctionPublicFunctionsima(ByValstr1,ByValstr2)IfLen(str2)=0Thensima=0GoTokkEndIfsima=0l=Len(str2)Fori=1ToLen(str2)IfInStr(str1,Mid(str2,i,1))<>0Thensima=sima+1str1=Application.WorksheetFunction.Substitute(str1,Mid(str2,i,1),"",1)EndIfNextisima=sima/lkk:EndFunctionPublicFunctionmcc(rng,rng1,str1,Optionalrng2="",Optionalstr2,Optionalrng3="",Optionalstr3,Optionalrng4="",Optionalstr4,Optionalrng5="",Optionalstr5)r=rngr1=rng1r2=rng2r3=rng3r4=rng4r5=rng5mcc=""IfApplication.CountA(rng2)=1ThenFori=1ToUBound(r,1)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(i,1)=str1)Thenmcc=r(i,1)GoTokkEndIfNextiEndIfIfApplication.CountA(rng3)=1ThenFori=1ToUBound(r,1)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(i,1)=str1,r2(i,1)=str2)Thenmcc=r(i,1)GoTokkEndIfNextiEndIfIfApplication.CountA(rng4)=1ThenFori=1ToUBound(r,1)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(i,1)=str1,r2(i,1)=str2,r3(i,1)=str3)Thenmcc=r(i,1)GoTokkEndIfNextiEndIfIfApplication.CountA(rng5)=1ThenFori=1ToUBound(r,1)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(i,1)=str1,r2(i,1)=str2,r3(i,1)=str3,r4(i,1)=str4)Thenmcc=r(i,1)GoTokkEndIfNextiEndIfFori=1ToUBound(r,1)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(i,1)=str1,r2(i,1)=str2,r3(i,1)=str3,r4(i,1)=str4,r5(i,1)=str5)Thenmcc=r(i,1)GoTokkEndIfNextikk:EndFunctionPublicFunctionmccd(rng,rng1,str1,Optionalrng2="",Optionalstr2,Optionalrng3="",Optionalstr3,Optionalrng4="",Optionalstr4,Optionalrng5="",Optionalstr5)r=rngr1=rng1r2=rng2r3=rng3r4=rng4r5=rng5mccd=""IfApplication.CountA(rng2)=1ThenFori=1ToUBound(r,2)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(1,i)=str1)Thenmccd=r(1,i)GoTokkEndIfNextiEndIfIfApplication.CountA(rng3)=1ThenFori=1ToUBound(r,2)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(1,i)=str1,r2(1,i)=str2)Thenmccd=r(1,i)GoTokkEndIfNextiEndIfIfApplication.CountA(rng4)=1ThenFori=1ToUBound(r,2)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(1,i)=str1,r2(1,i)=str2,r3(1,i)=str3)Thenmccd=r(1,i)GoTokkEndIfNextiEndIfIfApplication.CountA(rng5)=1ThenFori=1ToUBound(r,2)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(1,i)=str1,r2(1,i)=str2,r3(1,i)=str3,r4(1,i)=str4)Thenmccd=r(1,i)GoTokkEndIfNextiEndIfFori=1ToUBound(r,2)'UBound(a1,1)指的是数组a1第1维度的大小,即a1的行数IfApplication.WorksheetFunction.And(r1(1,i)=str1,r2(1,i)=str2,r3(1,i)=str3,r4(1,i)=str4,r5(1,i)=str5)Thenmccd=r(1,i)GoTokkEndIfNextikk:EndFunctionr=rng'r1=rng'r2=rng'str1=str'str2=strv=sima(str,r(1,1))+sima(r(1,1),str2)'str1=str‘这里不再需要赋值,因为sima设置的是值传递byval,sima调用实参str和r(1,1)不影响实参。'str2=strk=1Fori=2ToUBound(r,1)m=(sima(str,r(i,1))+sima(r(i,1),str))'str1=str'str2=strIfv
本文档为【vba自定义函数小结】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_597436
暂无简介~
格式:pdf
大小:225KB
软件:PDF阅读器
页数:9
分类:
上传时间:2018-05-18
浏览量:0