将第一个函数中创建的数组传递给第二个函数

时间:2017-01-05 04:57:50

标签: arrays vba function call byref

这个问题是根据我的上一个问题构建的,主要是因为我想避免使用全局变量,因为它有其局限性。请参阅此处的回答:How do I call upon an array created by a different function?

我正在尝试在另一个用户定义的函数中使用从用户定义的函数创建的数组。我想避免将数组设置为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参数类型不匹配”。我的想法是,call语句会将数组传递给第二个函数,而ByRef语句会将其拾取。我现在也不确定第二个功能是否正确,因为第一个功能给了我错误。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您的两个数组都使用强类型声明,并且您以正确的方式传递它们。你的问题不是数组的类型,而是顺序,或者更确切地说是第二个函数的参数遗漏。

您的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

答案 1 :(得分:0)

功能和子程序在使用时应该是正确的。代码

 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)