Arrays 接受范围作为数组参数

Arrays 接受范围作为数组参数,arrays,vba,excel,Arrays,Vba,Excel,我有一个函数,它接受一个数组并输出另一个数组。它的内部结构比下面的玩具示例更复杂 Public Function divide_by_2_5(ByRef coeffs() As Double) As Double() Dim Columns As Integer Columns = UBound(coeffs, 2) - LBound(coeffs, 2) + 1 Dim output() As Double ReDim output(1 To 1, 1 To C

我有一个函数,它接受一个数组并输出另一个数组。它的内部结构比下面的玩具示例更复杂

Public Function divide_by_2_5(ByRef coeffs() As Double) As Double()
    Dim Columns As Integer
    Columns = UBound(coeffs, 2) - LBound(coeffs, 2) + 1
    Dim output() As Double
    ReDim output(1 To 1, 1 To Columns)
    Dim i As Integer
    For i = 1 To Columns
        output(1, i) = coeffs(1, i) / 2.5
    Next i
    divide_by_2_5 = output
End Function
我看到的是:

我希望第二行包含函数的输出。在这种情况下,这将是
0.4,0.4,0.4,0.4

不幸的是,我得到了一个
#值错误,我不知道如何调试


一些说明:显然,可以让相同的函数返回数组或将其写入电子表格(使用
Ctrl
-
Shift
-
Enter
)。类似地,输入是否可能来自范围或数组?

将传递的参数更改为范围变量

Public Function divide_by_2_5(ByRef inputRange As Range) As Double()
    Dim output() As Double
    ReDim output(1 To inputRange.Rows.Count, 1 To inputRange.Columns.Count) As Double
    Dim r As Long
    Dim c As Long
    For r = 1 To inputRange.Rows.Count
        For c = 1 To inputRange.Columns.Count
            output(r, c) = inputRange.Cells(r, c).Value / 2.5
        Next
    Next
    divide_by_2_5 = output
End Function
注意:我最初认为可以将一个变量数组传递到函数中,但由于使用

Public Function divide_by_2_5(ByRef x As Variant) As Double()
而不是

Public Function divide_by_2_5(ByRef x() As Variant) As Double()

因此,我正在测试的版本不接受变体数组,只是一个包含范围对象的变体。然后在随后的测试代码中,我成功地访问了类似
x(I)
,但这并没有返回变量数组的第I个元素-它只是返回范围的第I个单元格。

将传递的参数更改为
范围
变量

Public Function divide_by_2_5(ByRef inputRange As Range) As Double()
    Dim output() As Double
    ReDim output(1 To inputRange.Rows.Count, 1 To inputRange.Columns.Count) As Double
    Dim r As Long
    Dim c As Long
    For r = 1 To inputRange.Rows.Count
        For c = 1 To inputRange.Columns.Count
            output(r, c) = inputRange.Cells(r, c).Value / 2.5
        Next
    Next
    divide_by_2_5 = output
End Function
注意:我最初认为可以将一个变量数组传递到函数中,但由于使用

Public Function divide_by_2_5(ByRef x As Variant) As Double()
而不是

Public Function divide_by_2_5(ByRef x() As Variant) As Double()

因此,我正在测试的版本不接受变体数组,只是一个包含范围对象的变体。然后在我随后的测试代码中,我成功地访问了类似于
x(I)
,但这并没有返回变量数组的第I个元素-它只是返回范围的第I个单元格。

如果希望D2、E2、F2、G2等于0.4,则需要向函数传递一个值,如:

Public Function divide_by_2_5 (ByRef coeff As Range) As Double
         divide_by_2_5 = coeff.Value / 2.5
End Function
进行以下调用:
=在D2上用_除以_2_5(D1)
,然后将其拖动到G2


我认为UDF只能向其调用单元添加一个值

如果您希望D2、E2、F2、G2等于0.4,则需要向函数传递一个值,如:

Public Function divide_by_2_5 (ByRef coeff As Range) As Double
         divide_by_2_5 = coeff.Value / 2.5
End Function
Public Function divide_by_2_5(coeffs As Variant) As Double()
    Dim v() As Variant
    If TypeName(coeffs) = "Range" Then
        v = coeffs.Value
    Else
        v = coeffs
    End If
    Dim output() As Double
    ReDim output(LBound(v, 1) To UBound(v, 1), LBound(v, 2) To UBound(v, 2))
    Dim r As Long
    Dim c As Long
    For r = LBound(v, 1) To UBound(v, 1)
        For c = LBound(v, 2) To UBound(v, 2)
            output(r, c) = v(r, c) / 2.5
        Next
    Next
    divide_by_2_5 = output
End Function
进行以下调用:
=在D2上用_除以_2_5(D1)
,然后将其拖动到G2

我认为UDF只能为它的调用单元添加一个值

Public Function divide_by_2_5(coeffs As Variant) As Double()
    Dim v() As Variant
    If TypeName(coeffs) = "Range" Then
        v = coeffs.Value
    Else
        v = coeffs
    End If
    Dim output() As Double
    ReDim output(LBound(v, 1) To UBound(v, 1), LBound(v, 2) To UBound(v, 2))
    Dim r As Long
    Dim c As Long
    For r = LBound(v, 1) To UBound(v, 1)
        For c = LBound(v, 2) To UBound(v, 2)
            output(r, c) = v(r, c) / 2.5
        Next
    Next
    divide_by_2_5 = output
End Function
将其称为UDF的示例如下:

{=divide_by_2_5(C2:F2)}
使用范围从VBA调用此函数的示例可能是:

Dim v As Variant
v = divide_by_2_5(Worksheets("Sheet1").Range("C2:F2"))
Sub test()
   Dim x(1, 4) As Variant
   Dim v As Variant
   x(1, 1) = 6
   x(1, 2) = 7
   x(1, 3) = 8
   x(1, 4) = 9
   v = divide_by_2_5(x)
   MsgBox v(1, 3)
End Sub
使用数组从VBA调用此函数的示例可能是:

Dim v As Variant
v = divide_by_2_5(Worksheets("Sheet1").Range("C2:F2"))
Sub test()
   Dim x(1, 4) As Variant
   Dim v As Variant
   x(1, 1) = 6
   x(1, 2) = 7
   x(1, 3) = 8
   x(1, 4) = 9
   v = divide_by_2_5(x)
   MsgBox v(1, 3)
End Sub
将其称为UDF的示例如下:

{=divide_by_2_5(C2:F2)}
使用范围从VBA调用此函数的示例可能是:

Dim v As Variant
v = divide_by_2_5(Worksheets("Sheet1").Range("C2:F2"))
Sub test()
   Dim x(1, 4) As Variant
   Dim v As Variant
   x(1, 1) = 6
   x(1, 2) = 7
   x(1, 3) = 8
   x(1, 4) = 9
   v = divide_by_2_5(x)
   MsgBox v(1, 3)
End Sub
使用数组从VBA调用此函数的示例可能是:

Dim v As Variant
v = divide_by_2_5(Worksheets("Sheet1").Range("C2:F2"))
Sub test()
   Dim x(1, 4) As Variant
   Dim v As Variant
   x(1, 1) = 6
   x(1, 2) = 7
   x(1, 3) = 8
   x(1, 4) = 9
   v = divide_by_2_5(x)
   MsgBox v(1, 3)
End Sub


如果要将一系列单元格传递到函数中,则需要将传递的参数声明为范围或变量。您的
ReDim output(1,coefs)
语句应该是
ReDim output(1,columns)
@YowE3K,谢谢,edited@YowE3K,你能详细谈谈你的其他评论吗?但那是因为打字错误吗,还是你的密码有误?(如果出错,它将生成#VALUE!errors。)如果要将一系列单元格传递到函数中,则需要将传递的参数声明为范围或变量。您的
ReDim output(1,coefs)
语句应该是
ReDim output(1,columns)
@YowE3K,谢谢,edited@YowE3K,你能扩展一下你的其他评论吗?但那是因为打字错误,还是你的代码中有错误?(如果出现错误,它将生成#VALUE!错误。)感谢您清理我的代码。你测试过这个吗?我仍然收到相同的错误我测试了类似的东西-我可能犯了一个错误“翻译”它回你的变量,等等。给我一秒钟,我会检查。叹气-这是UBound导致的问题-我要删除我的答案不,请解释,互联网将从中学习,即使它不能解决我的问题,我想我可以挽救它-变量将被传递给一个范围对象,所以我应该可以尝试将其更改为一个范围并返回一个范围。感谢清理我的代码。你测试过这个吗?我仍然收到相同的错误我测试了类似的东西-我可能犯了一个错误“翻译”它回你的变量,等等。给我一秒钟,我会检查。叹气-这是UBound导致的问题-我要删除我的答案不,请解释,互联网将从中学习,即使它不能解决我的问题,我想我可以挽救它-变量将被传递给一个范围对象,因此我应该能够尝试将其更改为处理范围并返回范围。我最初认为UDF也只能作用于单个单元格,但如果以数组公式输入,它实际上可以输出到多个单元格。我从回答SO问题中学到的东西比我多年来使用Excel学到的要多。我最初认为UDF也只能作用于单个单元格,但如果以数组公式输入,它实际上可以输出到多个单元格。我从回答SO问题中学到的东西比我多年来使用Excel学到的要多。