【入門編】【上級プロフェッショナル向け】AutoCAD VBAとPythonの連携:ODA File Converterをバックグラウンドで叩くバージョン変換パイプライン – AutoCAD VBA解析バイブル

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

【上級プロフェッショナルへの登竜門】AutoCAD VBAで実現する「爆速」バージョン変換パイプライン — ODA File Converterとの連携術

こんにちは。現場で日々、設計自動化の荒波に揉まれているエンジニアの皆さん。
今日は、マクロの記録機能(Record Macro)を卒業し、「AutoCADという巨大なシステムを、外側から操る」という、一歩上のステージへ進むための技術をお話ししましょう。

皆さんはこんな経験はありませんか?
「取引先から届いた大量の古いバージョンのDWGファイル。一つずつ開いて『名前を付けて保存』で最新版に変換していくなんて、日が暮れてしまう……」

AutoCADのVBAを使って、`Documents.Open` から `SaveAs` を繰り返すコードを書けば、確かに自動化はできます。しかし、それは「重い鎧を着たまま、全力疾走しようとする」ようなものです。AutoCAD本体を起動し、図面をメモリに読み込み、描画エンジンを動かし……。これでは、数千ファイルの変換には到底耐えられません。

そこで登場するのが、今回の主役である「外部コンバーター(ODA File Converter)を、VBAから『司令塔』として操る」という手法です。

1. なぜAutoCAD本体を使わないのか?(設計思想の転換)

プロフェッショナルな自動化エンジニアは、常に「リソースの最適化」を考えます。

  • AutoCAD VBAによる変換: AutoCADを起動 $\rightarrow$ 図面を開く $\rightarrow$ メモリに展開 $\rightarrow$ 保存 $\rightarrow$ 閉じる。
  • *欠点:* 非常に重い。メモリ不足でクラッシュしやすい。図面が破損していると、AutoCADごと止まるリスクがある。
  • ODA File Converterによる変換: コマンドラインから直接、変換エンジンを叩く。
  • *利点:* AutoCADを介さないため、圧倒的に軽量・高速。バックグラウンドで「黙々と」処理ができる。

私たちは、VBAを「図面を描く道具」として使うのではなく、「外部ツールに命令を飛ばす司令塔(オーケストレーター)」として使うのです。

2. 準備するもの:ODA File Converter

今回のパイプラインの核となるのは、[ODA File Converter](https://www.opendesign.com/guestfiles/oda_file_converter) です。これは、AutoCADを持っていなくてもDWG/DXFのバージョン変換ができる、非常に強力なスタンドアロン・ツールです。

これをインストールしておけば、コマンドライン(黒い画面)から「このフォルダのファイルを、このバージョンに変えておけ!」と命令できるようになります。

3. 実践:爆速変換パイプラインのコード

それでは、VBAからこのコンバーターを呼び出すコードを見ていきましょう。
ここでは、初心者の方でも仕組みが理解できるよう、あえて「参照設定」を必要としない「レイトバインディング(遅延結合)」という手法で書いています。これなら、コピー&ペーストしてすぐに動かせますよ。

Option Explicit

''' <summary>
''' ODA File Converterを呼び出し、指定フォルダ内のDWGを一括変換する
''' </summary>
Sub ExecuteVersionConversionPipeline()
    ' --- 設定エリア:ここを自分の環境に合わせて書き換えてください ---
    Dim odaExePath As String
    Dim inputFolder As String
    Dim outputFolder As String
    Dim outputVersion As String ' 例: "ACAD2018"
    Dim outputFormat As String  ' "DWG" または "DXF"
    
    ' ODA File Converterの実行ファイルのパス
    odaExePath = "C:\Program Files\ODA\ODAFileConverter\ODAFileConverter.exe"
    
    ' 入力フォルダと出力フォルダ(末尾に必ず \ をつけること)
    inputFolder = "C:\Work\OldFiles\"
    outputFolder = "C:\Work\NewFiles\"
    
    ' 出力形式の設定
    outputVersion = "ACAD2018"
    outputFormat = "DWG"
    ' ----------------------------------------------------------

    ' 1. フォルダの存在チェック(エラー防止の基本!)
    If Dir(inputFolder, vbDirectory) = "" Then
        MsgBox "入力フォルダが見つかりません: " & inputFolder, vbCritical
        Exit Sub
    End If
    
    ' 出力フォルダがなければ作成する
    If Dir(outputFolder, vbDirectory) = "" Then
        MkDir outputFolder
    End If

    ' 2. コマンドライン引数の組み立て
    ' ODAの仕様: [Input] [Output] [Version] [Format] [Recursive] [Filter]
    ' Recursive: 0=なし, 1=サブフォルダ含める
    ' Filter: *.dwg など
    Dim command As String
    command = """" & odaExePath & """ " & _
              """" & inputFolder & """ " & _
              """" & outputFolder & """ " & _
              outputVersion & " " & _
              outputFormat & " 0 ""*.dwg"""

    ' 3. Shell関数による実行
    ' Shell関数は「命令を出したら、完了を待たずに次の行へ進む」という特性があります。
    ' これにより、AutoCADをフリーズさせずにバックグラウンドで処理を走らせられます。
    On Error GoTo ErrorHandler
    Debug.Print "実行コマンド: " & command
    
    Dim shellResult As Variant
    shellResult = Shell(command, vbNormalFocus)
    
    If shellResult <> 0 Then
        MsgBox "変換プロセスを開始しました。" & vbCrLf & _
               "バックグラウンドで処理が行われます。完了までお待ちください。", vbInformation
    Else
        MsgBox "コマンドの実行に失敗しました。", vbExclamation
    End If

    Exit Sub

ErrorHandler:
    MsgBox "予期せぬエラーが発生しました: " & Err.Description, vbCritical
End Sub

4. コードの解剖学:ここがプロの視点

このコードには、単なる「記録マクロ」にはない、3つの重要なテクニックが隠されています。

① 文字列の「ダブルクォーテーション」問題

外部プログラムを叩く際、パスにスペースが含まれている(例:`Program Files`)と、コンピュータはそこで命令が途切れたと勘違いしてエラーになります。
`””””` という書き方は、VBAにおいて「文字列の中に `”` を入れる」ためのテクニックです。これで、スペース入りのパスも安全に渡すことができます。

② `Shell` 関数の非同期性

`Shell` 関数は、命令を投げた瞬間に「はい、投げました!」とVBA側に制御を戻します。これが非同期処理です。
もし、変換が終わるまでAutoCADを動かしたくない場合は、少し工夫が必要ですが、基本的には「変換は裏側で勝手にやっておいて、自分は別の作業をする」というスタイルが、最も効率的なワークフローを生みます。

③ エラーハンドリングの重要性

`On Error GoTo ErrorHandler`。これは「もし失敗しても、パニックにならずにエラーメッセージを出して安全に終了する」ための魔法の言葉です。自動化プログラムにおいて、エラーで止まることは、現場では「作業停止」を意味します。プロは必ず「失敗した時の逃げ道」を用意します。

5. さらなる高みへ:Pythonとの連携

もし、あなたが「特定のファイル名パターンだけを抽出したい」「変換後にファイルサイズをチェックして、異常なファイルがあればメールを送りたい」といった、より複雑なロジックを組みたくなったら……。

その時こそ、Pythonの出番です。

1. Pythonでファイルリストを高度なロジックで解析。
2. VBA(またはPythonから直接)で、整理されたリストに基づいてODAを叩く。

このように、「適材適所」でツールを組み合わせるのが、真のアーキテクトです。VBAはAutoCADとの親和性が高い一方で、ファイル操作や複雑な条件分岐、外部ライブラリの活用はPythonの方が圧倒的に得意です。

まとめ:一歩踏み出すあなたへ

「マクロの記録」は、階段の最初の一段です。
そこから「自分でコードを書き、外部のツールを組み合わせ、システム全体の流れを設計する」ことへ進むと、あなたの価値は劇的に高まります。

今回紹介した「外部コンバーターの制御」は、そのための強力な武器になります。まずは、小さなフォルダで試してみてください。コマンドラインが走り、次々とファイルが変換されていく様子を見るのは、エンジニアとして最高の快感ですよ。

「AutoCADを操るのではない。AutoCADという環境を、あなたの意志でコントロールするのだ。」

さあ、次の自動化へ向けて、一歩踏み出しましょう!

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