アクセス2003で次のエラーが発生します。
実行時エラー 3020
Update または CancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です。
以下のソースは、「テスト」フォームにtestフィールドがある簡単なデータベースですが、全レコードを最初から最後までtestフィールドの先頭に"abc "を付加するというものです。
Public Sub Test()
Dim form_name as String
Dim frmObj As Form
Dim rstObj As Recordset
Dim fld_dat As String
form_name = "テスト"
DoCmd.OpenForm form_name
Set frmObj = Application.Forms(form_name)
Set rstObj = frmObj.Recordset
'先頭のレコードに移動する
DoCmd.GoToRecord acDataForm, form_name, acFirst
Do
fld_dat = rstObj.Fields("test").Value
fld_dat = "abc " & fld_dat
rstObj.Fields("test").Value = fld_dat '<--- *** ここでエラー ***
'次のレコード
DoCmd.GoToRecord acDataForm, form_name, acNext
DoEvents
Loop While frmObj.NewRecord = False
End Sub
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が出てくる行はすべて削除します)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
-
4
アクセスVBAのMe!と[ ]
Access(アクセス)
-
5
Accessで、フォームからフォームへ値を引き継ぐやり方
Access(アクセス)
-
6
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
7
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
8
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
9
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
10
Accessを開きなおすとテキストボックスの値がエラー#Name?になる
その他(データベース)
-
11
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
12
ACCESSで値を代入できないとは?
Visual Basic(VBA)
-
13
MS Accessでフォームの「開く時」と「読込み時」のイベントの違い
Access(アクセス)
-
14
ACCESS VBAの実行時エラーなんですが
PowerPoint(パワーポイント)
-
15
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
16
新規レコード行を非表示にしたい
Access(アクセス)
-
17
Accessでテーブルの値をテキストボックスに代入するには?
Access(アクセス)
-
18
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
19
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
20
アクセス データの競合を非表示にしたい
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
FindFirst を複数条件で検索
-
vscode 文字化け
-
phpでボタンを押したときに変数...
-
構造体の各データの表示につい...
-
パイソンのクラスについて
-
【メモリ不足で落ちる(python)】
-
VBA他のブックから値のみ貼付す...
-
ACCESS テキストボックスを隙...
-
パイソンプログラミング
-
2つのpythonがあって、一方で...
-
実行時エラー 3020の対策
-
vbaでxmlからNodeListでデータ...
-
パイソンのクラスのブログラム
-
文字の横にプルダウンを表示さ...
-
JSONで文字列が長い時
-
シェルスクリプトで、空白(ス...
-
Pythonでターミナルに文字を出...
-
パイソンのクラスについて
-
formで特定のinputを送信しない...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
実行時エラー 3020の対策
-
[python] 文字列を変数名として...
-
ACCESS テキストボックスを隙...
-
FindFirst を複数条件で検索
-
【メモリ不足で落ちる(python)】
-
VBA他のブックから値のみ貼付す...
-
構造体の各データの表示につい...
-
VBAでPDFのコピーとリネームを...
-
パイソンプログラミング
-
phpでボタンを押したときに変数...
-
vscode 文字化け
-
vbaでxmlからNodeListでデータ...
-
コンボボックスのtag情報の取得...
-
「*:*」って何を意味するのでし...
-
パイソンのクラスのブログラム
-
構造体の変数の値を、動的に取...
-
パイソンのクラスについて
-
C言語について
-
VBAで特殊文字を出力したい
おすすめ情報