OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

[Access]あるフォームのクラスモジュールで値を入れた変数を他のフォームでそのまま利用したい

  • 困ってます
  • 質問No.169077
  • 閲覧数498
  • ありがとう数2
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 62% (51/81)

モジュールとクラスモジュール(イベントプロシージャ)に違いがあることや、モジュールを超えて変数を利用したいときは、Publicで宣言する、という辺りを本を読んでおおまかに理解しました。
帳票管理フォームというフォームに受付CDという主キーの番号があります。そのフォーム上に帳票の詳細な事項を入力するフォームを呼び出すボタンがあります。フォームのイベントプロシージャの一番上のOption Compare Database,Option Explicitの直下行にPublic UketukeCD as Integerと宣言し、
ボタンのイベントプロシージャで、
UketukeCD = Me![受付CD].Value
などと記述しました。
新規入力データの受付CDが例えば452ならUketukeCDには452が代入されればいいんです。
帳票の詳細な事項を入力するフォーム(報告書フォームとします)の「読みこみ時」のイベントプロシージャに以下のように記述しました。
こちらのモジュールの一番上にもPublic UketukeCD as Integerと宣言し、(←これは必要なんでしょうか?)
Me![受付CD].Value = UketukeCDと書きました。
過去のデータを検索するときはレコードソースのテーブルの受付CDのデータを受付CDフィールドに持ってき、新規入力の場合は、受付CDは帳票管理フォームのものを代入するという設計で、UketukeCDの値(例:452)を報告書フォーム内の受付CDフィールド内に出力する、という感じですが、なぜかUketukeCDにはいつも0が代入されています。
変数は他のモジュールで利用できても代入された値までは移行されないのですか?
イベントプロシージャだからできないんですか?
字数の制限上、コードをかなり省略しています。
足りない部分は補足で補いますのでおっしゃって下さい。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル12

ベストアンサー率 45% (207/457)

どうも変数のスコープ(変数の有効範囲)を理解していないようですね。
例えば
------モジュールのモジュール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を開くと
メッセージボックスは



との順で表示されます。

これはスコープが
関数内が宣言
フォーム共通の宣言
DB全体(モジュール)の宣言

の順に優先度が高いためです。一番したが一番低い
各々スコープは

関数内は
sub

End sub
が有効範囲で

フォーム共通の宣言は同一フォーム内で有効

モジュールの場合は同一DB内で有効です。

通常、Publicを宣言して別のフォームに値を渡す場合はモジュールにPublic宣言をします。

よって今回の場合はフォームAにPublic変数を定義してもフォームBに対しては有効では有りません。
このような場合はモジュールでPublic変数の定義をする必要があります。

フォーム内は宣言不要!!
お礼コメント
momoo

お礼率 62% (51/81)

回答ありがとうございます!!
上記のプログラムを新規に作ってみて試してやっとわかりました。
例えばフォーム1を開いた後、すぐにコマンド2をクリックすると、
(無知な私は1が出ると思った)0が出るのは、
フォーム1のモジュールの
Dim a As Integer

End Sub
はコマンド2には適用されないからですね。
適用範囲がそうなっていたんですね。
マイクロソフトのオフィシャルマニュアル読んでも
なかなか理解できなかったんです。
おかげさまでうまくVBAで作り上げることができました。
お礼を申し上げます。
投稿日時 - 2001-11-16 12:25:34
-PR-
-PR-
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ