Microsoft Access 掲示板

サブフォームのレコードを更新する際に起こるエラーについて / 5

13 コメント
views
4 フォロー
5
hiroton 2021/07/19 (月) 15:08:15 77018@f966d

>> 2

問題なのはOpenに対するCloseがないのほうです。このくらいの規模であればForの外で宣言して終わったらrs.Closeしますが、超巨大なFor文とか、一概にループの外でというわけではありません

今のコードだと、開いたテーブルが開きっぱなしのまま放っておかれるので何かしらの不具合の原因になってもおかしくありません。今回のエラーの原因かどうかはわかりませんが、同じテーブルを複数開いてそのうちどれかで編集をしようとしているので原因にもなりそうです


あとは、全体の処理としてIf .RecordCount = 0 Thenのところがループの中なのに最高でも1回しか実行されない作りなのが気になりますね

Dim rs As Recordset
Set rs = Me.月額サブフォーム.Form.RecordsetClone
With rs
    For i = 0 To monthNum Step s  '請求頻度ごとに
        '既に同じ入金月のレコードが登録されているかチェック
        .FindFirst "入金月 = " & "#" & DateAdd("m", i, startDate) & "#"
        If .NoMatch Then
            .AddNew
            ![契約番号] = Me.契約番号
            ![月額] = Me.月額
            ![入金月] = DateAdd("m", i, startDate)
            ![税率] = Me.税率
            ![税の処理] = Me.税の処理
            .Update '★ここでデバッグが出る
        '同じ入金月のレコードが登録されていない場合
        Else
            .Edit
            ![月額] = Me.月額
            ![税率] = Me.税率
            ![税の処理] = Me.税の処理
            .Update
        End If
    Next
    .Close
End With

このくらいの処理ならFindFirstで全数チェックかけても大した問題じゃないのでいっそIf .RecordCount = 0 Thenの制御処理は無くてもいいと思います(実際今のコードはほぼFindFirstで全数チェックになっています)

その他変更点として

Set rs = CurrentDb.OpenRecordset("T_月額マスタ_編集_仮", dbOpenDynaset)
↓
Set rs = Me.月額サブフォーム.Form.RecordsetClone

これはフォームのレコードセットをVBA上で扱う場合、テーブルを直接開く以外の便利な記述方法の内の一つです。より意味の明確なコードにしてるだけで「やりたいこと」自体は同じです

通報 ...