フォーム間でデータの受け渡しをするので、「呼び出し元フォーム」と「呼び出し先フォーム」の2つを使います。
各フォームのオブジェクト(部品)とオブジェクト名は、次の表になります。
画面 | オブジェクト | オブジェクト名 |
---|---|---|
呼び出し元 (メイン画面) |
フォーム | frmMain |
テキストボックス | txtKanriNo | |
コマンドボタン | cmdStartMeisai | |
呼び出し先 (明細画面) |
フォーム | frmMeisai |
ラベル | lblKanriNo |
VBAの複数フォーム(画面)間でデータの受け渡しをしたい場合、次の2つの方法があります。
Public変数を使う
標準モジュールにPublic変数を定義し、その変数を使ってデータの受け渡しをします。
標準モジュール
標準モジュールにPublic変数を定義します。
1 2 3 4 |
'画面間受け渡し用変数 Public gstrKanriNo As String |
呼び出し元(メイン画面)
呼び出し元(メイン画面)のフォームで、Public変数に値をセットします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'************************************************* '*処理名 :明細画面起動ボタンClick '*処理内容:明細画面用のデータを渡し、起動する '************************************************* Private Sub cmdStartMeisai_Click() 'パブリック変数に渡したいデータをセット gstrKanriNo = txtKanriNo.Text '明細画面を表示 frmMeisai.Show End Sub |
呼び出し先(明細画面)
呼び出し先(明細画面)のフォームで、Public変数から値を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 |
'************************************************* '*処理名 :明細画面Initialize '*処理内容:画面の初期化を行う '************************************************* Private Sub UserForm_Initialize() 'パブリック変数の値を取得(画面のラベルに表示) lblKanriNo.Caption = gstrKanriNo End Sub |
ただし、この方法でデータの受け渡しを行うと、受け渡す項目が多い時にPublic変数がどんどん増えてしまいます。
プログラムの見やすさ、メンテナンス性を考えて、必要最低限の物だけをPublic変数にしましょう。
Public変数には、システム全体で管理するもの(ログインIDや権限など)だけを定義するのが理想です。
呼び出し先フォームのコントロールを使う
呼び出し元のプログラムから、呼び出し先フォームにあるコントロールに値を直接セットします。
呼び出し元(メイン画面)
今回の例では、呼び出し元(メイン画面)のプログラムで、呼び出し先(明細画面)のラベルlblKanriNoに値をセットしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'************************************************* '*処理名 :明細画面起動ボタンClick '*処理内容:明細画面用のデータを渡し、起動する '************************************************* Private Sub cmdStartMeisai_Click() '明細画面のコントロール(ラベル)に直接データをセット frmMeisai.lblKanriNo = txtKanriNo.Text '明細画面を表示 frmMeisai.Show End Sub |
呼び出し元(メイン画面)から見た時、ラベルlblKanriNoは自分自身の部品ではなく、呼び出し先(明細画面)の部品になります。なので、「フォーム名.ラベル名」と書きます。
この方法であれば、最初の方法のようにPublic変数の定義をしないので、システム全体でPublic変数の定義が少なくて済みます。
データを受け取るだけで、表示する必要がない場合は非表示ラベルを作成し、そのラベルにセットします。
コントロールでデータを渡した時のイベントの順番
今回の例では、呼び出し元から、呼び出し先のラベルに値をセットしています。
なので、次の順番でイベントが発生すると勘違いしやすいです。
- frmMeisai.lblKanriNo = txtKanriNo.Textで、呼び出し先のラベルに値をセット
- frmMeisai.Showで、呼び出し先画面を表示
- 呼び出し先画面の初期化処理(Initialize)
でも実際には、呼び出し先のラベルに値をセットしようとした時点で、呼び出し先の初期化処理が実行されます。
実際のイベントは、次の順番で起こります。
- 呼び出し先画面の初期化処理(Initialize)
- frmMeisai.lblKanriNo = txtKanriNo.Textで、呼び出し先のラベルに値をセット
- frmMeisai.Showで、呼び出し先画面を表示
ここで伝えたいのは、「ラベルで値を渡して、初期化処理でその値を使おう」とプログラムを作っても、「値を受け取るよりも前に初期化処理が行われて、思った動きにならない」ということです。
ちょっと細かい話なので、フォーム間でコントロールによるデータの受け渡しがうまくいかなかった時に、思い出してもらえればOKです。