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学到的要多。