こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップはもう卒業しましたね。ここからは、実務で本当に使える「生きたコード」を書いていきましょう。
今回は、多くの設計現場で頭を悩ませる「複数人による同時編集のコンフリクト(衝突)」を防ぐための実務テクニックを解説します。
「せっかく何時間もかけて図面を修正したのに、他の人が古い状態で上書きしてしまい、変更がすべて消えた……」
そんな血の気が引くようなトラブル、あなたも経験したことがありませんか?
今回の記事をしっかりマスターすれば、「図面を開く前にVBAが自動でファイルをロックし、他の人に使わせない(あるいは警告する)」という堅牢な仕組みが作れるようになります。ここをクリアすれば、あなたの作ったマクロは「おもちゃ」から「プロの業務システム」へと劇的に進化しますよ。さあ、一緒に本質の扉を開きましょう!
—
なぜAutoCAD標準のロック機能だけでは不十分なのか?
AutoCADには、標準で「ファイルを開いたときに `.LCK` ファイル等を作って他人の書き込みを制限する機能」が備わっています。しかし、VBAを使ったバッチ処理や、共有サーバー上での運用においては、以下のような「現場の隙」が生まれます。
1. 読み取り専用で開かれてしまう事故
誰かが開いている図面をうっかり開いてしまい、「読み取り専用」で作業した結果、苦労した修正が保存できずに水の泡になる。
2. プログラムが無人実行される際の暴走
夜間バッチなどで複数のVBAから同時に同じ図面を叩きにいこうとすると、AutoCADがクラッシュしたり、ファイルが破損(コリジョン)したりする。
これを防ぐためには、「AutoCADの描画エンジンに図面を渡す手前(OSのファイルシステムレベル)で、VBAから排他制御(ファイルロック)を行う」というアプローチが極めて有効なのです。
—
秘伝のレシピ:FileSystemObjectを使った排他制御
VBAでファイルを安全に制御するためには、VBA標準の `Open` ステートメントではなく、Windowsの標準機能である `Scripting.FileSystemObject` を活用します。
今回は、「指定したDWGファイルにロック用の一時ファイル(`.lck`)を生成し、すでに誰かが使っていれば処理を中断する」という実用的なスクリプトを組み立てました。
実装コード(コピペして使えるモジュール)
以下のコードを、AutoCADのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。
Option Explicit
‘ =========================================================================
‘ 模範解答:ファイルロック機構付き DWGオープン・制御プロシージャ
‘ =========================================================================
Sub OpenDwgWithLock()
Dim fso As Object
Dim targetFilePath As String
Dim lockFilePath As String
Dim fileNum As Integer
‘ 1. 対象となる図面ファイルのパスを指定(環境に合わせて変更してください)
targetFilePath = “C:\CAD_Data\SampleDrawing.dwg”
‘ 2. ロックファイルのパスを生成(例: SampleDrawing.dwg.lck)
lockFilePath = targetFilePath & “.lck”
‘ 3. FileSystemObjectのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 対象のDWGファイル自体が存在するかチェック
If Not fso.FileExists(targetFilePath) Then
MsgBox “対象の図面ファイルが見つかりません。” & vbCrLf & targetFilePath, vbCritical, “ファイルエラー”
Exit Sub
End If
‘ 4. すでにロックファイルが存在するかチェック(=誰かが作業中)
If fso.FileExists(lockFilePath) Then
MsgBox “【警告】この図面は現在、他のユーザー(またはプロセス)によって占有されています。” & vbCrLf & _
“データの破損を防ぐため、処理を中断します。”, vbExclamation, “同時編集防止ロック”
Exit Sub
End If
‘ =========================================================================
‘ 5. 排他ロックの実行(ファイルを排他モードで開いておくことで他を寄せ付けない)
‘ =========================================================================
On Error GoTo LockError
fileNum = FreeFile
‘ 共有を禁止するモード(Lock Read Write)でロックファイルを作成・オープン
Open lockFilePath For Output Lock Write As #fileNum
Print #fileNum, “Locked by AutoCAD VBA at ” & Now & ” User: ” & Environ(“USERNAME”)
‘ ————————————————————————-
‘ ここから先は、あなただけの安全な独占作業エリアです
‘ ————————————————————————-
MsgBox “図面ファイルのロックに成功しました!” & vbCrLf & _
“これからAutoCADで安全に図面を開きます。”, vbInformation, “ロック成功”
‘ 例:実際にAutoCADで図面を開くコード
‘ ThisDrawing.Application.Documents.Open targetFilePath
‘ ————————————————————————-
‘ 【重要】作業終了後、必ずロックを解除(ファイルを閉じて削除)する
‘ ————————————————————————-
Close #fileNum
fso.DeleteFile lockFilePath
MsgBox “図面を閉じ、ロックを正常に解除しました。”, vbInformation, “完了”
Exit Sub
LockError:
‘ 万が一、競合してエラーになった場合
MsgBox “ファイルの排他制御に失敗しました。他のプロセスが干渉しています。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
If fileNum > 0 Then Close #fileNum
End Sub
—
コードの核心:なぜこの書き方が安全なのか?
初心者のうちは、「ファイルをただ開ければいいや」と思いがちですが、プロのエンジニアは「例外処理」と「リソースの解放」に異常なまでの執着を持ちます。
1. `Open … For Output Lock Write` の意味
VBAの古い構文に見えますが、これが一番確実です。この構文は、OSに対して「このファイルに対する他のプログラムからの書き込みを一切許さない」という命令を出します。これを利用して `.lck` という名の「門番」を立てるわけです。
2. 確実に後始末をする(クリーンアップの美学)
もし、コードの途中でエラーが起きたらどうなるでしょう? ロックファイルが残ったままになり、誰も二度とその図面を開けなくなる「永久ロック(デッドロック)」が発生します。
それを防ぐために、実務コードでは `On Error GoTo` を使って、どこで処理が中断しても必ずファイルを閉じるような防壁を張る必要があります(今回はシンプル化していますが、実務では `Finally` 句に近い構造を意識しましょう)。
—
陥りやすい罠とエラー回避の知見
実務の現場でこのコードを運用し始めると、以下のようなトラブルに直面することがあります。先輩からのアドバイスとして先回りして伝授しておきますね。
- 罠:ネットワークドライブ(共有フォルダ)でのタイムラグ
社内のファイルサーバー(NASなど)上でこの処理を行うと、Windowsとサーバー間でファイルが同期されるまでに数ミリ秒のタイムラグが生じます。「ファイルが存在するかチェック (`FileExists`)」した瞬間に、別の人が割って入る「競合状態(Race Condition)」が稀に起きます。
- 対策: 厳密なシステムを組む場合は、API(`CreateFile` 関数など)を叩いてOSレベルの排他制御を行う必要がありますが、まずは今回のFSOベースの仕組みで社内共有の9割のトラブルは防げます。
- 罠:クラッシュ時のロック放置
AutoCAD本体がフリーズして強制終了した場合、VBAの「ロック解除コード」は実行されません。そのため、現場では「朝一番に前日以前の `.lck` を自動掃除するバッチ」をタスクスケジューラなどで仕込んでおくと、運用が劇的に安定します。
—
まとめ:あなたのVBAを「実務レベル」へ引き上げよう
今回は「図面を開く前のファイルロックによる同時編集防止策」について解説しました。
- FileSystemObject を使った安全なファイルの有無チェック
- 排他モード(`Lock Write`)を利用した堅牢なロックファイルの生成
- 予期せぬエラーやクラッシュを見据えた後始末の重要性
これらは、単に「図面を自動で動かす」という次元を超えて、「チーム全体の資産とデータを守る」というエンジニアとしての責任感に直結する重要な知見です。
ここをクリアしたあなたなら、もう初学者の枠からは完全に抜け出しています。自信を持って、明日の実務にこのコードを取り入れてみてください。
それでは、また次の「極限の知見」でお会いしましょう。お疲れ様でした!
