【VBA】フォーム(画面)間でデータの受け渡しをする

フォーム間でデータの受け渡しをするので、「呼び出し元フォーム」と「呼び出し先フォーム」の2つを使います。

各フォームのオブジェクト(部品)とオブジェクト名は、次の表になります。

画面 オブジェクト オブジェクト名
呼び出し元
(メイン画面)
フォーム frmMain
テキストボックス txtKanriNo
コマンドボタン cmdStartMeisai
呼び出し先
(明細画面)
フォーム frmMeisai
ラベル lblKanriNo

 

VBAの複数フォーム(画面)間でデータの受け渡しをしたい場合、次の2つの方法があります。

Public変数を使う

標準モジュールにPublic変数を定義し、その変数を使ってデータの受け渡しをします。

標準モジュール

標準モジュールにPublic変数を定義します。

呼び出し元(メイン画面)

呼び出し元(メイン画面)のフォームで、Public変数に値をセットします。

呼び出し先(明細画面)

呼び出し先(明細画面)のフォームで、Public変数から値を取得します。

ただし、この方法でデータの受け渡しを行うと、受け渡す項目が多い時にPublic変数がどんどん増えてしまいます。

プログラムの見やすさ、メンテナンス性を考えて、必要最低限の物だけをPublic変数にしましょう。

POINT

Public変数には、システム全体で管理するもの(ログインIDや権限など)だけを定義するのが理想です。

 

呼び出し先フォームのコントロールを使う

呼び出し元のプログラムから、呼び出し先フォームにあるコントロールに値を直接セットします。

呼び出し元(メイン画面)

今回の例では、呼び出し元(メイン画面)のプログラムで、呼び出し先(明細画面)のラベルlblKanriNoに値をセットしています。

呼び出し元(メイン画面)から見た時、ラベルlblKanriNoは自分自身の部品ではなく、呼び出し先(明細画面)の部品になります。なので、「フォーム名.ラベル名」と書きます。

この方法であれば、最初の方法のようにPublic変数の定義をしないので、システム全体でPublic変数の定義が少なくて済みます。

POINT

データを受け取るだけで、表示する必要がない場合は非表示ラベルを作成し、そのラベルにセットします。

 

コントロールでデータを渡した時のイベントの順番

今回の例では、呼び出し元から、呼び出し先のラベルに値をセットしています。
なので、次の順番でイベントが発生すると勘違いしやすいです。

勘違いしやすいプログラムの流れ
  1. frmMeisai.lblKanriNo = txtKanriNo.Textで、呼び出し先のラベルに値をセット
  2. frmMeisai.Showで、呼び出し先画面を表示
  3. 呼び出し先画面の初期化処理(Initialize)

 

でも実際には、呼び出し先のラベルに値をセットしようとした時点で、呼び出し先の初期化処理が実行されます。

実際のイベントは、次の順番で起こります。

実際のプログラムの流れ
  1. 呼び出し先画面の初期化処理(Initialize)
  2. frmMeisai.lblKanriNo = txtKanriNo.Textで、呼び出し先のラベルに値をセット
  3. frmMeisai.Showで、呼び出し先画面を表示

ここで伝えたいのは、「ラベルで値を渡して、初期化処理でその値を使おう」とプログラムを作っても、「値を受け取るよりも前に初期化処理が行われて、思った動きにならない」ということです。

ちょっと細かい話なので、フォーム間でコントロールによるデータの受け渡しがうまくいかなかった時に、思い出してもらえればOKです。

関連記事

VBAテクニック辞典
成果を出す5つのポイント
VBAテクニック辞典
えくとしょ | 初心者のためのエクセルとVBAの図書館
タイトルとURLをコピーしました