図面を開く前に「ロックファイル(.dwl)」を確認!他ユーザーとの編集競合をスマートに回避する方法【AutoCAD VBA 実務中級】
皆さん、こんにちは!AutoCAD VBAの世界へようこそ。伝説のチーフアーキテクトとして、皆さんが日々の業務を劇的に効率化できるよう、ここでしか聞けない「極限の知見」を魂を込めてお伝えしていきます。
今回は、AutoCAD VBAの「基礎とオブジェクトモデル」、特に `AcadApplication` と `AcadDocument` を中心に、実務で遭遇する可能性のある「編集競合」という悩みを、スマートに解決する方法を深掘りしていきましょう。
マクロの記録だけでは決して辿り着けない、一歩進んだVBAの世界へ、さあ、ご一緒しませんか?
「ロックファイル(.dwl)」って、一体何者?
皆さんは、AutoCADで図面を開くとき、ファイル名の横に「.dwl」という拡張子のファイルが同時に作成されているのを見たことはありませんか?

(※これはイメージです。実際のDWLファイルは、図面ファイルと同じフォルダに作成されます。)
この `.dwl` ファイル、実はAutoCADが図面を開いたときに自動的に作成する「ロックファイル」なんです。
このロックファイルが存在するということは、その図面が現在、他の誰か(あるいは自分自身が別のAutoCADセッションで)開いている、ということを意味します。
なぜ、こんな仕組みがあるのでしょうか? それは、複数のユーザーが同じ図面を同時に編集しようとすると、データの整合性が失われたり、どちらかの変更が上書きされてしまったり、といった深刻な問題が発生するのを防ぐためです。まさに、「編集競合」を未然に防ぐための、AutoCADの賢い仕組みなんですね。
なぜ「ロックファイル」の確認が重要なのか?
「いやいや、AutoCADが自動でやってくれるなら、わざわざ自分で確認する必要なんてないんじゃない?」と思われた方もいらっしゃるかもしれません。
確かに、通常の使い方であれば、AutoCADはロックファイルを見て、他ユーザーが開いている図面を「読み取り専用」で開くか、あるいは「開けません」と警告を出してくれます。
しかし、ここで私たちが着目したいのは、「他ユーザーが編集競合を起こしている状態の図面を、無理やり開こうとしてエラーになる」という、典型的な「やらかし」シナリオです。
特に、共有サーバー上で複数の担当者が図面を共有しているような環境では、このような状況は意外と頻繁に起こり得ます。
もし、皆さんが作成するVBAマクロが、この「ロックファイル」の存在を事前にチェックせずに、単純に `AcadDocument.Open` を実行してしまうとどうなるか?
- 他ユーザーが開いている図面を無理やり開こうとして、AutoCADがエラーを吐き出す。
- マクロが途中で停止し、ユーザーに混乱を与える。
- 最悪の場合、本来開きたかった図面ではなく、別の図面を開こうとしてしまう。
こんな事態、絶対に避けたいですよね!
そこで、今回のテーマである「図面を開く前にロックファイルを確認し、他ユーザーの編集競合を回避する」という処理が、実務レベルでは非常に重要になってくるのです。
FSO(FileSystemObject)を使ったロックファイルの存在チェック
では、具体的にどうやってロックファイルの存在をチェックするのか? ここで登場するのが、VB/VBAでファイル操作を行うための強力なツール、FSO(FileSystemObject)です。
FSOを使えば、ファイルの存在チェックはもちろん、フォルダの作成・削除、ファイルの内容の読み書きなど、様々なファイル操作が簡単に行えます。
まずは、FSOオブジェクトを作成するところから始めましょう。
‘ — FSOオブジェクトの宣言と初期化 —
Dim objFSO As Object ‘ FileSystemObject
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
`CreateObject(“Scripting.FileSystemObject”)` というコードで、FSOのインスタンス(実体)を作成しています。これで、`objFSO` という変数を通して、様々なファイル操作ができるようになります。
次に、ロックファイルの存在をチェックします。ロックファイルは、通常、元の図面ファイルと同じパス・ファイル名で、拡張子だけが `.dwl` になっています。
例えば、`C:\Drawing\MyDrawing.dwg` という図面を開こうとする場合、チェックすべきロックファイルは `C:\Drawing\MyDrawing.dwl` です。
FSOには、指定したパスのファイルが存在するかどうかをチェックする便利なメソッドがあります。それが `FileExists` です。
‘ — ロックファイルのパスを生成 —
Dim strDrawingPath As String ‘ 開きたい図面のフルパス
strDrawingPath = “C:\Drawing\MyDrawing.dwg” ‘ 例: 実際のパスに置き換えてください
Dim strLockFilePath As String
strLockFilePath = Left(strDrawingPath, Len(strDrawingPath) – 3) & “dwl” ‘ .dwg を .dwl に置換
‘ — ロックファイルの存在チェック —
If objFSO.FileExists(strLockFilePath) Then
‘ ロックファイルが存在する場合の処理
MsgBox “この図面は現在、他のユーザーによって開かれています。”, vbExclamation, “編集中”
Else
‘ ロックファイルが存在しない場合(安全に開ける場合)の処理
‘ ここで AcadDocument.Open を実行します
MsgBox “この図面は安全に開けます。”, vbInformation, “確認”
End If
‘ — FSOオブジェクトの解放 —
Set objFSO = Nothing
コード解説:
- `strDrawingPath`: 開きたい図面のフルパスを格納する変数です。実際の図面パスに置き換えてください。
- `Left(strDrawingPath, Len(strDrawingPath) – 3) & “dwl”`: この部分で、元の図面パスから拡張子 `.dwg` を取り除き、新たに `.dwl` を連結してロックファイルのパスを生成しています。
- `Len(strDrawingPath)`: 文字列(図面パス)の長さを取得します。
- `Len(strDrawingPath) – 3`: 拡張子 `.dwg` の3文字分を引いています。
- `Left(strDrawingPath, Len(strDrawingPath) – 3)`: 図面パスの左から、拡張子を除いた部分を取り出します。
- `& “dwl”`: 取り出したパスの末尾に `.dwl` を連結します。
- `objFSO.FileExists(strLockFilePath)`: 指定されたパスにファイルが存在すれば `True` を、存在しなければ `False` を返します。
- `If … Then … Else … End If`: 条件分岐です。ロックファイルが存在する場合(`True` の場合)と、存在しない場合(`False` の場合)で、それぞれ異なる処理を行います。
- `MsgBox “…”, vbExclamation, “編集中”`: ロックファイルが存在した場合に表示されるメッセージボックスです。`vbExclamation` は警告アイコン、`”編集中”` はタイトルバーに表示されるテキストです。
- `MsgBox “…”, vbInformation, “確認”`: ロックファイルが存在しない場合に表示されるメッセージボックスです。`vbInformation` は情報アイコンです。
- `Set objFSO = Nothing`: 使用が終わったFSOオブジェクトを解放します。メモリリークを防ぐための重要な処理です。
AcadDocument.Open の前に、この一手間を!
さて、これでロックファイルの存在チェックができるようになりました。では、これを実際の図面を開く処理に組み込んでみましょう。
重要なのは、`AcadDocument.Open` を実行する 前に、ロックファイルのチェックを行うことです。
Sub OpenDrawingSafely()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim strDrawingPath As String ‘ 開きたい図面のフルパス
Dim objFSO As Object ‘ FileSystemObject
‘ — AutoCADアプリケーションオブジェクトの取得 —
On Error Resume Next ‘ エラーが発生しても処理を続行
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
‘ AutoCADが起動していない場合は、新規に起動
Set acadApp = CreateObject(“AutoCAD.Application”)
If acadApp Is Nothing Then
MsgBox “AutoCADアプリケーションの起動に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
acadApp.Visible = True ‘ AutoCADを可視状態にする
End If
On Error GoTo 0 ‘ エラーハンドリングを元に戻す
‘ — FSOオブジェクトの作成 —
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
‘ — 開きたい図面のパスを指定 —
‘ !!! ここに、開きたい図面の実際のフルパスを入力してください !!!
strDrawingPath = “C:\Path\To\Your\Drawing.dwg”
‘ — ロックファイルのパスを生成 —
Dim strLockFilePath As String
strLockFilePath = Left(strDrawingPath, Len(strDrawingPath) – 4) & “.dwl” ‘ .dwg を .dwl に置換
‘ — ロックファイルの存在チェック —
If objFSO.FileExists(strLockFilePath) Then
‘ ロックファイルが存在する場合:ユーザーに通知して処理を中断
MsgBox “‘” & strDrawingPath & “‘ は現在、他のユーザーによって開かれています。” & vbCrLf & _
“編集競合を避けるため、この図面を開くのを中止します。”, vbExclamation, “編集中”
Else
‘ ロックファイルが存在しない場合:安全に図面を開く
On Error Resume Next ‘ 図面を開く際にエラーが発生する可能性もあるため
Set acadDoc = acadApp.Documents.Open(strDrawingPath)
On Error GoTo 0 ‘ エラーハンドリングを元に戻す
If acadDoc Is Nothing Then
MsgBox “‘” & strDrawingPath & “‘ のオープンに失敗しました。” & vbCrLf & _
“ファイルパスが正しいか、またはアクセス権限を確認してください。”, vbCritical, “エラー”
Else
MsgBox “‘” & strDrawingPath & “‘ を正常に開きました。”, vbInformation, “成功”
‘ ここで、開いた図面に対する更なるVBA処理を記述できます
‘ 例: acadDoc.Regen ‘ 図面を再生成する
End If
End If
‘ — オブジェクトの解放 —
Set acadDoc = Nothing
Set acadApp = Nothing
Set objFSO = Nothing
End Sub
コード解説(追加・変更点):
- `Dim acadApp As AcadApplication`, `Dim acadDoc As AcadDocument`: AutoCADアプリケーションとドキュメントオブジェクトを宣言しています。
- `On Error Resume Next` / `On Error GoTo 0`: エラーハンドリングを適切に設定しています。
- AutoCADアプリケーションを取得する際に、もしAutoCADが起動していなくてもマクロが止まらないようにしています。
- `Documents.Open` 実行時にも、ファイルが存在しない、アクセス権がないなどのエラーに対応できるようにしています。
- `Set acadApp = GetObject(, “AutoCAD.Application”)`: 既に起動しているAutoCADインスタンスを取得します。
- `Set acadApp = CreateObject(“AutoCAD.Application”)`: AutoCADが起動していない場合、新しく起動します。
- `acadApp.Visible = True`: 新規起動したAutoCADを画面に表示します。
- `strLockFilePath = Left(strDrawingPath, Len(strDrawingPath) – 4) & “.dwl”`: こちらは `.dwg` の文字数に合わせて `- 4` としていますが、どちらでも正しく動作します。より正確には、`InStrRev` などで拡張子の位置を特定して置換する方が堅牢ですが、ここではシンプルさを優先しています。
- `MsgBox … & vbCrLf & …`: `vbCrLf` は改行コードです。メッセージボックスに複数行のテキストを表示するために使用しています。
- `If acadDoc Is Nothing Then …`: `Documents.Open` が失敗した場合(例えば、ファイルが存在しない、アクセス権がないなど)に、`acadDoc` が `Nothing` になります。この条件でエラーメッセージを表示しています。
- `Set acadDoc = Nothing`, `Set acadApp = Nothing`: 使用が終わったオブジェクトを解放します。
陥りやすいエラーとその回避策
このコードを実際に動かす際に、いくつか注意しておきたい点があります。
1. ファイルパスの誤り:
- `strDrawingPath` に指定するファイルパスが間違っていると、当然ながら図面は開きません。共有サーバー上のパスや、ファイル名に特殊文字が含まれている場合なども注意が必要です。
- 回避策: マクロ内で直接パスをハードコーディングするのではなく、ユーザーにファイル選択ダイアログ (`Application.GetOpenFileName`) を使って指定させるようにすると、より柔軟で安全になります。
2. アクセス権限の問題:
- 図面ファイルやロックファイルが保存されているフォルダに対する書き込み権限がない場合、ロックファイルの生成や存在チェック、図面のオープン自体が失敗する可能性があります。
- 回避策: 実行環境のフォルダ権限を確認してください。また、VBAマクロの実行権限も、AutoCADのセキュリティ設定で許可されている必要があります。
3. AutoCADのバージョン互換性:
- 古いバージョンのAutoCADで作成された図面を開く場合、VBAのオブジェクトモデルやメソッドの挙動が微妙に異なることがあります。
- 回避策: 基本的なオブジェクトモデルは互換性が高いですが、もし特定のバージョンで問題が発生する場合は、そのバージョンのAutoCAD VBAヘルプを参照するか、より汎用的なAPI(AutoCAD .NET APIなど)の利用を検討します。
4. ロックファイルが残ってしまうケース:
- AutoCADが予期せずクラッシュした場合などに、ロックファイルが削除されずに残ってしまうことがあります。この場合、実際には図面は開かれていないのに、ロックファイルが存在するせいで開けない、という状況が発生し得ます。
- 回避策: このような場合は、手動で `.dwl` ファイルを削除する必要があります。VBAマクロで自動的に削除することも可能ですが、誤って削除してしまうリスクもあるため、慎重な実装が必要です。例えば、「ロックファイルが存在し、かつ、そのファイルが一定時間以上更新されていない場合」に限り削除する、といったロジックが考えられます。
まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリ!
いかがでしたでしょうか?
今回は、AutoCAD VBAのオブジェクトモデルの基礎である `AcadApplication` と `AcadDocument` を中心に、実務で必ず遭遇する「編集競合」という課題を、FSOを使った「ロックファイルチェック」という一手間でスマートに回避する方法を解説しました。
- ロックファイル (.dwl) の役割を理解する。
- FSO (FileSystemObject) を使ってファイルの存在をチェックする。
- `AcadDocument.Open` を実行する 前に チェック処理を挟む。
この3点をマスターすれば、皆さんが作成するVBAマクロは、より堅牢で、ユーザーフレンドリーなものになります。図面を開くという、最も基本的な操作における「エラー」を未然に防ぐことは、ユーザーからの信頼を得るための第一歩です。
今回ご紹介したコードは、皆さんの開発現場でそのままコピペして活用できるはずです。ぜひ、実際に試してみてください。
ここをクリアすれば、AutoCAD VBAの「開く」という操作に関する基本はバッチリですよ! 次回も、皆さんの業務を劇的に変える、さらに深く、より実践的な知見をお届けします。お楽しみに!
