您好我在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
如您所见,我正在尝试传递范围的字符串表示。在调试器中,我可以看到它们被正确传入,并且当它尝试读取arr1(i)并显示为“下标超出范围”时出现第一个可见问题。我也试过传递范围本身(即range1作为Range ......)但没有成功。
我最好的怀疑是它与活动表有关,因为它是从具有公式的表单(表单名称是字符串的一部分)的另一张表中调用的,但是因为我从在同一张纸中,并在代码中指定纸张。
BTW,单元格中的公式如下:= AVERAGE(multByElement( “A1:A3”, “B1:B3”))
或
= AVERAGE(multByElement(“My Sheet1!A1:A3”,“My Sheet1!B1:B3”))
当我从另一张纸上调用它时。
答案 0 :(得分:3)
首先,看看Remou留下的评论,因为那真的是你应该在这里做的。您根本不需要VBA来获得两个数组的元素乘法。
其次,如果你想使用Ranges,你可以通过声明你的函数参数是Range类型来做到这一点。你可以拥有
Public Function multByElement(range1 As Range, range2 As Range)
并且不需要自己将字符串解析为范围引用。使用字符串可防止Excel在工作表中移动时更新引用。
最后,你的函数失败的原因是因为你从多单元格范围的'Value'得到的数组是二维的,你需要用两个索引访问它的元素。因为看起来你打算(逐个元素)乘以两个向量,你可以做任何一个
arrayA(i) = arr1(i,1) * arr2(i,1)
或
arrayA(i) = arr1(1,i) * arr2(1,i)
取决于您对输入的预期方向。 (请注意,如果使用VBA执行此操作,概念上一维阵列的方向很重要,但如果您遵循上面的Remou建议,无论您是否传入行或列,或范围引用,Excel都会做正确的事情或数组文字。)
作为结语,看起来你还没有使用'Option Explicit'。谷歌周围的一些咆哮,为什么你可能总是想要这样做。