《vba自定义函数小结.docx》由会员分享,可在线阅读,更多相关《vba自定义函数小结.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、vba自定义函数小结 小结: 函数参数前面标记byval,实现的是实参加形参之间的值传递,即形参具有了实参的值或者说建立了一个实参的副本给了形参,这样对形参的操作不会影响实参; 函数参数前面标记byref,实现的是实参加形参之间的引用传递,这样对形参的操作会影响实参,或者说对形参的操作等同于对实参的操作; 在函数内部运用“r=形参”,实现的是把形参的副本给r,在函数中对r操作不会影像形参,假如运用“set r=形参”,那么对r的操作会影响形参,这里实现的效果是r只是形参的一个别名而已,所以对r的操作等同于对形参的操作。 在函数中形参前面不标记byref和byval,默认是引用传递byref,但
2、是这种状况下假如实参是excel中worksheet的range区域,则默认是值传递。 有时调试结果不符合预期,比如值传递,对”r=形参”中的r操作,尽然影响形参了,这可能是由于excel一时程序错乱导致,关闭重启就好了。 Public Function tjbcf(rng) r = rng Set r = rng留意带着set是错误的 k = 0 If UBound(r, 1) 1 And UBound(r, 2) = 1 Then For i = 1 To UBound(r, 1) f = 0 For j = 1 To i1 If r(1, i) = r(1, j) Then f = 1
3、Exit For End If Next j If f = 0 And r(1, i) Then k = k + 1 End If Next i End If If UBound(r, 1) 1 And UBound(r, 2) 1 Then For i = 1 To UBound(r, 1) For j = 1 To UBound(r, 2) If r(i, j) = Then f = 1 GoTo kk End If f = 0 For m = 1 To i1 If r(i, j) = r(i, n) Then f = 1 GoTo kk End If Next n kk: If f =
4、0 Then k = k + 1 End If Next j Next i End If tjbcf = k End Function Public Function getnum(str, m) = For i = m To Len(str) If InStr(0123456789., Mid(str, i, 1) 0 Then = & Mid(str, i, 1) Else GoTo kk End If Next i kk: getnum = Val() 留意是val不是value,在sheet中是value函数,在vb中则是val函数 End Function Public Functi
5、on getnum2(str, m) = f = 0 For i = m To Len(str) If InStr(0123456789., Mid(str, i, 1) 0 Then = & Mid(str, i, 1) Else If f = 1 And Then GoTo kk End If f = 1 End If Next i kk: getnum2 = Val() End Function Public Function NewMmult(a, b) a1 = a 把range a的值赋给a1,a是几行几列的range,a1就是 几行几列的数组。留意a1是一个variant数组,即
6、a1中的不同元素可以属性不同,a1中某个元素是字符,另一个可以是整数。 b1 = b 把range b的值赋给b1 For i = 1 To UBound(a1, 1) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 For j = 1 To UBound(a1, 2) UBound(a1, 2)指的是数组a1第2维度的大小,即a1的列数 If a1(i, j) = Then 推断a1(i,j)是不是空白,假如是,那就赋0值。 a1(i, j) = 0 End If Next j Next i For i = 1 To UBound(b1, 1) For j = 1 To
7、 UBound(b1, 2) If b1(i, j) = Then b1(i, j) = 0 End If Next j Next i NewMmult = Application.MMult(a1, b1) End Function Public Function sim(str1, str2) If Len(str2) = 0 Then sim = 0 GoTo kk End If sim = 0 For i = 1 To Len(str2) If InStr(str1, Mid(str2, i, 1) 0 Then sim = sim + 1 End If Next i sim = si
8、m / Len(str2) kk: End Function Public Function sima(ByVal str1, ByVal str2) If Len(str2) = 0 Then sima = 0 GoTo kk End If sima = 0 l = Len(str2) For i = 1 To Len(str2) If InStr(str1, Mid(str2, i, 1) 0 Then sima = sima + 1 str1 = Application.WorksheetFunction.Substitute(str1, Mid(str2, i, 1), , 1) En
9、d If Next i sima = sima / l kk: End Function Public Function mcc(rng, rng1, str1, Optional rng2 = , Optional str2, Optional rng3 = , Optional str3, Optional rng4 = , Optional str4, Optional rng5 = , Optional str5) r = rng r1 = rng1 r2 = rng2 r3 = rng3 r4 = rng4 r5 = rng5 mcc = If Application.CountA(
10、rng2) = 1 Then For i = 1 To UBound(r, 1) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1) = str1) Then mcc = r(i, 1) GoTo kk End If Next i End If If Application.CountA(rng3) = 1 Then For i = 1 To UBound(r, 1) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.Worksheet
11、Function.And(r1(i, 1) = str1, r2(i, 1) = str2) Then mcc = r(i, 1) GoTo kk End If Next i End If If Application.CountA(rng4) = 1 Then For i = 1 To UBound(r, 1) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1) = str1, r2(i, 1) = str2, r3(i, 1) = str3) Then mcc = r(i, 1)
12、GoTo kk End If Next i End If If Application.CountA(rng5) = 1 Then For i = 1 To UBound(r, 1) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1) = str1, r2(i, 1) = str2, r3(i, 1) = str3, r4(i, 1) = str4) Then mcc = r(i, 1) GoTo kk End If Next i End If For i = 1 To UBound(
13、r, 1) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(i, 1) = str1, r2(i, 1) = str2, r3(i, 1) = str3, r4(i, 1) = str4, r5(i, 1) = str5) Then mcc = r(i, 1) GoTo kk End If Next i kk: End Function Public Function mccd(rng, rng1, str1, Optional rng2 = , Optional str2, Optional
14、 rng3 = , Optional str3, Optional rng4 = , Optional str4, Optional rng5 = , Optional str5) r = rng r1 = rng1 r2 = rng2 r3 = rng3 r4 = rng4 r5 = rng5 mccd = If Application.CountA(rng2) = 1 Then For i = 1 To UBound(r, 2) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i)
15、= str1) Then mccd = r(1, i) GoTo kk End If Next i End If If Application.CountA(rng3) = 1 Then For i = 1 To UBound(r, 2) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i) = str1, r2(1, i) = str2) Then mccd = r(1, i) GoTo kk End If Next i End If If Application.CountA(rng
16、4) = 1 Then For i = 1 To UBound(r, 2) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i) = str1, r2(1, i) = str2, r3(1, i) = str3) Then mccd = r(1, i) GoTo kk End If Next i End If If Application.CountA(rng5) = 1 Then For i = 1 To UBound(r, 2) UBound(a1, 1)指的是数组a1第1维度的大小
17、,即a1的行数 If Application.WorksheetFunction.And(r1(1, i) = str1, r2(1, i) = str2, r3(1, i) = str3, r4(1, i) = str4) Then mccd = r(1, i) GoTo kk End If Next i End If For i = 1 To UBound(r, 2) UBound(a1, 1)指的是数组a1第1维度的大小,即a1的行数 If Application.WorksheetFunction.And(r1(1, i) = str1, r2(1, i) = str2, r3(1,
18、i) = str3, r4(1, i) = str4, r5(1, i) = str5) Then mccd = r(1, i) GoTo kk End If Next i kk: End Function Public Function nsim(str, rng) r1 = rng r2 = rng str1 = str str2 = str v = sima(str, r(1, 1) + sima(r(1, 1), str2) str1 = str 这里不再须要赋值,因为sima设置的是值传递byval,sima调用实参str和r(1,1)不影响实参。 str2 = str k = 1
19、For i = 2 To UBound(r, 1) m = (sima(str, r(i, 1) + sima(r(i, 1), str) str1 = str str2 = str If v vba自定义函数小结 青春自定义 html运用自定义标签 MFC绘制自定义按钮 uap63自定义参照 初识朗识自定义测评 情感散文:爱的自定义 如何用自定义筛选数据 自定义内容区编辑流程 VFP0406变量作用域、自定义函数汇总(定稿) 本文来源:网络收集与整理,如有侵权,请联系作者删除,谢谢!第11页 共11页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页第 11 页 共 11 页