この人頭いいなと思ったエピソード

VBAであるフォーム上のコマンドボタンで、別のフォーム上にデータを入力し保存をするのはどういうコードになるでしょうか。入力は出来るのですが、そのまま続いて保存する方法が分かりません。
またそのフォームにサブフォームが挿入されている場合、サブフォームのデータも保存するにはどうすればいいでしょうか。

よろしくお願いします。

A 回答 (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です。
    • good
    • 1
この回答へのお礼

分かりやすい回答ありがとうございました。おかげさまで解決いたしました。
私の持っている解説書にはご回答のような説明が載っていません。ご推薦の解説書があれば教えていただけますでしょうか?

お礼日時:2013/01/14 08:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A