AutoCAD VBAの深淵へ:マルチレイアウトを「個別ファイル」に切り出す究極の自動化術
こんにちは。現場の最前線でCADの自動化と戦い続けているエンジニアです。
「1つのDWGの中に、数十枚ものレイアウトが並んでいる……。これを納品用に、いちいち名前を付けて別ファイルとして保存する」。そんな単調でミスを誘発する作業に、あなたの貴重な時間を費やしていませんか?
今回は、AutoCAD VBAの真髄である「データベースへの深いアクセス」と「オブジェクトのライフサイクル管理」を駆使し、この面倒な作業をわずか数秒で終わらせる魔法のコードを伝授します。
マクロの記録から一歩先へ。真のエンジニアとしての第一歩を、一緒に踏み出しましょう。
—
なぜ「自動化」が必要なのか?:思考のエンジニアリング
ただコードを書くのではなく、なぜこの処理が必要なのかを理解することが重要です。
AutoCADの図面ファイルは、単なる絵ではなく「データベース」です。レイアウト(Layout)は、そのデータベースの中に存在する「印刷用ビューの設定」に過ぎません。これを個別のファイルに切り出すということは、「特定のレイアウト以外をすべて破棄し、名前を付けて保存する」という破壊的な操作をプログラムに命令するということです。
ここで最も重要なのは、「元データ(開いている図面)を壊さないこと」。今回は、メモリ上で安全に複製を作成し、それを出力する、プロが好む手法を採用します。
—
現場で即戦力となる自動化コード
以下のコードをVBAエディタ(`Alt + F11`)に貼り付けてください。
Sub ExportLayoutsToIndividualFiles()
Dim doc As AcadDocument
Dim layout As AcadLayout
Dim newDoc As AcadDocument
Dim savePath As String
‘ 現在アクティブな図面を参照
Set doc = ThisDrawing.Application.ActiveDocument
‘ 保存先(環境に合わせてパスを変更してください)
savePath = “C:\OutputFolder\”
‘ すべてのレイアウトを走査
For Each layout In doc.Layouts
‘ “Model”空間はスキップ(必要に応じて調整してください)
If layout.Name <> “Model” Then
‘ 1. 新規図面を作成し、現在の図面をテンプレート的に利用
Set newDoc = Application.Documents.Add(“acad.dwt”)
‘ 2. 現在のレイアウトを新規図面にコピーする(※AutoCADの仕様上、WBlock的なアプローチが安全)
‘ ここでは簡略化のため、レイアウトのインポート機能を使用
newDoc.Layouts.Item(0).Delete ‘ 初期レイアウトを削除
doc.CopyObjects Array(layout), newDoc.Layouts
‘ 3. 名前を付けて保存
‘ ファイル名は図面名_レイアウト名.dwgとする
newDoc.SaveAs savePath & Left(doc.Name, Len(doc.Name) – 4) & “_” & layout.Name & “.dwg”
‘ 4. メモリ解放(重要!)
newDoc.Close False
End If
Next
MsgBox “全レイアウトの個別保存が完了しました!”, vbInformation
End Sub
—
ここがポイント!初学者がつまずく「罠」を避ける
1. オブジェクトのメモリ管理(重要!)
`Set newDoc = Application.Documents.Add(…)` で作成したオブジェクトは、自動的には消えません。処理が終わったら必ず `newDoc.Close` を呼び出し、メモリから解放してください。これを忘れると、AutoCADがバックグラウンドで死に続け、PCが重くなる原因になります。
2. 「Model」タブの存在
`For Each` ループでは、必ず「Model」もオブジェクトとして取得されます。これを誤って保存しようとすると、期待したレイアウト情報が含まれない図面ができあがります。`If` 文で除外処理を入れるのが「現場の鉄則」です。
3. パスの文字列操作
`Left(doc.Name, Len(doc.Name) – 4)` という記述は、ファイル名の拡張子(.dwg)を取り除くための定石です。パス操作は、`.` や `\` の位置を誤るとエラーが出やすいため、`FileSystemObject` を使うのがよりスマートですが、まずはこの基本形で感覚を掴んでください。
—
次のステップへ:プロのエンジニアを目指すあなたへ
今回のコードは、いわば「導入」です。実務では、ここからさらに以下のような工夫を重ねていきます。
- エラーハンドリング: 保存先に同名のファイルがあったらどうするか?(`On Error Resume Next` で強行突破するか、確認ダイアログを出すか)
- レイヤーの自動調整: 出力時に不要なレイヤーを凍結する処理を加える。
- バッチ処理: フォルダ内の全DWGに対してこのスクリプトを走らせる「司令塔」マクロを作る。
AutoCAD VBAは、あなたの「退屈な時間」を「知的な創造の時間」に変える最強の武器です。今日書いたこのコードが、あなたの業務を劇的に改善する小さな一歩になることを確信しています。
何か分からないことがあれば、いつでも聞いてくださいね。一緒にプロの自動化エンジニアを目指しましょう!
