您好,我在 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 作为范围...)但没有成功。
我最大的怀疑是它与事件工作表有关,因为它是从另一个工作表调用的,而不是从具有公式的工作表调用的(工作表名称是字符串的一部分),但由于我从在同一张工作表中并通过在代码中指定工作表。
顺便说一句,单元格中的公式如下所示:
=AVERAGE(multByElement("A1:A3","B1:B3"))
或
=AVERAGE(multByElement("My Sheet1!A1:A3","My Sheet1!B1:B3"))
当我从不同的工作表调用它时。
最佳答案
首先,请参阅 Remou 留下的评论,因为这确实是您应该在这里做的。您根本不需要 VBA 来获得两个数组的逐元素乘法。
其次,如果您想使用范围,可以通过将函数参数声明为范围类型来实现。所以你可以有
Public Function multByElement(range1 As Range, range2 As Range)
并且不需要自己将字符串解析为范围引用。使用字符串可防止 Excel 在工作表中移动时更新引用。
最后,您的函数之所以失败,是因为您从多单元格范围的“值”中获取的数组是二维的,您需要使用两个索引访问其元素.因为看起来您打算(按元素)将两个向量相乘,所以您可以做任何一个
arrayA(i) = arr1(i,1) * arr2(i,1)
或
arrayA(i) = arr1(1,i) * arr2(1,i)
取决于您对输入的期望方向。 (请注意,如果您使用 VBA 执行此操作,概念上一维数组的方向很重要,但如果您遵循 Remou 上面的建议,Excel 将做正确的事情,无论您是传入行或列,还是范围引用或数组文字。)
作为结语,您似乎也没有使用“Option Explicit”。在 Google 上搜索一些关于为什么你可能总是想这样做的咆哮。
关于vba - 将范围从单元格内传递到自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018446/