Excel 宏参数通过引用或常量传递

Excel 宏参数通过引用或常量传递

在 Excel 中,我编写了一个Separate如下的 VBA 函数:

Function Separate(sp As String, ParamArray ArgList() As Variant)
    Dim paramLoop As Long
    Dim curRng As Range
    Separate = ArgList(0).Cells(1, 1).Value
    Dim flag As Boolean
    flag = False
    For paramLoop = 0 To UBound(ArgList)
        For Each curRng In ArgList(paramLoop)
            If flag Then
                Separate = Separate & sp & curRng.Value
            End If
            flag = True
        Next curRng
    Next paramLoop
End Function

此函数用于连接由作为第一个参数给出的字符串分隔的任意数量的内容。

例如,=Separate(", ",A1:B2,A2)返回Alan, Bill, Carl, Dale, Bill成功。(假设这些名称已存储在单元格A1A2B1B2。)

如果将常量而不是引用传递给第二个(以及第三个等等)参数,例如,就会出现问题=Separate(", ","Alan",A2:B2)。这是因为我的代码假定是ArgList() As Variant对象Range

vba 如何确定每个参数是通过引用还是常量传递的?或者如何修改代码,以便无论参数是通过引用还是常量传递,它都执行相同的操作?

答案1

有一个 VBA 函数可以确定正在处理的变量的类型:VarType()

VarType字符串的 是( vbString8);VarType范围的 是vbArray+vbVariant(8204)。您需要测试传递的数组的每个元素并进行相应的处理。一种易于遵循的方法是Select Case

Function Separate(sp As String, ParamArray ArgList() As Variant)
    Dim paramLoop As Long
    Dim curRng As Range
    Select Case VarType(ArgList(0))
        Case vbArray + vbVariant
            Separate = ArgList(0).Cells(1, 1).Value
        Case vbString
            Separate = ArgList(0)
    End Select
    Dim flag As Boolean
    flag = True
    For paramLoop = 1 To UBound(ArgList)
        Select Case VarType(ArgList(paramLoop))
            Case vbArray + vbVariant
                For Each curRng In ArgList(paramLoop)
                    If flag Then
                        Separate = Separate & sp & curRng.Value
                   End If
                    flag = True
                Next curRng
            Case vbString
                Separate = Separate & sp & ArgList(paramLoop)
        End Select
    Next paramLoop
End Function

当然,即使您有一个空参数,也Select可以为每个参数进行扩展。vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDate, vbBoolean, vbVariant, vbDecimal, vbBytevbError

答案2

如果你将参数声明为变体在函数头中,你总是可以确定调用者真的传递如下信息:

Sub MAIN()
   x = WhatIsIt(Range("A1"))
   y = WhatIsIt("what ever")
End Sub

Public Function WhatIsIt(v As Variant) As String
   WhatIsIt = ""
   MsgBox TypeName(v)
End Function

相关内容