将值和范围的混合转换为UDF中的单个数组

时间:2017-02-09 13:47:37

标签: excel vba excel-vba udf

我尝试在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))}是完全可以接受的,并且它包含值范围和数组的混合。我想要这个功能。

第2轮

好的,我用ReDim Preserve更新了代码,并修正了一些拼写错误等。但是怀疑公式不能将数组作为输入来处理。我检查了一个阵列TypeName,它是variant,因此我的If [...] = "Range" Then行无法接听。但是,当通过标准Else代码时,它也会引发错误。那我怎么能添加那个数组呢?

0 个答案:

没有答案