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

时间:2010-06-10 20:55:17

标签: excel vba excel-vba range

您好我在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”))

当我从另一张纸上调用它时。

1 个答案:

答案 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'。谷歌周围的一些咆哮,为什么你可能总是想要这样做。