この質問は、私の最後の質問から構築されたものです。なぜなら、その制限のためにグローバル変数を使用しないようにしたいからです。他のユーザー定義関数でユーザー定義関数から作成した配列を使用しようとしています。 2番目の関数が自動的に再計算されないため、配列をGlobal
に設定しないようにします。この演習では、2つの機能があります。最初の関数で作成された配列を2番目の関数
最初の関数は、範囲入力から配列を作成し、値を合計します。
第2の関数は、第1の関数で作成された配列を呼び出し、第2の範囲入力で値を合計します。次のコードを参照してください。
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引数の型の不一致」を与えます。私の考えは、呼び出しステートメントは、配列を2番目の関数に渡し、ByRefステートメントはそれを拾うでしょう。私はまた、最初のものが私にエラーを与えるので、2番目の関数が正しいかどうかもわかりません。
ありがとうございます。
(list_2、main_array)。配列は実際にはポインタによって渡され、バリアントは暗黙のポインタを自動的に処理します。どのような場合でも、 'main_array'がどのようにどこで宣言されているのですか(どこで再作成されるのかだけではありません)?うまくいけばそれはどこかで宣言されています。そうでなければ、それはバリアント変数です(そして、あなたは 'Option Explicit'を使うことに失敗しています)。これは型の不一致を与えます。 –
Whoopsは 'option explicit'を含むのを忘れていました。私はあなたの他の提案に従って、私はまだ同じエラーを取得しています。 – Soto