Excel VBA 非连续数组用户定义函数修复
Excel VBA Non-Contiguous Array User Defined Function Fix
我有一个用户定义的函数,如下所示,它允许我将两个不相邻的列组合成一个连续的数组。
Function MakeContig(ParamArray av() As Variant) As Variant
Dim avOut() As Variant
Dim i As Long
Dim j As Long
ReDim avOut(1 To av(0).Count, 0 To UBound(av))
For j = 0 To UBound(av)
For i = 1 To av(j).Rows.Count
avOut(i, j) = av(j)(i)
Next i
Next j
MakeContig = avOut
End Function
因此,如果我在单元格中键入“=makecontig(A1:A5,E1:E5)”,将形成一个由公式中包含的两列组成的数组。我希望能够编辑此函数,以便它忽略充满错误的数组条目或任何类型的非数组条目。
例如,如果我键入“=makecontig(A1:A5,E1:E5, , )”或“=makecontig(A1:A5,Nothing,E1:E5)”或 "=makecontig(A1:A5,E1:E5,C1:C5*#N/A)" 我希望它忽略错误或空白参数,只为 [=25 创建一个连续数组=] 和 E1:E5.
我想我需要在 UDF 的某处包含一个 If/Then 语句,但我似乎无法弄清楚如何正确执行它。
如有任何帮助,我们将不胜感激!
您需要测试参数是否是一个范围:
Function MakeContig(ParamArray av() As Variant) As Variant
Dim avOut() As Variant
Dim i As Long
Dim j As Long
Dim x As Long
Dim t As Long
x = -1
For j = 0 To UBound(av)
If TypeName(av(j)) = "Range" Then
x = x + 1
If av(j).Count > t Then
t = av(j).Count
End If
End If
Next j
ReDim avOut(1 To t, 0 To x)
t = 0
For j = 0 To UBound(av)
If TypeName(av(j)) = "Range" Then
For i = 1 To av(j).Rows.Count
avOut(i, t) = av(j)(i)
Next i
t = t + 1
End If
Next j
MakeContig = avOut
End Function
如您所见:
MakeContig($F:$F+#N/A,$A:$A,$C:$C,$B:$B*#N/A)
returns 只有一个 2 列宽的数组:
我有一个用户定义的函数,如下所示,它允许我将两个不相邻的列组合成一个连续的数组。
Function MakeContig(ParamArray av() As Variant) As Variant
Dim avOut() As Variant
Dim i As Long
Dim j As Long
ReDim avOut(1 To av(0).Count, 0 To UBound(av))
For j = 0 To UBound(av)
For i = 1 To av(j).Rows.Count
avOut(i, j) = av(j)(i)
Next i
Next j
MakeContig = avOut
End Function
因此,如果我在单元格中键入“=makecontig(A1:A5,E1:E5)”,将形成一个由公式中包含的两列组成的数组。我希望能够编辑此函数,以便它忽略充满错误的数组条目或任何类型的非数组条目。
例如,如果我键入“=makecontig(A1:A5,E1:E5, , )”或“=makecontig(A1:A5,Nothing,E1:E5)”或 "=makecontig(A1:A5,E1:E5,C1:C5*#N/A)" 我希望它忽略错误或空白参数,只为 [=25 创建一个连续数组=] 和 E1:E5.
我想我需要在 UDF 的某处包含一个 If/Then 语句,但我似乎无法弄清楚如何正确执行它。
如有任何帮助,我们将不胜感激!
您需要测试参数是否是一个范围:
Function MakeContig(ParamArray av() As Variant) As Variant
Dim avOut() As Variant
Dim i As Long
Dim j As Long
Dim x As Long
Dim t As Long
x = -1
For j = 0 To UBound(av)
If TypeName(av(j)) = "Range" Then
x = x + 1
If av(j).Count > t Then
t = av(j).Count
End If
End If
Next j
ReDim avOut(1 To t, 0 To x)
t = 0
For j = 0 To UBound(av)
If TypeName(av(j)) = "Range" Then
For i = 1 To av(j).Rows.Count
avOut(i, t) = av(j)(i)
Next i
t = t + 1
End If
Next j
MakeContig = avOut
End Function
如您所见:
MakeContig($F:$F+#N/A,$A:$A,$C:$C,$B:$B*#N/A)
returns 只有一个 2 列宽的数组: