【入門編】【上級プロフェッショナル向け】バイナリ解析によるDWGヘッダー情報の直接取得:AutoCADを起動せずに図面の保存バージョンを判定する – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の効率化】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にファイルを開かせて、その結果をもらう」
  • プロフェッショナルレベル: 「ファイルの中身を直接解析して、必要な情報だけを抜き出す」

この視点の切り替えができるようになると、自動化のスピードは劇的に向上し、扱えるデータ量も桁違いに増えます。

「もっと効率よくできないか?」
常にそう問い続ける姿勢が、あなたを伝説のアーキテクトへと導きます。

一歩ずつ、楽しみながら進んでいきましょう。応援していますよ!

タイトルとURLをコピーしました