こんにちは、なかぜんです。
Accessファイルを共有フォルダに置いて複数人で使っていると、ある日突然こんなメッセージが…
「ほかのユーザーが排他モードで開いているため、ファイルを開けません」
このような「ロックトラブル」、経験ありませんか? 業務の現場では意外と多く、困ってしまう人も多いんです。
今回は、そんなロックトラブルを未然に防ぐための対策と、実際に使えるVBAコードをご紹介します。Access初心者の方にも分かりやすく、丁寧に解説していきますので、ぜひ最後までお読みください。
なぜAccessでロックが起きるの?
Accessはファイル共有に弱い?
Accessは、1つのファイル(.accdbや.mdb)にデータも画面も全部入っているので、同時に複数人が使うと「競合」が起きやすいです。
特に「フォームの設計を開きっぱなしにしていた」や「排他モードで開いてしまった」などの操作が原因で、ロックファイル(.laccdb)が残ったままになることもあります。
ロックの主な原因
- ファイルを「排他モード」で開いているユーザーがいる
- ネットワーク環境の不安定さでロックファイルが残る
- Accessの異常終了や強制終了によるファイル破損
ロック対策の基本:分割&ショートカット
テーブルとアプリを分ける「分割設計」
Accessを安全に複数人で使うための基本が「分割設計」です。
- バックエンド(BE):テーブルだけのファイル
- フロントエンド(FE):フォームやクエリ、レポート、VBAを持つファイル
バックエンドは共有フォルダに置き、フロントエンドは各ユーザーのローカルに配置することで、ロックのリスクを減らせます。
ショートカットで「排他モード」を避ける
Accessを開くときに/excl(排他)ではなく/shared(共有)モードで開くようにショートカットを設定しましょう。
"C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" "Z:\共有\業務.accdb" /shared
この設定で、他の人も安心して同時に使えるようになります。
VBAで「二重起動防止」をする方法
次に、Accessファイルがすでに開かれている場合に、さらに開こうとしたとき警告を出すVBAの例を紹介します。
コード例:二重起動チェック
Private Function IsAlreadyOpened() As Boolean
Dim strDBName As String
Dim objAccess As Object
strDBName = CurrentDb.Name
On Error Resume Next
Set objAccess = GetObject(strDBName)
If Not objAccess Is Nothing Then
IsAlreadyOpened = True
Else
IsAlreadyOpened = False
End If
Set objAccess = Nothing
End Function
この関数をフォームのOpen
イベントなどに組み込めば、すでに開かれているかを検知し、処理を止めたりメッセージを出すことができます。
実装例:起動時のチェック
Private Sub Form_Load()
If IsAlreadyOpened() Then
MsgBox "すでに開いています。処理を終了します。", vbExclamation
DoCmd.Quit
End If
End Sub
注意点やよくあるミス
- フロントエンドを共有フォルダに置くとロックしやすくなる
- Accessをタスクマネージャーで強制終了するとロックファイルが残る
- ロックファイル(.laccdb)を手動で削除するときは注意が必要(必ず誰も使っていないときに)
応用ポイント:多人数環境ではAccess以外も検討
もし、同時に10人以上で使うような業務なら、AccessではなくSQL Server + Access(ODBCリンク)や、SharePointリスト連携、PowerAppsなどのクラウド環境も選択肢です。
とはいえ、少人数や小規模チームなら今回紹介したロック対策だけでも十分効果的です!
まとめ:ファイル共有の基本をおさえよう!
今回は、Accessファイルを複数人で使うときに避けられない「ロック問題」について、その原因と対策を紹介しました。
- 分割設計+ローカル実行でロック回避
- 排他モードを避けるショートカット設定
- VBAで二重起動チェックを組み込む
少しの工夫で、大きなトラブルを防ぐことができます。
次回は「Accessの分割設計のやり方」をもう少し詳しく紹介していこうと思っています。ぜひお楽しみに!
それでは、なかぜんでした〜。
