Excel と Access を連携する方法

Microsoft Excel とAccess を利用し、業務システムをクラウドで運用するための情報・技術などを発信していくサイトです。

ファイルの共有ロック数が制限を超えています (Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。(#-2147217887)

ファイルの共有ロック数が制限を超えています (Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。(#-2147217887)

このようなエラーメッセージが出る場合の対処方法について

f:id:muramoto1041:20160927104554p:plain

調べるとだいたい、下記のような情報が出てきます。

 

MaxLocksPerFile レジストリ キーを設定して、ファイルごとの最大ロック数を増やす

[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。
regedit と入力し、[OK] をクリックします。

この解決策は、絶対にやめましょう。この程度のエラーで「regedit」を変更してはいけません。

 

その次に、出てくる情報は MaxLocksPerFile の値を一時的に変更する方法です。デフォルト値は、9500だったと思います。

下記のような方法で、値を変更することが出来ます。しかし、下記のような対処方法だと15000を超えれば同様のエラーが発生します。

DAO.DBEngine.SetOption dbmaxlocksperfile,15000

 

この現象は、データベースに変更を加えた時のエラー対応時のロールバック用に 設定されているメモリー値のことで、どれだけの変更処理を記憶して、エラーが発生した時に回復処理をするかを設定している値です。

 

従って、書込み処理に問題がなければ完全に書き込み処理を完了すればいいわけです。

この書込み処理の完了することを「コミットする」と言います。


 

 

 

下記の例は、書込み処理を開始して5000回書き込んだらコミットする例です。

このようにするとデフォルト値の9500を超えることはありません。

'ADO接続
Set ADB = New ADODB.Connection
ADB.Provider = "Microsoft.Ace.OLEDB.12.0;Data Source=xxxxx.accdb;"
ADB.Open
SQL1 = "SELECT * FROM テーブル ;" Set ARST1 = New ADODB.Recordset ARST1.Open SQL1, ADB, adOpenKeyset, adLockOptimistic If ARST1.RecordCount > 0 Then  ARST1.MoveFirst  wCnt = 0  ADB.BeginTrans  Do Until ARST1.EOF   ARST1.Update "フィールド", -1   wCnt = wCnt + 1   If wCnt > 5000 Then    ADB.CommitTrans    ADB.BeginTrans    wCnt = 0   End If  ARST1.MoveNext Loop ADB.CommitTrans End If ARST1.Close Set ARST1 = Nothing

 

以前、友人に教えたのですが、今日、同様のエラーが発生して、友人のブログを参考にして対処しました。(^^;

motagp.hatenablog.com

 

ブログに残しておくことは大切です。

その場しのぎの対策ではなく、エラーが発生した場合は、ロールバック処理をしないといけませんね。

 

Excel Appコミュニティを開設しました

「Excelを活用する」ユーザーで技術情報交換をしながら、システムを内製化しませんか?

興味がある方は、コミュニティに参加してください。

Excel Appコミュニティ(Discord)

/*ボタンデザイン*/