- ベストアンサー
サブフォームのデータを保存する方法
VBAであるフォーム上のコマンドボタンで、別のフォーム上にデータを入力し保存をするのはどういうコードになるでしょうか。入力は出来るのですが、そのまま続いて保存する方法が分かりません。 またそのフォームにサブフォームが挿入されている場合、サブフォームのデータも保存するにはどうすればいいでしょうか。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> 別のフォーム上にデータを入力し保存 「レコードの保存」を行うには、以下のようにします: (但し、回答の簡素化のため、エラー処理は省略しています) ※フォーム名を「メイン」とした場合。 Private Sub コマンド0_Click() '別フォームへのレコードの入力 Forms!メイン!ID = Me!ID + 1 '入力の一例 'レコードの保存 Forms!メイン.SetFocus '対象フォームをアクティブ化 RunCommand accmdSaveRecord 'レコードの保存 Me.SetFocus '実行元のフォームに戻る End Sub なお、「対象フォームのRequery」でも通常はレコードの保存ができますが、 職場で作成したMDBファイルで、何かの条件で、それだとエラーになる場合が あったため、この場では上記を推奨しておきます。 (どういう条件だったかは、失念してしまいましたが・・・(汗)) > サブフォームのデータも保存 この場合は、上記に加えて、「サブフォームのアクティブ化」と「レコードの保存」 を実行してやればOkです: ※サブフォーム名(→プロパティシートの『その他』タブの『名前』に表示される もの)を「サブ」とした場合。 Private Sub コマンド0_Click() Forms!メイン!ID = Me!ID + 1 'メインフォームのレコード保存 Forms!メイン.SetFocus RunCommand accmdSaveRecord 'サブフォームのレコード保存 Forms!メイン!サブ.SetFocus RunCommand acCmdSaveRecord Me.SetFocus End Sub なお、「Forms!メイン」を何度も参照する代わりに、Withステートメントを使用 したり、Form型のオブジェクト変数に格納してやると、若干ながら端末への 負荷が軽減されますので、併せて今後の参考まで。 (今回提示した程度のものなら、昨今のPCでは大した負荷にはなりませんが(汗) どちらかというと、見やすくなるというメリットの方が大きいかもしれません) Private Sub コマンド0_Click() Dim Frm As Form 'メインフォームを変数Frmに格納 Set Frm = Forms!メイン With Frm !ID = Me!ID + 1 .SetFocus RunCommand accmdSaveRecord !サブ.SetFocus RunCommand acCmdSaveRecord End With Me.SetFocus '念のため、明示的にメモリを解放 Set Frm = Nothing End Sub ※「Forms!メイン!サブ」には、「.Form」や「.Controls」が省略されています。 そちらを入れた方が使い慣れているようでしたら、それらを入れてもOkです。
お礼
分かりやすい回答ありがとうございました。おかげさまで解決いたしました。 私の持っている解説書にはご回答のような説明が載っていません。ご推薦の解説書があれば教えていただけますでしょうか?