備忘録記事です。
AccessのVBAでADOレコードセットを使用し、ループ処理で大量のレコードの更新を行うと「ファイルの共有ロック数が制限を超えています(Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。」というエラーが出てくることがあります。
対処方法
エラーメッセージに従ってレジストリをいじるとか、そういうのだと使うPCを変えた場合などに面倒そうなので、あくまで当該Accessのファイル内だけで対処をしたい・・・ので、以下のように対処する。(制限を超える前に書き込み処理を完了すれば良い)
’ADODB接続 Dim pLngCNT as Long Set Cn = New ADODB.Connection pStrSQL="SELECT * FROM テーブル;" Set MyRS =New ADODB.Recordset MyRS.Open pStrSQL,CN,adOpenKeyset,adLockOptimistic if MyRS.RecordCOunt=0 then Exit sub pMyRS.MoveFirst pLngCNT=0 Cn.BeginTrans '・・・・ここでBeginTransをしておく Do Until MyRS.EOF MyRS.Fields("フィールド").Value=2 pLngCNT=pLngCNT+1 If pLngCNT > 1000 Then '・・・カウンタが1000を超えてたらComitTransして再びBeginTransする Cn.CommitTrans Cn.BeginTrans pLngCNT=0 end if MyRS.MoveNext Loop
ファイルの共有ロックの制限超えるというのは「エラー回避のためにメモリ上に残しておく制限を超えている」ということのようらしい・・・ので、制限を超える前にそこまで処理したループ分を全部「完了」にしてしまえ、という対処方法。