Arrays 将范围传递给Excel用户定义函数并将其分配给数组

Arrays 将范围传递给Excel用户定义函数并将其分配给数组,arrays,excel,range,user-defined-functions,vba,Arrays,Excel,Range,User Defined Functions,Vba,我正在努力 将两个范围(多行单列)传递给Excel 2007中的用户定义函数 然后将其分配给一个数组进行处理 有人能告诉我如何将这样的范围分配给数组吗 范围不是恒定的,因为我在不同的单元格中为不同的数据使用UDF,所以我不能使用例如,range(“A1:A10”) 当我只使用Data1.Rows.Cells(I,1)而不是数组时,代码正在工作。但我认为为了提高效率,最好使用一维数组 这是我目前的代码 Function Sample(Data1 As Range, Data2 As Range)

我正在努力

  • 将两个范围(多行单列)传递给Excel 2007中的用户定义函数
  • 然后将其分配给一个数组进行处理 有人能告诉我如何将这样的范围分配给数组吗

    范围不是恒定的,因为我在不同的单元格中为不同的数据使用UDF,所以我不能使用例如,
    range(“A1:A10”)

    当我只使用
    Data1.Rows.Cells(I,1)
    而不是数组时,代码正在工作。但我认为为了提高效率,最好使用一维数组

    这是我目前的代码

    Function Sample(Data1 As Range, Data2 As Range) As Double
    
     'Size of Data1 and Data2
     Dim rows As Integer
     rows = Data1.Rows.Count 
    
     'Declaring two one dimensional arrays
     Dim data1Array(rows) As Double --- Getting error here
     Dim data2Array(rows) As Double --- Getting error here
    
     Dim diff As Double
     Dim average As Double
     Dim i As Integer
    
     'Assigning Range to Array
     data1Array = Data1 --- Getting Error here
     data2Array = Data2 --- Getting Error here
    
     average = 0
     diff = 0
    
     For i = 1 To rows
    
       diff = data1Array(i) - data2Array(i)
    
       If diff < 0 Then
         diff = diff * -1
       End If
    
       average = diff + average
    
     Next i
    
     Sample = average/rows
    
    End Function
    
    函数示例(数据1作为范围,数据2作为范围)作为双精度
    '数据1和数据2的大小
    将行设置为整数
    rows=Data1.rows.Count
    '声明两个一维数组
    将data1Array(行)变暗为双精度--此处获取错误
    将data2Array(行)变暗为Double--此处获取错误
    Dim diff为双精度
    将平均值调整为双精度
    作为整数的Dim i
    '将范围分配给数组
    data1Array=Data1---此处获取错误
    data2Array=Data2---此处获取错误
    平均值=0
    差异=0
    对于i=1到行
    差异=数据1阵列(i)-数据2阵列(i)
    如果差值<0,则
    差异=差异*-1
    如果结束
    平均值=差异+平均值
    接下来我
    样本=平均值/行数
    端函数
    
    类似这样的东西可以用于1D范围,包括测试

  • 不等幅
  • 单单元格范围(不能使用变体)
  • 样本子项

    Sub Test()
    MsgBox Sample([a1:a3], [a5:a7])
    End Sub
    
    功能

     Function Sample(Data1 As Range, Data2 As Range)
    
     Dim X
     Dim Y
     Dim lngCnt As Long
     Dim dbDiff As Double
     Dim dbAvg As Double
    
     If Data1.rows.Count <> Data2.rows.Count Then
     Sample = "Different range sizes"
     Exit Function
     ElseIf Data1.rows.Count = 1 Then
     Sample = "Single cell range"
     Exit Function
     End If
    
     X = Application.Transpose(Data1)
     Y = Application.Transpose(Data2)
    
     For lngCnt = 1 To UBound(X)
       dbDiff = X(lngCnt) - Y(lngCnt)
       If dbDiff < 0 Then
         dbDiff = dbDiff * -1
       End If
       dbAvg = dbDiff + dbAvg
     Next
    
     Sample = dbAvg / lngCnt
    
    End Function
    
    函数示例(数据1作为范围,数据2作为范围)
    暗X
    暗淡的
    暗长
    Dim-dbDiff为双精度
    将dbAvg设置为双精度
    如果Data1.rows.Count Data2.rows.Count,则
    示例=“不同的范围大小”
    退出功能
    ElseIf Data1.rows.Count=1,则
    Sample=“单个单元格范围”
    退出功能
    如果结束
    X=应用程序转置(数据1)
    Y=应用程序转置(数据2)
    对于lngCnt=1至UBound(X)
    dbDiff=X(lngCnt)-Y(lngCnt)
    如果dbDiff<0,则
    dbDiff=dbDiff*-1
    如果结束
    dbAvg=dbDiff+dbAvg
    下一个
    样本=dbAvg/lngCnt
    端函数
    
    将Data1Array和Data2Array声明为变体(否则将无法为其分配范围)。感谢您的更正,第二个错误消失了。但第一个仍然存在。现在我可以访问Data1Array中的数据,但是可以通过像Data1Array(I,1)这样的两个维度来访问。它可以像这样的Data1Array(i)即一维吗?首先,不要使用
    作为变量名-这是Excel VBA中的关键词…用以下方式声明数组变量:
    将Data1Array变为变量
    。当调用line
    data1Array=Data1
    时,将自动设置数组的维度。@MrA2Z-是<代码>应用程序。转置可以强制将单行或单列2D变量转换为1D。请参见下文,我如何创建接受范围数组的函数?