如果返回的数组只有一个元素,则自定义项在excel数组公式中的结果不正确

efzxgjgh  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(64)

这似乎是一个简单的问题,但我却无法解决。
在我的UDF中,结果是一个动态数组,它溢出在一个单元格范围内。Excel不是365,所以我选择了一个未定义的单元格数量,然后检查结果中的值不是#N/A,并在其上“调整”结果。
问题是,如果返回的数组的长度只有一个,那么所选单元格中的所有其他单元格都会得到与返回值相同的结果(第一个单元格)。除了第一个单元格之外,所有其他单元格都需要#N/A。在“超过范围单元格”中肯定需要错误值

Function testoneresult(length As Integer)

ReDim a(length - 1)
For i = 0 To length - 1
  a(i) = Rnd()
Next i
testoneresult = a
End Function

字符串

结果

x1c 0d1x的数据
我试过一些小把戏,但都不管用
尺寸a(长度-1,0)或
B=a(0)testoneresult=B或
dim a(长度)(在这种情况下,第二个值为0)或
a(长度)=1/0(所有单元格#VALUE(预期))
这是否是一个版本相关的结果,是否有解决方案?

ax6ht2ek

ax6ht2ek1#

你可以使用Application.Caller来确定你的函数被应用到什么范围。Application.Caller不一定每次都是一个范围,所以它需要被测试,但除此之外,它很容易管理你的案例:

Function testoneresult(ByVal length As Integer) As Variant
    Dim a As Variant
    If TypeName(Application.Caller) = "Range" Then
        ReDim a(1 To Application.Caller.Columns.Count)
        If length > Application.Caller.Columns.Count Then length = Application.Caller.Columns.Count
    Else
        ReDim a(1 To length)
    End If
    Dim i As Long
    For i = LBound(a) To length
      a(i) = Rnd()
    Next i
    For i = 1 + length To UBound(a)
        a(i) = CVErr(xlErrNA)
    Next i
    testoneresult = a
End Function

字符串
注意:如果你输入公式=testoneresult(ROW()),你会发现它不起作用。
原因是ROW()在数组公式中使用时返回一个1列数组。要有一个合适的整数,您需要键入例如=testoneresult(MIN(ROW())
或者,您可以将参数更改为length as Variant,检测它是整数还是数组,如果是后者,则返回length中每个项目1行的二维数组。

相关问题