将在第一个函数中创建的数组传递给第二个函数
Pass array created in first function to second function
这个问题是根据我上一个问题构建的,主要是因为我想避免使用全局变量,因为它有局限性。在此处查看 link 的答案:
我正试图在另一个用户定义函数中使用从一个用户定义函数创建的数组。我想避免将数组设置为 Global
因为第二个函数不会自动重新计算。对于这个练习,我有两个独立的函数。
第一个函数将从范围输入创建一个数组并对值求和。
第二个函数将调用在第一个函数中创建的数组,并将值与第二个范围输入相加。见以下代码。
Option Explicit
Function first_funct(list_1 As range) As Double
Dim extent As Integer, i As Integer
extent = list_1.rows.Count
Dim main_array() As Variant
ReDim main_array(1 To extent) As Variant
' main_array() was changed from double to variant to avoid potential problems.
first_funct = 0
For i = 1 To extent
main_array(i) = list_1(i).Value
' main_array will be used again in second function
first_funct = first_funct + main_array(i)
Next i
Call second_funct(main_array)
End Function
Function second_funct(list_2 As range, ByRef main_array() As Variant) As Double
Dim extent As Integer, i As Integer
extent = list_2.rows.Count
' Assume the extent of list_2 is equal to extent of list_1 in first function.
Dim main_array() As Variant
ReDim main_main_array(1 To extent) As Variant
second_funct = 0
For i = 1 To extent
second_funct = second_funct + main_array(i) + list_2(i).Value
' How do I call upon main_array created from list_1 in the first function?
Next i
End Function
第一个函数给我错误 "ByRef argument type mismatch"。我的想法是,调用语句会将数组传递给第二个函数,然后 ByRef 语句会获取它。我现在也不确定第二个函数是否正确,因为第一个函数给了我错误。
提前致谢。
你的两个数组都是用强类型声明的,并且你正在以正确的方式传递它们。您的问题不在于数组的类型,而在于顺序,或者更确切地说是省略了第二个函数的参数。
您的 second_funct
函数需要 2 个参数 list_2 As Range, ByRef main_array() As Double
,但您只提供了一个参数:
Call second_funct(main_array)
假设您要传递范围 AND 数组,请尝试将其更改为:
Call second_funct(list_1, main_array)
或者更好的是,删除 Call
语句,然后只使用:
second_funct list_1, main_array
函数和子程序应该正确使用。代码
Call second_funct(main_array)
在传递 main_array 时出现错误,而 second_funct 中的定义要求将范围作为提供的第一个参数。
建议#1 修改first_funct如下
Function first_funct(list_2 As Range, list_1 As Range) As Double
您将在第一个函数中传递两个范围。
建议#2
调用 second_funct(list_2, main_array)
这个问题是根据我上一个问题构建的,主要是因为我想避免使用全局变量,因为它有局限性。在此处查看 link 的答案:
我正试图在另一个用户定义函数中使用从一个用户定义函数创建的数组。我想避免将数组设置为 Global
因为第二个函数不会自动重新计算。对于这个练习,我有两个独立的函数。
第一个函数将从范围输入创建一个数组并对值求和。
第二个函数将调用在第一个函数中创建的数组,并将值与第二个范围输入相加。见以下代码。
Option Explicit
Function first_funct(list_1 As range) As Double
Dim extent As Integer, i As Integer
extent = list_1.rows.Count
Dim main_array() As Variant
ReDim main_array(1 To extent) As Variant
' main_array() was changed from double to variant to avoid potential problems.
first_funct = 0
For i = 1 To extent
main_array(i) = list_1(i).Value
' main_array will be used again in second function
first_funct = first_funct + main_array(i)
Next i
Call second_funct(main_array)
End Function
Function second_funct(list_2 As range, ByRef main_array() As Variant) As Double
Dim extent As Integer, i As Integer
extent = list_2.rows.Count
' Assume the extent of list_2 is equal to extent of list_1 in first function.
Dim main_array() As Variant
ReDim main_main_array(1 To extent) As Variant
second_funct = 0
For i = 1 To extent
second_funct = second_funct + main_array(i) + list_2(i).Value
' How do I call upon main_array created from list_1 in the first function?
Next i
End Function
第一个函数给我错误 "ByRef argument type mismatch"。我的想法是,调用语句会将数组传递给第二个函数,然后 ByRef 语句会获取它。我现在也不确定第二个函数是否正确,因为第一个函数给了我错误。
提前致谢。
你的两个数组都是用强类型声明的,并且你正在以正确的方式传递它们。您的问题不在于数组的类型,而在于顺序,或者更确切地说是省略了第二个函数的参数。
您的 second_funct
函数需要 2 个参数 list_2 As Range, ByRef main_array() As Double
,但您只提供了一个参数:
Call second_funct(main_array)
假设您要传递范围 AND 数组,请尝试将其更改为:
Call second_funct(list_1, main_array)
或者更好的是,删除 Call
语句,然后只使用:
second_funct list_1, main_array
函数和子程序应该正确使用。代码
Call second_funct(main_array)
在传递 main_array 时出现错误,而 second_funct 中的定义要求将范围作为提供的第一个参数。
建议#1 修改first_funct如下
Function first_funct(list_2 As Range, list_1 As Range) As Double
您将在第一个函数中传递两个范围。
建议#2 调用 second_funct(list_2, main_array)