vba - 将范围从单元格内传递到自定义函数

标签 vba excel 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 作为范围...)但没有成功。

我最大的怀疑是它与事件工作表有关,因为它是从另一个工作表调用的,而不是从具有公式的工作表调用的(工作表名称是字符串的一部分),但由于我从在同一张工作表中并通过在代码中指定工作表。

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

=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/

相关文章:

vba - 如何以编程方式识别所选幻灯片是 PowerPoint 2003 中的母版幻灯片

Excel:如果单元格值增加->播放声音

Python - 计算列表中特定范围的出现次数

c++ - 如何写一个简单的范围概念?

mysql - Microsoft Access SQL查询两个表多对一

excel - 离线数据输入选项

vba - 使用 VBA 将 XLSX 转换为 CSV

c++ - 删除单向链表中特定数值范围之外的节点

excel - 我可以使用 VBA 检测数字是否以文本形式存储在单元格中吗?