将范围传递到单元格内的自定义函数

您好我在Excel中使用VBA,并需要从两个范围的值传入一个单元格的公式内的自定义函数。 该函数如下所示:

Public Function multByElement(range1 As String, range2 As String) As Variant Dim arr1() As Variant, arr2() As Variant arr1 = Range(range1).value arr2 = Range(range2).value If UBound(arr1) = UBound(arr2) Then Dim arrayA() As Variant ReDim arrayA(LBound(arr1) To UBound(arr1)) For i = LBound(arr1) To UBound(arr1) arrayA(i) = arr1(i) * arr2(i) Next i multByElement = arrayA End If End Function 

正如你所看到的,我试图传递范围的string表示。 在debugging器中,我可以看到它们被正确地传入,并且当它试图读取arr1(i)并且显示为“下标超出范围”时出现第一个可见的问题。 我也尝试传递范围本身(即范围1作为范围…),但没有成功。

我最好的怀疑是它与活动工作表有关,因为它是从与公式不同的工作表调用的(表名是string的一部分),但是由于我在同一个工作表工作表和通过在代码中指定工作表。

顺便说一句,单元格中的公式如下所示:

= AVERAGE(multByElement( “A1:A3”, “B1:B3”))

要么

= AVERAGE(multByElement(“My Sheet1!A1:A3”,“My Sheet1!B1:B3”))

因为当我从另一张表调用它。

首先看到Remou留下的评论,因为这真的是你应该在这里做的。 你根本不需要VBA来获得两个数组的元素相乘。

其次,如果你想使用范围,你可以通过声明你的函数参数是Rangetypes。 所以你可以有

 Public Function multByElement(range1 As Range, range2 As Range) 

而不需要将stringparsing为范围引用。 使用string可防止Excel在工作表中移动时更新引用。

最后,你的函数失败的原因是因为从一个多单元格Range的'Value'获得的数组是二维的,你需要使用两个索引来访问它的元素。 因为它看起来像你打算(元素)乘以两个向量,你也可以做

  arrayA(i) = arr1(i,1) * arr2(i,1) 

要么

  arrayA(i) = arr1(1,i) * arr2(1,i) 

取决于您从input中预期的方向。 (请注意,如果你使用VBA进行这个操作,从概念上讲是一维数组的方向,但是如果你按照上面的Remou的build议,Excel将会做正确的事情,无论你是传递行还是列,还是范围引用或数组文字。)

作为一个结语,它也看起来像你不使用“选项显式”。 谷歌周围的一些咆哮,为什么你可能总是想这样做。