【極限の効率化】AutoCADを起動せず、バイナリ解析で図面のバージョンを瞬時に判別する技術
こんにちは。現場の自動化を支えるエンジニアの皆さん。
日々、膨大な数の図面データと格闘していませんか?
「大量の図面ファイルの中から、特定のバージョン(例えばR2018以降)のファイルだけを抽出したい」
「古いバージョンの図面が混じっていないか、一括でチェックしたい」
そんな時、多くの人はこう考えます。
「AutoCADを立ち上げて、一つずつファイルを開いて、プロパティを確認すればいいじゃないか」
……もしあなたが、マクロの記録から一歩踏み出し、真の「自動化エンジニア」を目指すなら、その考えを一度捨ててください。
なぜなら、AutoCADのインスタンスを起動し、`Documents.Open` を実行するプロセスは、コンピュータにとって「極めて重い」作業だからです。数百、数千のファイルに対してこれを行うと、PCは悲鳴を上げ、処理が終わる頃にはコーヒーが冷め切っています。
今日は、AutoCADを一切起動させず、ファイルを「バイナリ(生データ)」として直接覗き見することで、数ミリ秒で図面のバージョンを判定する、プロフェッショナルな手法を伝授します。
ここをクリアすれば、あなたのVBAは「単なる記録」から「高度なシステム」へと進化しますよ。
1. なぜ「ファイルを開く」のはいけないのか?
まず、エンジニアとして「コスト」の概念を理解しましょう。
AutoCADでファイルを開くとき、裏側では以下のことが起きています。
1. AutoCADのメモリ確保
2. 図面データのパース(解析)
3. 座標系、レイヤー、ブロック定義などのオブジェクト生成
4. 画面描画の準備
これらはすべて、「図面の中身を操作するため」に必要な儀式です。しかし、私たちの目的は「バージョンを知ること」だけ。中身を操作する必要はありませんよね?
例えるなら、「本のタイトルを知りたいだけなのに、わざわざ図書館へ行き、本を棚から出し、一ページずつめくって確認している」ようなものです。
賢いエンジニアは、「本の背表紙(ヘッダー情報)だけを見て、中身を開かずに判断する」のです。
2. DWGの「背表紙」:AC10xx という魔法の合図
DWGファイルはバイナリ形式のファイルです。テキストエディタで無理やり開いても文字化けして読めませんが、実はファイルの先頭数バイトには、「私はどのバージョンのDWGです」という明確なサインが書き込まれています。
それが `AC10xx` という文字列です。
| ヘッダー文字列 | AutoCAD バージョン |
|---|---|
| AC1015 | R2000 |
| AC1021 | R2007 |
| AC1024 | R2010 |
| AC1027 | R2013 |
| AC1032 | R2018 |
この法則さえ知っていれば、ファイル全体を読み込む必要はありません。先頭の6バイトだけを読み取れば、判定は完了です。
3. 実装:バイナリ解析による超高速バージョン判定コード
それでは、実際にVBAで実装してみましょう。
ここでは、標準的な `Open` ステートメントの `Binary` モードを使用します。これはテキストとしてではなく、生のバイトデータとしてファイルを扱うモードです。
以下のコードを、標準モジュールに貼り付けて試してみてください。
Option Explicit
''' <summary>
''' 図面ファイルをAutoCADで開かずに、バイナリ解析によってバージョンを判定する
''' </summary>
''' <param name="filePath">対象のDWGファイルのフルパス</param>
''' <returns>バージョン名(例: "AutoCAD 2018")またはエラーメッセージ</returns>
Public Function GetDWGVersionFast(ByVal filePath As String) As String
Dim fileNum As Integer
Dim headerBuffer As String
Dim versionCode As String
' 1. ファイルの存在確認(エラー回避の基本!)
If Dir(filePath) = "" Then
GetDWGVersionFast = "Error: File not found"
Exit Function
End If
' 2. ファイル番号を取得
fileNum = FreeFile
On Error GoTo ErrorHandler
' 3. バイナリモードでファイルを開く (Access Read = 読み取り専用)
' これにより、他のユーザーがファイルを開いていても干渉しにくい
Open filePath For Binary Access Read As #fileNum
' 4. 先頭6バイトを読み取って文字列として格納
' Getステートメントを使用して、指定したバイト数分をバッファに読み込む
headerBuffer = Space$(6) ' 6文字分のメモリを確保
Get #fileNum, , headerBuffer
' 5. ファイルを即座に閉じる(重要!)
Close #fileNum
' 6. 読み取ったヘッダーに基づいてバージョンを判定
versionCode = Left(headerBuffer, 6)
Select Case versionCode
Case "AC1015": GetDWGVersionFast = "AutoCAD 2000"
Case "AC1021": GetDWGVersionFast = "AutoCAD 2007"
Case "AC1024": GetDWGVersionFast = "AutoCAD 2010"
Case "AC1027": GetDWGVersionFast = "AutoCAD 2013"
Case "AC1032": GetDWGVersionFast = "AutoCAD 2018"
Case Else: GetDWGVersionFast = "Unknown Version (" & versionCode & ")"
End Select
Exit Function
ErrorHandler:
' 万が一エラーが起きても、ファイルを開いたままにしないよう必ず閉じる
If fileNum > 0 Then Close #fileNum
GetDWGVersionFast = "Error: " & Err.Description
End Function
''' <summary>
''' テスト用メインルーチン
''' </summary>
Sub TestVersionChecker()
Dim testPath As String
Dim result As String
' ここに対象のファイルパスを入力してください
testPath = "C:\Temp\Sample_Drawing.dwg"
Debug.Print "解析中: " & testPath
result = GetDWGVersionFast(testPath)
Debug.Print "判定結果: " & result
MsgBox "判定結果: " & result, vbInformation, "バージョンチェック完了"
End Sub
4. コードの深層解説:ここがプロの仕事
このコードには、初心者とプロフェッショナルの境界線となる「3つの重要なポイント」が含まれています。
① `Open … For Binary Access Read`
単なる `Open … For Input` ではなく、`Binary` モードを指定しています。また、`Access Read` を付けることで、「読み取り専用」として開いています。
もし `Access Read/Write`(デフォルト)で開いてしまうと、プログラムがファイルを開いている間、他の人がその図面を編集できなくなる「ロック」が発生してしまいます。これは実務では致命的なミスになりかねません。
② `Space$(6)` によるメモリ確保
`headerBuffer = Space$(6)`。これは、あらかじめ「6文字分の空き箱」を用意しておくテクニックです。バイナリ操作では、読み取る箱のサイズが確定していないとエラーになることが多いため、このように明示的にメモリを確保するのが作法です。
③ エラーハンドリングと `Close` の徹底
`On Error GoTo ErrorHandler` を使い、エラーが起きた際にも必ず `Close #fileNum` を実行するようにしています。
「ファイルを開いたら、何があっても必ず閉じる」。これは、ファイル操作を行うエンジニアにとっての鉄則です。これを怠ると、プログラムが異常終了した後に「ファイルが別のプロセスで使用されているため開けません」というエラーに悩まされることになります。
5. まとめ:視点を「オブジェクト」から「データ」へ
今回の手法は、AutoCADのオブジェクトモデル(`AcadDocument` など)を一切使わず、ファイルそのもの(`Binary Data`)を操作しました。
- マクロの記録レベル: 「AutoCADにファイルを開かせて、その結果をもらう」
- プロフェッショナルレベル: 「ファイルの中身を直接解析して、必要な情報だけを抜き出す」
この視点の切り替えができるようになると、自動化のスピードは劇的に向上し、扱えるデータ量も桁違いに増えます。
「もっと効率よくできないか?」
常にそう問い続ける姿勢が、あなたを伝説のアーキテクトへと導きます。
一歩ずつ、楽しみながら進んでいきましょう。応援していますよ!
