2017-01-05 12 views
3

この質問は、私の最後の質問から構築されたものです。なぜなら、その制限のためにグローバル変数を使用しないようにしたいからです。他のユーザー定義関数でユーザー定義関数から作成した配列を使用しようとしています。 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番目の関数が正しいかどうかもわかりません。

ありがとうございます。

+0

(list_2、main_array)。配列は実際にはポインタによって渡され、バリアントは暗黙のポインタを自動的に処理します。どのような場合でも、 'main_array'がどのようにどこで宣言されているのですか(どこで再作成されるのかだけではありません)?うまくいけばそれはどこかで宣言されています。そうでなければ、それはバリアント変数です(そして、あなたは 'Option Explicit'を使うことに失敗しています)。これは型の不一致を与えます。 –

+0

Whoopsは 'option explicit'を含むのを忘れていました。私はあなたの他の提案に従って、私はまだ同じエラーを取得しています。 – Soto

答えて

1

両方の配列が強い型で宣言されており、正しい方法でそれらを渡しています。あなたの問題は、配列の型ではなく、むしろ順序または2番目の関数への引数の省略でむしろです。

あなたsecond_funct関数は2つの引数list_2 As Range, ByRef main_array() As Doubleを期待していますが、一つだけの引数を提供している:

Call second_funct(main_array) 

あなたが範囲配列を渡すことを意味すると仮定すると、変更してみてくださいと:

Call second_funct(list_1, main_array) 

またはより良いまだ、Call文を削除して、ちょうど使用:

second_funct list_1, main_array 
+0

first_functから 'list_1'を使うと、second_functの' list_2'に渡されるようになり、それは私がやろうとしていることではないと思います。 'list_1'を使わずに新しい範囲入力を使うことができるようにしたいのですが、' main_array'の値を維持したいのです。 – Soto

+0

確かに、あなたの他の範囲参照がどこから来ているのかわからなかったので、 'first_funct(list_1 As range、list_2 As range)'の引数としてそれを追加してから 'first_funct'コール'second_funct list_2、main_array' – ThunderFrame

0

関数とサブルーチンは、使用に適切なものでなければなりません。 second_functでの定義が設けられた第一のパラメータであることを範囲を必要としながら、あなたはmain_arrayを渡しているように、コード

Call second_funct(main_array) 

は、エラーが発生しました。あなたが最初の関数で両方の範囲を渡すことになる

Function first_funct(list_2 As Range, list_1 As Range) As Double 

を次のように修正がfirst_funct

投書#1。

投書#2 コールsecond_funct私はほとんど常に両方の配列入力し、アレイ出力のためのシンプルな `Variant`変数を使用すると、ほとんど問題ありません

関連する問題