概要
メインフォームに入力したテキストをサブフォームにコピーするVBAです。
例えば「会社」のメインフォームの中に「社員」のサブフォームがある場合に、会社の住所・TEL番号と同じものをボタンクリックで社員のレコードに入れます。
わりと需要があると思うのですが、ネットで探してもはっきりと指南するページが見つからなかったので書いておきます。
VBAとしてはかなり簡単なものですが、備忘録としてなるべく初歩的な部分から説明したいと思います。
目的
こんな感じでメインフォームとサブフォームがある場合に、メインに入れた情報をサブフォームにコピーしたい。
リレーションの設定
フォームを作る前にリレーションを設定しておきます。例として、会社のテーブルと社員のテーブルを作成し、リレーションでIDを一対多でつなげます。IDは会社側をオートナンバーにしたら社員側は数値型にして、フィールドサイズを「長整数型」、インデックスを「はい (重複あり)」にしてください。
フォームの作成
会社のテーブルからフォームを作成します。フォームデザインでサブフォームを選択して配置。データのソースオブジェクトを「社員」にします。プロパティシートの「すべて」タブを選択し、サブフォームオブジェクトの名前を設定します。
ボタンの配置
フォームデザインからボタンを配置。プロパティシートの「すべて」タブを選択し、ボタンの名前を設定します。ボタンを選択状態のまま、次に「イベント」タブのいちばん上「クリック時」の右側の︙マークをクリックし、「コードビルダー」OKしてVBAのコード編集画面を開きます。
VBAの記述
VBAの内容としてはこれだけです。最初の行と最後の行の間にある部分が実行する内容となります。
Private Sub コピーボタン_Click()
'ボタンクリックでサブフォームにメインフォームの内容をコピーする
Forms!会社フォーム.社員フォーム!住所 = Me.住所
Forms!会社フォーム.社員フォーム!電話 = Me.電話
End Sub
イコールの左側が内容を貼りつけたいサブフォームの項目、右側がコピー元になるメインフォームの項目。頭の「Forms!」は固定。メインフォーム名とサブフォーム名をドットでつなげて「!」を付けます。最後がコントロール(テキストボックスなど)の名前です。ここで指定するコントロール名はあくまでフォーム上の「名前」ですが、基本的にテーブルから作成したフォームではフィールド名がそのままフォームのコントロールの「名前」になっています。右側の「Me.」はメインフォームに紐付いたコードに書いているのでこの表現となります。全体として左側に右側を代入するという命令文になります。
実行
ボタンをクリックするとサブフォームの選択している行(レコード)にメインフォームの内容をコピーします。サブフォームにレコードが無い場合はコピーされた状態で新規作成されます。
Access VBAでももっとも基本的な構文のひとつになるかと思いますが、基本すぎて案外ネットで説明されていることが少ないような気がします。ちょっとしたことですがVBAで作っておくと入力作業が便利になります!