- ベストアンサー
VBAで別モジュールへの変数の受け渡し方法
- VBAでセル内に記述した変数を別のモジュールに受け渡す方法を教えてください。
- Userform内の変数を他のモジュールで使用する方法について教えてください。
- VBAで変数を他のモジュールに渡す方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
標準的なコードの書き方があります。 具体的なコードがないので、こちらは想像の範囲なので、行き違いがあるのはご容赦願います。 >Userformにて作成したコード内にhogehogeという変数を宣言したとします。 変数を共有化(厳密にはグローバル化されていない、プロジェクト内のみ共有)するには、通常、「標準モジュール」で、プロシージャ外の変数は、Public変数になります。そして、明示的に、Public ○○と書きます。仮に、それが、UserFormモジュール内で使用されるものでも、標準モジュールに書くことになります。 >これをPublic Sub CommandButton1_Click()内でhogehogeに文字列abcを代入します。 そういう書き方は、本当に特殊な例を除いて書きません。Privateキーワードだけです。 つまり、ローカルモジュール(シートモジュール、ThisWorkbookモジュール、UserFormモジュール)には、Public キーワードは用いません。また、そこへのCallでの、呼び出しもしません。共有化させる場合は、一般的には「標準モジュール」を利用します。 しかし、別途、ユーザー定義関数やサブプロシージャで、引き数を参照渡し/値渡しで、変数の内容を渡すことがあります。この方が安定していますが、多少、コードの可読性が落ちます。 >callで呼ぶ際に変数hogehogeの受け渡しなどが必要なのでしょうか? 具体的にどのようなコードになっているか分かりませんし、Callでどう呼ぶのかは分かりませんが、引き数を設ければ、それはそれで済みます。 例: 'UserForm1 上 CommandButton1とTextBox1 を用意 'UserFormモジュール内 Private Sub CommandButton1_Click() Dim a As Variant a = Val(TextBox1.Value) Call Test1Ref(a) MsgBox a End Sub '標準モジュール、そのままで参照渡しになっている Public Sub Test1Ref(arg1 As Variant) arg1 = arg1 * 10 End Sub ただし、この程度ならば、UserFormモジュール内で、Test1Refを置いても同じです。その時は、Publicキーワードは不要です。
その他の回答 (2)
- sample_
- ベストアンサー率76% (20/26)
はい、できますよ。 いくつかポイントがあるのでそちらを説明したのちにコードを掲載しておきます。 ■他のモジュールの変数にアクセスしたい時 アクセスしたい変数はDimではなくPublicで宣言する必要があります。 スコープ範囲が外からでもアクセスできるようにする必要があるからです。 Publicで宣言した後、どのようにアクセスすればよいかですが たとえば、Sheet1という名前のシート内で宣言したPublic変数にアクセスしたい時は debug.print Thisworkbook.Sheets("Sheet1").変数名 でアクセスできます。 標準モジュール(Module1)内であれば debug.print Module1.変数名 ■ユーザーフォームの変数にアクセスする時 ユーザーフォーム(UserForm1)内であれば debug.print UserForm1.変数名 でアクセスできます。 ただし、UnLoadや×印で閉じてしまうとメモリ上から消えてしまい変数にアクセスすることはできません。 そのため、×印を押した際に閉じるのではなく、非表示にしてあげる必要があります。 以上を踏まえると以下のようになります。 標準モジュール:Module1 Sub SampleCode() MsgBox "変数abcの値は:" & UserForm1.hogehoge UserForm1.Show MsgBox "変数abcの値は:" & UserForm1.hogehoge End '全ての処理が終わったらEndでPublic宣言の変数をリセットする End Sub ユーザーフォーム:UserForm1 Public hogehoge As String Private Sub CommandButton1_Click() hogehoge = "abc" 'UserForm1の変数に保存 End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Me.Hide 'メモリから消えてしまわないよう非表示にする Cancel = True 'デフォルトの挙動(メモリから消える)をキャンセルする End Sub
お礼
お返事していなくて申し訳ありません。 お陰様で解決しました。 ご丁寧な回答に心から感謝します。
- SherlockHolmes2
- ベストアンサー率40% (175/429)
それらの変数等には、スコープという概念が存在します。 これは簡単に言うと、それらの変数等のオブジェクトが、どの位置まで使用出来るかという事を示します。 説明が下手なので申し訳ありませんが、以下のサイト等を参考にしてみては如何でしょうか。 参照URL : http://homepage1.nifty.com/rucio/main/kiso/Scope.htm
お礼
お返事していなくて申し訳ありません。 お陰様で解決しました。 ご丁寧な回答に心から感謝します。
お礼
お返事していなくて申し訳ありません。 お陰様で解決しました。 ご丁寧な回答に心から感謝します。