UDF 中缺少 ParamArray
Missing ParamArray in a UDF
我正在尝试确定何时在未提供 ParamArray 参数的情况下在工作表上使用了使用 ParamArray 的用户定义函数 (UDF)。
我已经尝试过 IsEmpty、IsArray、IsError、与无比较、与零长度字符串比较等
我知道 paramarray 总是 byVal 并且变体数组总是从零开始,但如果它不存在,它怎么是一个数组?
- 将数组的第一个元素与 Nothing 或 Not Nothing 进行比较会引发错误
- IsEmpty 报告错误
- IsArray 奇怪地报告 True
- IsError 对于两个测试和测试 (0) 都报告 False
测试参数 UDF:
Public Function testParams(ByRef ndx As Long, ParamArray tests())
Select Case ndx
Case 1
testParams = CBool(tests(LBound(tests)) Is Nothing)
Case 2
testParams = IsEmpty(tests)
Case 3
testParams = IsArray(tests)
Case 4
testParams = IsError(tests)
Case 5
testParams = CBool(tests(LBound(tests)) = vbNullString)
End Select
End Function
在下面的示例中,我只是返回工作表尝试访问 ParamArray returns。
如何确定用户是否没有在需要它们的真实 UDF 中提供 ParamArray 参数?我更喜欢简单的布尔检查而不是测试是否有东西是什么。
长话短说 - 使用 if IsMissing(tests) Then ...
NTL&WR:
即使 ParamArray 不能与任何声明的 Optional 参数(包括 ParamArray 本身)一起使用,如果省略它也不会引发错误。可以很容易地说明 ParamArray 始终是可选的,尽管它不能这样标记。
From: Parameter Arrays (Visual Basic)
The parameter array is automatically optional. Its default value is an empty one-dimensional array of the parameter array's element type.
用户未提供的 ParamArray 将是一个已实例化但既未填充也未确定尺寸的变体数组。
它将被定义为 LBound of 0 (zero) and a UBound -1(减一)。这与声明但未标注尺寸的任何其他变体数组相同。
因为也是always a variant type parameter, it will also correctly report its presence or absence with IsMissing。
Public Function testParams(ByRef ndx As Long, ParamArray tests())
Select Case ndx
Case 1
testParams = CBool(tests(LBound(tests)) Is Nothing)
Case 2
testParams = IsEmpty(tests)
Case 3
testParams = IsArray(tests)
Case 4
testParams = IsError(tests)
Case 5
testParams = CBool(tests(LBound(tests)) = vbNullString)
Case 6
testParams = CBool(UBound(tests) = -1)
Case 7
testParams = IsMissing(tests)
End Select
End Function
测试 IsMissing 或 UBound 值 -1 将确定用户是否提供了参数数组。
http://www.cpearson.com/Excel/IsArrayAllocated.aspx
对数组分配有很好的解释
摘录:
The function below, IsArrayAllocated
will accurately return True or False indicating whether the array is allocated. This function will work for both static and dynamic arrays of any number of dimensions, and will correctly work for unallocated arrays with valid (non-error-causing) LBound
values
和函数
Function IsArrayAllocated(Arr() As Variant) As Boolean
On Error Resume Next
IsArrayAllocated = IsArray(Arr) And _
Not IsError(LBound(Arr, 1)) And _
LBound(Arr, 1) <= UBound(Arr, 1)
End Function
将其与 Function
参数数组
一起使用
Function MyFunc(ParamArray pa()) As Variant
Dim v()
v = pa
If IsArrayAllocated(v) Then
'Do stuff with the parameters
Else
'There are no parameters...
End If
End Function
我正在尝试确定何时在未提供 ParamArray 参数的情况下在工作表上使用了使用 ParamArray 的用户定义函数 (UDF)。
我已经尝试过 IsEmpty、IsArray、IsError、与无比较、与零长度字符串比较等
我知道 paramarray 总是 byVal 并且变体数组总是从零开始,但如果它不存在,它怎么是一个数组?
- 将数组的第一个元素与 Nothing 或 Not Nothing 进行比较会引发错误
- IsEmpty 报告错误
- IsArray 奇怪地报告 True
- IsError 对于两个测试和测试 (0) 都报告 False
测试参数 UDF:
Public Function testParams(ByRef ndx As Long, ParamArray tests())
Select Case ndx
Case 1
testParams = CBool(tests(LBound(tests)) Is Nothing)
Case 2
testParams = IsEmpty(tests)
Case 3
testParams = IsArray(tests)
Case 4
testParams = IsError(tests)
Case 5
testParams = CBool(tests(LBound(tests)) = vbNullString)
End Select
End Function
在下面的示例中,我只是返回工作表尝试访问 ParamArray returns。
如何确定用户是否没有在需要它们的真实 UDF 中提供 ParamArray 参数?我更喜欢简单的布尔检查而不是测试是否有东西是什么。
长话短说 - 使用 if IsMissing(tests) Then ...
NTL&WR:
即使 ParamArray 不能与任何声明的 Optional 参数(包括 ParamArray 本身)一起使用,如果省略它也不会引发错误。可以很容易地说明 ParamArray 始终是可选的,尽管它不能这样标记。
From: Parameter Arrays (Visual Basic)
The parameter array is automatically optional. Its default value is an empty one-dimensional array of the parameter array's element type.
用户未提供的 ParamArray 将是一个已实例化但既未填充也未确定尺寸的变体数组。
它将被定义为 LBound of 0 (zero) and a UBound -1(减一)。这与声明但未标注尺寸的任何其他变体数组相同。
因为也是always a variant type parameter, it will also correctly report its presence or absence with IsMissing。
Public Function testParams(ByRef ndx As Long, ParamArray tests())
Select Case ndx
Case 1
testParams = CBool(tests(LBound(tests)) Is Nothing)
Case 2
testParams = IsEmpty(tests)
Case 3
testParams = IsArray(tests)
Case 4
testParams = IsError(tests)
Case 5
testParams = CBool(tests(LBound(tests)) = vbNullString)
Case 6
testParams = CBool(UBound(tests) = -1)
Case 7
testParams = IsMissing(tests)
End Select
End Function
测试 IsMissing 或 UBound 值 -1 将确定用户是否提供了参数数组。
http://www.cpearson.com/Excel/IsArrayAllocated.aspx
对数组分配有很好的解释摘录:
The function below,
IsArrayAllocated
will accurately return True or False indicating whether the array is allocated. This function will work for both static and dynamic arrays of any number of dimensions, and will correctly work for unallocated arrays with valid (non-error-causing)LBound
values
和函数
Function IsArrayAllocated(Arr() As Variant) As Boolean
On Error Resume Next
IsArrayAllocated = IsArray(Arr) And _
Not IsError(LBound(Arr, 1)) And _
LBound(Arr, 1) <= UBound(Arr, 1)
End Function
将其与 Function
参数数组
Function MyFunc(ParamArray pa()) As Variant
Dim v()
v = pa
If IsArrayAllocated(v) Then
'Do stuff with the parameters
Else
'There are no parameters...
End If
End Function