@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のスコープについて議論している素敵な記事です。
最後に、グローバル変数と同様の名前の引数パラメータを関数に使用しました。これはあなたの特定の質問によく一致するようになっていました。実際には、仲介者を取り除き、それらの機能パラメータを排除する方が理にかなっています。どのようなコードを呼び出しても、関数はまずパブリック変数を設定し(まだ設定されていない場合)、関数を呼び出すことができます。
「関数の引数をサブ変数に渡す」とはどういう意味ですか?関数は問題のない* subsを呼び出すことができ、関数の引数を関数の引数に渡すこともできますが、関数内の値を呼び出されていなくても?おそらく、問題をより詳細に記述することができます。 –
追加情報で更新されました。ありがとう! – christopheralan88