在 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
成功。(假设这些名称已存储在单元格A1
、A2
和B1
中B2
。)
如果将常量而不是引用传递给第二个(以及第三个等等)参数,例如,就会出现问题=Separate(", ","Alan",A2:B2)
。这是因为我的代码假定是ArgList() As Variant
对象Range
。
vba 如何确定每个参数是通过引用还是常量传递的?或者如何修改代码,以便无论参数是通过引用还是常量传递,它都执行相同的操作?
答案1
有一个 VBA 函数可以确定正在处理的变量的类型:VarType()
。
VarType
字符串的 是( vbString
8);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, vbByte
vbError
答案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