【问题标题】:Pass array created in first function to second function将第一个函数中创建的数组传递给第二个函数
【发布时间】:2017-01-05 04:57:50
【问题描述】:

这个问题有点像我上一个问题,主要是因为我想避免使用全局变量,因为它有局限性。在此处查看链接的答案: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 参数类型不匹配”。我的想法是,调用语句会将数组传递给第二个函数,而 ByRef 语句将接收它。我现在也不确定第二个函数是否正确,因为第一个函数给了我错误。

提前致谢。

【问题讨论】:

  • 我几乎总是对数组输入和数组输出使用简单的Variant 变量,而且几乎从来没有遇到过问题。数组实际上是通过指针传递的,变体自动处理隐式指针。无论如何——main_array 是如何以及在哪里声明的(不仅仅是在哪里改正)?希望它在某处宣布。如果不是 - 它是一个变体变量(并且您没有使用Option Explicit),这会导致类型不匹配。
  • 哎呀忘了包括option explicit。我遵循了您的其他建议,但仍然遇到同样的错误。

标签: arrays vba function call byref


【解决方案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

【讨论】:

  • 我认为使用 first_funct 中的list_1 可以使它在 second_funct 中传递给list_2,这不是我想要做的。我想这样做,以便我可以在不使用 list_1 的情况下使用新的范围输入,但保持 main_array 的值。
  • 当然,但我不知道您的其他范围引用来自何处,因此您需要将其作为参数添加到Function first_funct(list_1 As range, list_2 As range),然后在first_funct 内调用second_funct list_2, main_array
【解决方案2】:

函数和子程序的使用应该是正确的。代码

 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)

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2013-12-09
    • 2020-11-24
    • 1970-01-01
    • 2020-08-28
    相关资源
    最近更新 更多