我尝试在Excel宏(特别是此UDF)中从另一个内容构建一个数组
Sub Call_Probably()
Debug.Print PROBABLY(1," a"," b",范围(" A2"," A3")) 结束子
Public Function PROBABLY(ParamArray inputArray() As Variant) As String
Dim inElement As Variant
Dim outputArray() As Variant
Dim subcell As Range
'convert ranges to values
'creating a new array from the mixture of ranges and values in the input array
ReDim outputArray(0)
For Each inElement In inputArray
'Normal values get copied from the input UDF to an output array, ranges get split up then appended
If TypeName(inElement) = "Range" Then
For Each subcell In inElement
outputArray(UBound(outputArray)) = subcell
ReDim Preserve outputArray(UBound(outputArray) + 1)
Next subcell
Else
'Stick the element on the end of an output array
outputArray(UBound(outputArray)) = inElement
ReDim Preserve outputArray(UBound(outputArray) + 1)
End If
Next inElement
ReDim Preserve outputArray(UBound(outputArray) - 1)
PROBABLY = outputArray(outputArray(0))
End Function
我尝试做的是循环遍历inputArray()
的元素,对于简单的值(数字,单词),我将该值放入outputArray
,用于值的范围(比如B5:B6的A2)我循环那个范围并将subcell
的值粘贴到outputArray
的末尾。我认为问题是redim
清除了数组内容,所以我只剩下最后一个结果卡在最后。
我也不喜欢If TypeName(inElement) = "Range"
;它假定用户可以输入的唯一值是值(例如1," cat",TRUE)或范围(例如A1,A1:B3)。如果用户输入数组公式,使inputArray
的其中一个元素为{1,1,0,0},该怎么办?这不是一个简单的单一值,也不是一个范围 - 所以也许它在UDF中没有被解释?就像我输入一样
{=PROBABLY(G5,"a","b",IF(A2:A3<0,1,A2:A3))}
我无法对此进行测试,因为我不知道如何使用vba中的数组公式输入来调用我的UDF,因此我无法对其进行调试。
理想情况下,我想要的是,我的UDF的ParamArray
参数中引用的所有元素都以分解方式拆分和重新组合。我认为=SUM()
以这种方式工作,因为{=SUM(2,A2:A3,IF(ISTEXT(B1:B3),1,0))}
是完全可以接受的,并且它包含值范围和数组的混合。我想要这个功能。
好的,我用ReDim Preserve
更新了代码,并修正了一些拼写错误等。但是怀疑公式不能将数组作为输入来处理。我检查了一个阵列TypeName
,它是variant
,因此我的If [...] = "Range" Then
行无法接听。但是,当通过标准Else
代码时,它也会引发错误。那我怎么能添加那个数组呢?