- ベストアンサー
実行時エラー 3020の対策
- 実行時エラー 3020の対策方法を解説します。
- アクセス2003で発生する実行時エラー 3020の原因と解決策を紹介します。
- 実行時エラー 3020が発生する場合の対処法を説明します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
RecordSetを使って編集をするのでしたら、エラーメッセージに出ている通り、 Editメソッドを使用する必要があります。 (また、レコード移動にはGotoRecordではなくMoveFirstやMoveNextが必要) 逆にフォーム上で処理するのでしたら、フィールドではなくコントロールへの 代入にする必要があります。 提示されたコードでは、この2通りの方法がごっちゃになってしまっています。 とりあえず、(画面描写が入る分、処理は遅くなるものの)私が使い慣れていると いうことで、後者のコードを参考に載せます。 ('「test」フィールドをコントロールソースとするコントロールの名を「Test」としました) Sub テスト() Dim form_name As String Dim frmObj As Form Dim Cntl As Control Dim fld_dat As String form_name = "テスト" DoCmd.OpenForm form_name Set frmObj = Application.Forms(form_name) Set Cntl = frmObj.Controls("Test") DoCmd.GoToRecord acDataForm, form_name, acFirst '万が一レコード未入力(全削除)後に実行してもエラーにならないよう、 '条件を「Loop」側から「Do」側に移動しました。 Do While frmObj.NewRecord = False fld_dat = Cntl.Value fld_dat = "abc " & fld_dat Cntl.Value = fld_dat DoCmd.GoToRecord acDataForm, form_name, acNext DoEvents Loop End Sub ・・・以上です。 ただ、今回のように追加する文字列がすべて同じなのでしたら、更新クエリを 使用した方が効率がよいように思います。 (「テスト」フォームのレコードソースを「テーブルA」としました) *フォームの更新後イベント等を利用して、他のフィールドを連動更新する場合は不可* Sub テスト2() On Error Goto エラー処理 Dim StrSQL As String Dim form_name As String StrSQL = "UPDATE テーブルA SET テーブルA.test = 'abc ' & テーブルA!test;" form_name = "テスト" DoCmd.SetWarnings False 'SQL実行時の確認メッセージを停止 DoCmd.RunSQL StrSQL DoCmd.OpenForm form_name 'フォームを開いて更新後の状態を確認 終了処理: DoCmd.SetWarnings True 'メッセージの停止を解除 Exit Sub エラー処理: MsgBox Err & ":" Error$,,"テスト(Sub)" Resume 終了処理 End Sub なお、コードでSQL文を作成するのではなく、予めクエリとして保存しておいて、 それを使うこともできます。 (この場合は、「DoCmd.RunSQL StrSQL」を「DoCmd.OpenQuery "(クエリ名)"」に変更し、 他のStrSQLが出てくる行はすべて削除します)