Microsoft Access 掲示板

For文のループがエラーになる

6 コメント
views

お世話になります。

For文のループ内にDoCmd.GoToRecord , , acNextを入れています。
ループの回数はForms("フォーム1").RecordsetClone.RecordCountで最大値を設定しています。

この最大値が多いとき、DoCmd.GoToRecord , , acNextがエラーとなってしまいます。
ループ回数を少なくすると、エラーが出ないのですが、なぜこのようなことがおこるのかさっぱりわかりません。
ループ回数が20回だとエラーにならず、59回だとエラーになります。
メモリ不足等の問題でしょうか?

どなたかご教授いただければ幸いです。

nanana
作成: 2024/04/30 (火) 16:10:46
通報 ...
1

For文のループ内にDoCmd.GoToRecord , , acNextをいれるというようなことはしたことがないので原因は分かりませんが、
たぶん、もっと効率的かつ高速かつ安全な方法があると思います。

具体的にどのようなことをしたいのか説明されたら、具体的なアドバイスでつきそうです。

表示されている全レコードを更新したいとかなら、更新クエリで更新するとか、フォームのRecordsetプロパティを使って更新するとか、いろいろな方法があります。

2
ssassakki 2024/05/09 (木) 10:32:19 27741@c61b7

Docmdは非同期処理なので、前のレコード移動が終わる前に次のレコード移動でエラーになっている可能性があるのでは?

3
nanana 2024/10/11 (金) 10:37:57 3588c@9a838

回答頂いていながら返信が遅くなり申し訳ありません。長期入院していたため回答できませんでした。
深くお詫びいたします。

帳票フォームのフィルターで表示されたレコードだけに対して、フィールド1の値を変更したいです。
フィールド2、3、4の値を連続した文字列としてフィールド1に入れたいのですが、
これをFor分の中にDoCmd.GoToRecord , , acNextを入れると、エラーになって次のレコードに行けません

このような場合はどう記述するべきなのか、ご教授いただければ幸いです。
よろしくお願いいたします。

4

2つの案が考えられます。

第一案

フォームのレコードセットを操作して更新する。

フィールド名は F1, F2, F3, F4 と仮定してます。

Sub Sample1()
    Dim rs As DAO.Recordset
    Set rs = Me.Recordset.Clone
    rs.MoveFirst
    Do Until rs.EOF
        rs.Edit
        rs!F1 = rs!F2 & rs!F3 & rs!F4
        rs.Update
    rs.MoveNext
    Loop
    Me.Recalc
    rs.Close: Set rs = Nothing
End Sub

フォーのレコードセットの扱いについては下記をご参考に。

フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは? - hatena chips

第2案

フォームのFilterプロパティで抽出条件を取得して、それを利用して更新クエリを実行する。

フォームのレコードソースのテーブル名はTbl1と仮定

Sub Sample2()
    Dim stSQL As String
    stSQL = "UPDATE Tbl1 SET F1 = F2 & F3 & F4"
    If Me.FilterOn And Me.Filter <> "" Then
        stSQL = stSQL & " WHERE " & Me.Filter
    End If
    CurrentDb.Execute stSQL
    Me.Requery
End Sub
5
nanana 2024/10/11 (金) 18:04:15 3588c@9a838

早々のご回答ありがとうございます。
第一案でできそうです。
もう少し勉強します!