vba 自定义function返回值_Excel VBA解读(131): 理解Function过程的使用细节

学习Excel技术,关注微信公众号:

excelperfect

Function过程能够让我们自定义可以返回值的函数,减少复杂性,扩展功能,提高效率。在使用VBA编写自定义函数时,了解一些注意事项,掌握一些技术技巧,能够帮助我们顺利创造自已的函数。

让自定义函数返回指定类型的数组

如下图1所示,在消息框中显示了工作表单元格地址及对应的值。

357c9199cc8ccffef4f5c506819f66ec.png

图1

这里,使用自定义函数PopulateArray来返回包含单元格地址的数组。

Function PopulateArray(str AsString) As String()

   Dim strTempArray(1 To 9) As String

   Dim i As Integer

   For i = 1 To 9

        strTempArray(i) = str & CStr(i)

   Next i

   PopulateArray = strTempArray

End Function

PopulateArray函数接受所传递的字符串值,并将其与数字合并成一个字符串,然后将合并的字符串值赋值给数组元素,最后将得到的数组赋值给函数名,作为函数过程的返回值。

下面的test过程调用PopulateArray函数,传递列字母A作为参数,将函数的返回值赋值给动态数组strArray,然后取数组中的值并与相应单元格值组合。

Sub test()

   Dim i As Integer

   Dim strUnion As String

   Dim strArray() As String

   strArray = PopulateArray("A")

   For i = 1 To UBound(strArray)

        strUnion = strUnion & strArray(i) _

              & vbTab &Range("A" & i).Value & vbNewLine

   Next i

   MsgBox strUnion

End Sub

从上面的例子可以看出:

  • 自定义函数的返回值可以是指定数据类型的数组,本例中为String型数组。

  • 要使自定义函数的返回值是指定数据类型的数组,必须在自定义函数声明时,在数据类型后添加括号。

  • 在调用过程中,接受自定义函数所返回数组的数组应声明为动态数组,其大小未显式定义。

  • 在调用过程中,调用自定义函数所返回的数组必须赋值给相同类型的数组。

可以从自定义函数返回一个包含数组的Variant型变量。例如下面的代码:

Sub testVarArray()

   Dim i As Integer

   Dim myArray As Variant

   myArray = varArray()

   For i = LBound(myArray, 1) To UBound(myArray, 1)

        Debug.Print myArray(i, 1)

   Next i

End Sub

Function varArray() As Variant

   varArray = Range("A1:A9")

End Function

运行testVarArray过程后的结果如下图2所示。

6395fe000bce1a360589a17dba29814d.png

图2

注意,将单元格区域赋值组Variant型变量时,该变量包含的是一个二维数组。

参数值的传递方式

不要将向自定义函数传递参数值的ByRef和ByVal方法弄混淆。ByRef是按引用传递,对函数过程中参数变量值的改变将会影响到调用过程中传递给该参数的变量值;ByVal是按值传递,对函数过程中参数变量值的改变不会影响到调用过程中传递给该参数的变量值。如果没有指定参数的传递方式,则默认为ByRef。

使用ByRef方式传递参数,可以让自定义函数不仅通过函数名返回值,也通过参数返回值,如下面的代码:

Sub testReturnValue()

   Dim i As Integer

   i = 1

   If ReturnValue(i) = True Then

        Debug.Print i

   End If

End Sub

Function ReturnValue(ByRef myValueAs Integer) As Boolean

   myValue = myValue + 1

   ReturnValue = True

End Function

运行代码后的结果如下图3所示。ReturnValue函数返回值True,同时改变了参数myValue的值,从而影响调用过程中参数i的值相应改变。

51ac33a9f71b57bfeeef640d93970fcb.png

图3

使用可选参数增加灵活性

在编写自定义函数时,可以使用Optional来指定可选参数,并且还可以为可选参数指定默认值,这是非常方便灵活的。

此外,在使用可选参数时,还可以使用IsMissing函数方便地检测可选参数的值。如果IsMissing函数返回True,则可以知道在调用函数时没有提供可选参数。如下面的代码所示:

Sub testOptionArgument()

   Dim i As Integer

   Dim iOption As Integer

   i = 1

   iOption = 100

   Debug.Print OptionArgument(i)

End Sub

Function OptionArgument(ByRef iValAs Integer, _

        Optional iTwo As Integer)

   If IsMissing(iTwo) Then

        OptionArgument = iVal

   Else

        OptionArgument = iVal + iTwo

   End If

End Function

运行代码后的结果如下图4所示。

4ff0a853754906afdb5b6267d041b3d5.png

图4

在自定义函数中接受多个参数

在自定义函数中,使用ParamArray指定的参数可以接受多个值。但是使用ParamArray声明的参数:

  • 必须为Variant类型的数组。

  • 必须在声明的最后部分。

在调用使用ParamArray指定参数的自定义函数时,调用过程无需显式将数组传递给该参数,传递给该参数的各元素是使用逗号分隔的值或变量。如下面的代码:

Sub testParamArray()

   Debug.Print ParamArraySample(1, 2, 3, 4, 5)

End Sub

Function ParamArraySample(ByRef iAs Integer, _

   ParamArray someArgs() As Variant) As Integer

   Dim iResult As Integer

   Dim varArg As Variant

   For Each varArg In someArgs

        iResult = iResult + varArg

   Next varArg

   ParamArraySample = i + iResult

End Function

运行代码后的结果如下图5所示。

887664e610bfbf07bb4058f5b01796c5.png

图5

72d63cf6bac056759dfbb73429daa708.png

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页