hiroton
2021/07/19 (月) 15:08:15
77018@f966d
問題なのは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上で扱う場合、テーブルを直接開く以外の便利な記述方法の内の一つです。より意味の明確なコードにしてるだけで「やりたいこと」自体は同じです
通報 ...