vba 自定义函数说明
函数定义
VBA定义的函数可以在工作表使用,如果是在加载插件中定义函数,本机所有打开工作簿都可以使用该函数,当然可以在过程sub中调用函数;
VBA函数与sub过程不同的是,函数有返回内容;过程和函数都可以传入参数。函数使用Function关键字定义,定义规则如下:Function 函数名称(形参及类型)函数主体函数名称= 函数返回End Function示例:
'定义一个数值平方的函数,形参:a,形参a类型:long,函数返回:a ^ 2;函数名称:test
Function test(a as long)
test = a ^ 2
End Function
'定义全局函数,使用public关键字,这个关键字跟变量定义是一致的。后面跟的as long是返回类型
Public Function test(a as long) as long
test = a ^ 2
End Function
传值和传引用
函数或方法传值使用关键字ByVal,传引用使用关键字ByRef
Sub num_print()
Dim i, num As Long  ' 定义一个变量
num = 0
For i = 1 To 10
    s = add(num)    ' 调用add函数s
    Debug.Print num    ' 函数参数是传引用,会依次打印1,2,3,,,,10
Next
End Sub
Function add(ByRef a As Variant)
a = a + 1
End Function
如果上述函数参数为传值ByVal,则函数不影响方法num_print中变量num的改变,全打印0;
函数返回对象
函数也可以返回对象,返回对象要使用set关键字;示例:返回字典
字符串函数传参Function aa()
Dim d As Object
Set d = CreateObject("scripting.dictionary")
today = Date
the_month_date = CDate(Year(Date) & "-" & Month(Date) & "-" & 20)  '这个月的20号
last_month_date = Application.WorksheetFunction.EDate(the_month_date, -1)  '上个月的20号
d("today") = today
d("the_month_date") = the_month_date
d("last_month_date") = last_month_date
d("the_month") = Month(last_month_date)      '这个月
d("last_month") =Month(Date)  '上个月
Set aa = d        '返回对象使用set关键字
End Function
'函数调用
sub test1()
dim d1 as object
set d1 = aa()
debug.print d1("today")    '打印字典键today对应的值
end sub
使用默认参数
函数传入参数格式:形参 as 参数类型 = 参数默认值示例:正则提取函数
Function regexp(rg As Variant, str As String, Optional mat As Byte = 0, Optional group As Variant = Empty)
'Optional表示参数不是必需的关键字。如果使用了该选项,则参数表中该参数后的参数都必须是可选的,而且必须都使用 Optional 关键字声明。
Dim re As Object
Set re = CreateObject("p")
    With re
        .Global = True
        .Pattern = str
        st(rg) Then
            If group = Empty Then
                regexp = re.Execute(rg)(mat)
            Else
                regexp = re.Execute(rg)(mat).submatches(group)
            End If
        End If
    End With
Set re = Nothing
End Function
使用不定长参数
形参及类型固定写法:ParamArray 参数名称() As Variant(必须放在参数最后面)示例:只要有一个单元格为空,返回空字符串
Function if_blank(goal_rg As Variant, ParamArray rngs() As Variant)
Dim rg
For Each rg In rngs
    If rg.Value = "" Then
        if_blank = ""
        Exit Function
    End If
Next
if_blank = goal_rg
End Function
示例:单元格求和sum
Function rng_sum(ParamArray values() As Variant)
Dim result As Variant     
Dim val0 As Variant    ' for循环里的变量必须是变体型变量,否则会报错
result = 0
For Each val0 In values
    For Each val1 In val0
        result = result + val1
    Next
Next
rng_sum = result
End Function
'然后我们在工作表里写了这么一个函数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。