Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 从单元格中向自定义函数传递范围_Vba_Excel_Range - Fatal编程技术网

Vba 从单元格中向自定义函数传递范围

Vba 从单元格中向自定义函数传递范围,vba,excel,range,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(

您好,我在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)并显示为“下标超出范围”时,会出现第一个可见的问题。我也尝试过射程本身(即射程1作为射程…),但没有成功

我最大的怀疑是它与活动工作表有关,因为它是从不同的工作表调用的,而不是从带有公式的工作表调用的(工作表名称是字符串的一部分),但这一点被消除了,因为我在同一工作表内尝试了它,并在代码中指定了工作表

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


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
=平均值(多字节(“A1:A3”、“B1:B3”))

=平均值(多张纸(“我的纸1!A1:A3”,“我的纸1!B1:B3”))


当我从不同的工作表中调用它时。

首先,请参阅左侧的注释Remou,因为这确实是您应该在此处执行的操作。您根本不需要VBA来获得两个数组的元素相乘

其次,如果您想使用范围,可以通过将函数参数声明为范围类型来实现。所以你本来可以

Public Function multByElement(range1 As Range, range2 As Range)
并且不需要自己将字符串解析为范围引用。使用字符串可以防止Excel在工作表中移动内容时更新引用

最后,函数以这种方式失败的原因是,获取多单元格范围的“值”得到的数组是二维的,并且需要使用两个索引访问其元素。因为看起来您打算(按元素)将两个向量相乘,所以您可以选择其中之一

        arrayA(i) = arr1(i,1) * arr2(i,1)

取决于您希望输入的方向。(请注意,如果使用VBA执行此操作,则概念上的一维数组的方向很重要,但如果遵循上面Remou的建议,则Excel将做正确的事情,而不管您是以行还是列传递,还是以范围引用或数组文字传递。)


作为结束语,看起来您没有使用“Option Explicit”。谷歌搜索一些关于你为什么可能总是想这样做的咆哮。

我想知道你为什么不使用数组功能?也就是说,在bar=AVERAGE(A1:A3*B1:B3)中键入公式,然后按CTRL+SHIFT+ENTER,这将插入一个数组函数(它周围将有{})将A1:A3中的每个元素乘以B1:B3这是一个好主意,我已经考虑过了,但更愿意尝试一下,因为工作表上的空间和可能使用此函数的扩展。将其修复为访问2d数组使其工作正常,谢谢。就像我说的,我试着通过射程本身,但弦系统也能工作,我不必担心细胞四处移动。