gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:46:15 26 4
gpt4 key购买 nike

您好,我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com