• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[Access]あるフォームのクラスモジュールで値を入れた変数を他のフォームでそのまま利用したい)

[Access]フォーム間での変数の利用方法

このQ&Aのポイント
  • Accessのフォーム間で変数を利用する方法について説明します。
  • モジュールとクラスモジュールの違いや、変数の宣言方法についても触れています。
  • しかし、変数の値がうまく渡されない問題があり、その原因についても質問しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.1

どうも変数のスコープ(変数の有効範囲)を理解していないようですね。 例えば ------モジュールのモジュール1 Option Compare Database Public a As Integer Sub aaa() a = 3 End Sub ------フォーム1のモジュール Option Compare Database Public a As Integer Private Sub Form_Load() Dim a As Integer a = 1 MsgBox CStr(a) End Sub Private Sub コマンド1_Click() a = 2 Call aaa End Sub Private Sub コマンド2_Click() MsgBox CStr(a) End Sub -------フォーム2のモジュール Option Compare Database Private Sub Form_Load() MsgBox CStr(a) End Sub ではこれをフォーム1を開いて、ボタン1を押して、ボタン2を押して、フォーム2を開くと メッセージボックスは 1 2 3 との順で表示されます。 これはスコープが 関数内が宣言 フォーム共通の宣言 DB全体(モジュール)の宣言 の順に優先度が高いためです。一番したが一番低い 各々スコープは 関数内は sub ~ End sub が有効範囲で フォーム共通の宣言は同一フォーム内で有効 モジュールの場合は同一DB内で有効です。 通常、Publicを宣言して別のフォームに値を渡す場合はモジュールにPublic宣言をします。 よって今回の場合はフォームAにPublic変数を定義してもフォームBに対しては有効では有りません。 このような場合はモジュールでPublic変数の定義をする必要があります。 フォーム内は宣言不要!!

momoo
質問者

お礼

回答ありがとうございます!! 上記のプログラムを新規に作ってみて試してやっとわかりました。 例えばフォーム1を開いた後、すぐにコマンド2をクリックすると、 (無知な私は1が出ると思った)0が出るのは、 フォーム1のモジュールの Dim a As Integer ~ End Sub はコマンド2には適用されないからですね。 適用範囲がそうなっていたんですね。 マイクロソフトのオフィシャルマニュアル読んでも なかなか理解できなかったんです。 おかげさまでうまくVBAで作り上げることができました。 お礼を申し上げます。