実現したいこと
Access2013で、メインフォームの中に、テーブルに連結されたデータシート形式のサブフォームと、ボタンを配置します。
サブフォーム内の行が選択された状態でメインフォームのボタンを押すと、選択中の行のレコードを複製し、サブフォームは複製されたレコードも表示し、かつ複製されたレコードが選択された状態になるようにしたいです。少しわかりにくいですね。。。
かみ砕いて言うと、ボタンを押すとサブフォーム内の選択中の行がコピー(複製)され、コピー後の行が選択された状態にしたい、というイメージです。
サブフォームのレコードソースとなるテーブルは以下の通り。
テーブル:t1
- ID : オートナンバー型(Pkey)
- col1, col2, col3 : 短いテキスト型
試したこと
メインフォームに配置した複製用のボタンのイベントとして、以下のようなVBAを記述しました。
(本質部分だけをかいつまんでいるためエラー処理等は省いた最低限のコードです)
Private Sub ボタン_Click() Dim ws As DAO.Workspace: Set ws = DBEngine(0) Dim db As DAO.Database: Set db = CurrentDb ' サブフォームの選択中の行を示すIDを取得 Dim selectedID As Integer: selectedID = Me.subform.Form.ID ' 選択中の行に相当するテーブル上のデータを複製する Dim sql As String: sql = "INSERT INTO t1 (col1, col2, col3) SELECT col1, col2, col3 FROM t1 WHERE ID = " & selectedID & ";" ws.BeginTrans db.Execute sql ' 上で挿入したデータの主キーを検索する newID = db.OpenRecordset("SELECT @@IDENTITY")(0) ws.CommitTrans db.Close: Set db = Nothing ws.Close: Set ws = Nothing ' サブフォームを描画しなおし、挿入したデータを選択する Me.subform.Requery Me.subform.Form.Recordset.FindFirst "ID = " & newID End Sub
これによって、1度ボタンを押下すると
- 選択中の行と同じ(ID列のみ違う)が複製され
- サブフォームが再描画され
- 挿入したデータが表示され
- 挿入したデータが選択状態になる
までは実現できたのですが・・・
困っていること
上記のボタンをもう1度(つまり2回目)押すと、
「実行時エラー '3420': オブジェクトが正しくないか、現在設定されていません。」
となります。これは、ボタンを押す際にどの行を選択していても(SQLで自動で挿入された行でも、元々あった行であっても)2回目以降のボタン押下で必ず発生してしまいます。
デバッガで見る限り、1回目にボタンを押した際にはMe.subForm.Form.Recordsetに異変はおきていないようなのですが、
2回目にボタンを押して Me.subForm.Requery を実行した段階で、Me.subForm.Form.Recordset が Nothingになるようです。
知りたいこと
上記の「実現したいこと」を実現できる、よりスマートな方法があれば教えていただきたいです。
(データの複製・挿入、は単にSQLの話ですので問題ないと思っていますが、どちらかというとACCESS特有の部分である「データシート上でレコードを自動選択する」という部分です。データシートの選択を、Form.Recordset.FindFirst で実施する、というのはネット上のサンプルを探している中で拾ってきたため、本当にこれが正しいのかイマイチわかっていません)
また、可能ならば上記のコードで2回目のRequery(2回目のボタン押下時)で、なぜMe.subForm.Form.RecordsetがNothingになるのか、についても教えていただきたいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/07 13:44
2021/05/08 02:13
2021/05/10 10:00 編集