2016-04-15 6 views
0
に渡す

ExcelのVBAでサブ変数に渡したい引数を持つ関数があります。関数の引数は範囲、たとえばA1:B1です。その範囲を別のサブに渡したいと思います。これを行う方法はありますか?私が今までインターネットで読んだことのすべては、関数の結果をサブ関数の間に渡すことを扱いますが、関数の引数はサブ変数に渡されません。Excel VBA - 引数のパラメータをサブ

ありがとうございます!詳細について

編集:フィールド名、テーブル、PageFilters、およびGROUPBY:

私はすべての範囲のデータ型です以下の引数で、機能、BuildpgSQLを持っています。変数として同じPageFiltersの範囲を使用するサブがあります。引数を2回定義するのではなく、関数とサブ関数についてもう一度、BuildpgSQLのPageFilters引数をサブの変数に渡したいと思います。

+0

「関数の引数をサブ変数に渡す」とはどういう意味ですか?関数は問題のない* subsを呼び出すことができ、関数の引数を関数の引数に渡すこともできますが、関数内の値を呼び出されていなくても?おそらく、問題をより詳細に記述することができます。 –

+0

追加情報で更新されました。ありがとう! – christopheralan88

答えて

1

@paxdiabloによれば、関数呼び出しにはサブ関数を呼び出すことに問題はなく、引数にサブ関数を渡すことは問題ありません。しかし、あなたは、明示的にサブのパラメータとしてリストされていなくても、関数からサブに引数を渡して明示的にバイパスしたいと思うようです。これは普通のローカル変数ではできませんが、global variablesで行うことができます。

VBAでは、変数はPublicまたはModule Levelのいずれかと呼ばれ、任意のサブまたは関数の外部で宣言されます。たとえば:testを実行し、AnotherSubを呼び出したときに

Dim Table As Range 
Dim FieldNames As Range 'module level variables 

Function BuildpgSQL(tbl As Range, fldnames As Range) 
    Set Table = tbl 
    Set FieldNames = fldnames 
    'do stuff 
End Function 

Sub AnotherSub() 
    MsgBox "Table = " & Table.Address & ", & FieldNames =" & FieldNames.Address 
End Sub 

Sub test() 
    BuildpgSQL Range("A1"), Range("A2:B2") 
    AnotherSub  
End Sub 

は、後者のサブは正しく関数に渡されていた範囲を報告することができます。

私は2つの変数を任意のサブ定義または関数定義の外に宣言しました。モジュール内のサブ/ファンクションがそれらの変数に与える変更は、モジュール内の他のサブ/ファンクションで読み取ることができます。これにより、それらの変数はモジュール内のグローバル変数になります。これらはVBAではしばしば便利ですが、コードをモジュール化しにくくデバッグするのが難しくなるため、控えめに使用する必要があります。

Public変数を使用して別のタイプのグローバル変数を取得することもできます。モジュール/サブの外側で定義されますが、DimではなくキーワードPublicで定義されます。これにより、他のモジュールを含め、プロジェクト内の任意の場所に変数にアクセスできるようになります。 Hereは、VBAのスコープについて議論している素敵な記事です。

最後に、グローバル変数と同様の名前の引数パラメータを関数に使用しました。これはあなたの特定の質問によく一致するようになっていました。実際には、仲介者を取り除き、それらの機能パラメータを排除する方が理にかなっています。どのようなコードを呼び出しても、関数はまずパブリック変数を設定し(まだ設定されていない場合)、関数を呼び出すことができます。

1

関数に送信されたパラメータをサブルーチン(またはそれに関する別の関数)に渡すことに問題はありません。次のコードは、アクションであることを示しています。上記のコードで

Option Explicit 

Sub sub2(z As Integer) 
    MsgBox (CStr(z)) 
End Sub 

Function fn1(y As Integer) As Integer 
    MsgBox (CStr(y)) 
    sub2 (y) 
    fn1 = y 
End Function 

Sub Macro1() 
    Dim x as Integer 
    x = fn1(12) 
End Sub 

、あなたが見ることができる主なマクロは、関数を呼び出し、関数がサブルーチンへの上にそれを渡します。メッセージボックスは、プロセスを通じてさまざまなポイントで変数を出力します(すべて出力は12です)。

これは、単純なものと同じように、複雑なオブジェクト(範囲など)でも同様です。

関連する問題