【入門編】【上級プロフェッショナル向け】バイナリ解析による「DWG保存バージョン」の高速特定:AutoCAD非起動での互換性チェック – AutoCAD VBA解析バイブル

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

【AutoCAD VBA 掌握への道】AutoCADを起動せずに「図面の正体」を見抜く:バイナリ解析による高速バージョン判定術

こんにちは。自動化の世界へようこそ。
「マクロの記録」ボタンを押して、生成されたコードを眺めては「なんだか呪文みたいで難しいな……」と立ち止まってしまったことはありませんか?

大丈夫、安心してください。その壁は、すべての伝説的なエンジニアが最初にぶつかった壁です。
今日は、単なる「操作の記録」から脱却し、「コンピュータの仕組みを理解して、圧倒的なスピードを実現する」という、プロフェッショナルへの第一歩を一緒に踏み出しましょう。

今回のテーマは、少し刺激的です。
「AutoCADを起動せずに、図面ファイルのバージョンを瞬時に特定する」。
これ、実は実務では「神のテクニック」と呼ばれるほど重要な考え方なんです。

なぜ「ファイルを開いて確認する」ではダメなのか?

通常、図面のバージョンを確認しようと思ったら、どうしますか?
「AutoCADでファイルを開いて、`SaveAs`(名前を付けて保存)のダイアログを見る」……あるいは、VBAで `Documents.Open` を実行する。

確かに、これでも動きます。でも、プロの現場ではこれは「禁忌(タブー)」に近い行為です。なぜなら、「重すぎる」からです。

1. メモリの浪費: 1GBあるような巨大なDWGファイルを開くために、膨大なRAMを消費します。
2. 時間のロス: ファイルが開くまでの数秒、数十秒の待ち時間が、大量のファイルを処理する際に致命的な遅延になります。
3. リスク: 万が一、ファイルが破損していた場合、AutoCADがクラッシュしたり、最悪の場合、図面データそのものを壊してしまうリスクすらあります。

想像してみてください。1,000個のファイルがあるフォルダで、バージョンチェックのために1,000回AutoCADを起動する……。そんな非効率な作業は、もう終わりにしましょう。

魔法の鍵「マジックナンバー」を知る

プロの世界では、ファイルの中身を全部読む必要はありません。
「ファイルの先頭数バイト」だけを見れば、その正体がわかるようになっているんです。これをマジックナンバーと呼びます。

DWGファイルは、バイナリ形式(コンピュータが直接理解する0と1の羅列)で保存されています。そのファイルの冒頭には、必ず `AC10xx` という特定のパターンが書き込まれています。

  • `AC1015` なら AutoCAD 2000
  • `AC1024` なら AutoCAD 2010
  • `AC1032` なら AutoCAD 2018

この「先頭の文字列」さえ掴んでしまえば、AutoCADを立ち上げるまでもなく、そのファイルが「自分の持っているAutoCADで開けるものかどうか」が、コンマ数秒で判別できるのです。

実践:バイナリ解析による高速判定コード

それでは、実際にVBAで書いてみましょう。
「ファイルを開く」のではなく、「ファイルをバイナリモードで覗き見る」という手法を使います。

Option Explicit

''' <summary>
''' 図面ファイルの先頭ヘッダーを読み取り、AutoCADのバージョンを特定する
''' </summary>
''' <param name="filePath">調査したいDWGファイルのフルパス</param>
''' <returns>AutoCADのバージョン文字列(例: "AutoCAD 2018")</returns>
Function GetDWGVersion(ByVal filePath As String) As String
    Dim fileNum As Integer
    Dim header As String
    Dim versionCode As String
    
    ' ファイルが存在するかチェック(基本中の基本!)
    If Dir(filePath) = "" Then
        GetDWGVersion = "Error: File Not Found"
        Exit Function
    End If

    ' 1. ファイル番号を取得
    fileNum = FreeFile
    
    ' 2. ファイルを「バイナリ・読み取り専用」モードで開く
    ' ここがポイント!Open ... For Binary とすることで、
    ' AutoCADを介さず、直接ファイルの中身を「覗き見」できます。
    Open filePath For Binary Access Read As #fileNum
    
    ' 3. 先頭6バイトを読み込む
    ' DWGのヘッダー(AC10xx)は最初の数バイトに格納されています。
    header = Space$(6) ' 読み込み用のバッファを用意
    Get #fileNum, , header
    
    ' 4. ファイルを閉じる(これを忘れるとファイルがロックされてしまいます!)
    Close #fileNum
    
    ' 読み込んだ文字列を整理
    versionCode = Trim(header)
    
    ' 5. マジックナンバーをバージョン名に変換
    ' ここをマスターすれば、互換性チェックの自動化はバッチリです。
    Select Case versionCode
        Case "AC1015": GetDWGVersion = "AutoCAD 2000"
        Case "AC1018": GetDWGVersion = "AutoCAD 2004"
        Case "AC1021": GetDWGVersion = "AutoCAD 2007"
        Case "AC1024": GetDWGVersion = "AutoCAD 2010"
        Case "AC1027": GetDWGVersion = "AutoCAD 2013"
        Case "AC1032": GetDWGVersion = "AutoCAD 2018"
        Case Else:     GetDWGVersion = "Unknown Version (" & versionCode & ")"
    End Select
End Function

''' <summary>
''' テスト用メインルーチン
''' </summary>
Sub TestVersionCheck()
    Dim targetFile As String
    Dim result As String
    
    ' ここに調べたいファイルのパスを入力してください
    targetFile = "C:\Temp\SampleDrawing.dwg"
    
    Debug.Print "--- バージョン解析開始 ---"
    result = GetDWGVersion(targetFile)
    Debug.Print "結果: " & result
    Debug.Print "--------------------------"
    
    MsgBox "解析結果: " & result, vbInformation, "解析完了"
End Sub

ここがプロの勘所:陥りやすいエラーと回避策

このコードを動かす際、あるいは自分で応用する際に、初心者がハマりやすいポイントが3つあります。ここをクリアすれば、あなたはもう「初学者」ではありません。

1. ファイルロックの罠(Closeの徹底)

コードの中に `Close #fileNum` という記述がありますよね?
もし、エラーが起きてこの行を通り過ぎてしまった場合、そのファイルは「VBAが掴んだまま」になり、他の人が開けなくなったり、削除できなくなったりします。
「開けたら必ず閉じる」。これは、オブジェクトのライフサイクルを管理するエンジニアの鉄則です。

2. `Access Read` の重要性

`Open … For Binary Access Read` と書いています。
単に `For Binary` と書くだけでも動きますが、`Access Read` を明示することで、「私はこのファイルを読み取るだけで、書き換えませんよ」という宣言になります。これにより、他のプロセスとの競合を防ぎ、安全性が飛躍的に高まります。

3. バッファの準備

`header = Space$(6)` という部分は、「6文字分の空箱を用意してね」という意味です。
バイナリ操作では、いきなり変数に読み込むのではなく、あらかじめ適切なサイズの「入れ物(バッファ)」を用意しておくのが、メモリ管理における美しい作法です。

まとめ:一歩先の自動化へ

いかがでしたか?
「AutoCADを起動して、ファイルを開いて、バージョンを確認する」という、当たり前だと思っていた作業が、実は非常に重い処理だったことに気づけたはずです。

今回学んだ「バイナリ解析による高速特定」は、単なるテクニックではありません。
「本当に必要なリソース(CPUやメモリ)を、どこに投入すべきか?」を考える、エンジニアとしての思考プロセスそのものです。

「マクロの記録」で自動化の楽しさを知り、
「オブジェクトモデル」で複雑な操作を制御し、
そして今日学んだ「バイナリ解析」で圧倒的なパフォーマンスを実現する。

このステップを一つずつ登っていけば、あなたは必ず、現場で「手放せないエンジニア」になれますよ。
応援しています。さあ、次のコードを書きに進みましょう!

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