• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:実行時エラー 3020の対策)

実行時エラー 3020の対策

このQ&Aのポイント
  • 実行時エラー 3020の対策方法を解説します。
  • アクセス2003で発生する実行時エラー 3020の原因と解決策を紹介します。
  • 実行時エラー 3020が発生する場合の対処法を説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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が出てくる行はすべて削除します)