こんにちは!AutoCADの自動化の世界へようこそ。
シニアアーキテクトの私です。
マクロの記録ボタンを押すだけのステップから抜け出し、「自分の手でCADを自在に操りたい」と願うあなたへ。今回は、実務で死ぬほど役立つテクニック「WBLOCK(ブロック書き出し)コマンドのVBA完全再現」を伝授します。
図面全体を保存する `SaveAs` なんて野暮なことは言いません。
今回は、「画面上の特定の図形(エンティティ)だけを摘み出し、まっさらな新しいDWGファイルとして爆速で保存する」という、プログラミングならではのスマートなファイル分割術をマスターしましょう。
ここをクリアすれば、図面管理の自動化において、あなたの右に出る者はいなくなります。さあ、一緒に深淵を覗いてみましょう。
—
なぜ `SaveAs` ではダメなのか?実務の壁とWBLOCKの哲学
図面の一部を別ファイルにしたい時、手作業であれば「要らない部分を削除して名前を付けて保存」するか、「クリップボードにコピーして新規図面に貼り付け」をしますよね。
しかし、VBAでこれをやろうとすると悲劇が起きます。
- `SaveAs` を使うと、図面全体が保存されてしまうため、不要なレイヤやブロック、寸法スタイルまで引き継がれてファイルが肥大化する。
- ゴリゴリと図形を削除していくコードを書くと、図面データベース(Database)のトランザクションが汚くなり、最悪の場合ファイルが破損する。
ここで登場するのが、AutoCADが誇る孤高のメソッド `WBlock` です。
これは、指定したオブジェクトの集合(SelectionSet)やブロックを、「綺麗に掃除された純度100%の新規DWG」として切り出すための専用機能です。VBAではこれをプログラムから正確に呼び出すことができます。
—
攻略の鍵:Document.WBlock メソッドの正体
AutoCAD VBAにおいて、`WBlock`を実行する方法はいくつかありますが、最も確実で実務に耐えうるのは、「あらかじめ選択セット(SelectionSet)を作っておき、それを対象にWBlockを実行する」というアプローチです。
しかし、ここでAutoCAD VBA特有の「罠」があります。
`WBlock` メソッドの引数は、実はバージョンやオブジェクトの渡し方によって挙動が少しデリケートなのです。
まずは、実務でそのまま使える「模範解答コード」を提示しましょう。じっくり読み込んでください。
—
実装コード:選択図形を別DWGとして書き出すマクロ
以下のコードは、ユーザーに画面上で図形を選択してもらい、指定したパスに新しいDWGとして書き出すプロシージャです。
Sub ExportSelectedObjectsToDWG()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.ActiveDocument
‘ 1. ユーザーに書き出したいオブジェクトを選択させる
Dim sset As AcadSelectionSet
On Error Resume Next
‘ 既存の同名選択セットがあれば削除(クリーンアップの鉄則)
acadDoc.SelectionSets.Item(“WBlockSet”).Delete
On Error GoTo 0
Set sset = acadDoc.SelectionSets.Add(“WBlockSet”)
‘ 画面上でオブジェクトを選択(プロンプト表示)
MsgBox “別ファイルとして書き出したいオブジェクトを選択してください。”, vbInformation, “WBLOCK自動化”
sset.SelectOnScreen
‘ 何も選択されなかった場合は処理を中断
If sset.Count = 0 Then
MsgBox “オブジェクトが選択されませんでした。処理を中止します。”, vbExclamation
Exit Sub
End If
‘ 2. 保存先ファイルのパスを決定(今回はデスクトップに固定)
Dim FilePath As String
FilePath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\Exported_Part.dwg”
‘ 既に同名のファイルがある場合は上書きのために削除
If Dir(FilePath) <> “” Then
Kill FilePath
End If
‘ 3. 基点(挿入基点)の指定
‘ 今回は原点 (0,0,0) を基準点としますが、必要に応じて変数の配列を渡します
Dim basePoint(0 To 2) As Double
basePoint(0) = 0#: basePoint(1) = 0#: basePoint(2) = 0#
‘ 4. WBlockの実行(ここが核心!)
On Error GoTo ErrorHandler
acadDoc.WBlock FilePath, sset
‘ 後片付け:選択セットの解放
sset.Delete
MsgBox “以下のパスに正常に書き出されました!” & vbCrLf & FilePath, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
If Not sset Is Nothing Then sset.Delete
End Sub
—
コードの深掘り解説:プロが仕込んだ3つのこだわり
上記のコード、一見するとシンプルですが、プロのエンジニアとしてのこだわりが随所に詰まっています。
① 選択セットの「生きて死ぬサイクル」の管理
VBAで `SelectionSets.Add` を使うとき、最も多いバグが「すでに同じ名前の選択セットが存在しています」というエラーです。
これを防ぐために、`On Error Resume Next` を使って、あらかじめ同名の選択セットが存在していれば強制削除(`.Delete`)する安全装置を組み込んでいます。オブジェクトのライフサイクルをコントロールする基本中の基本です。
② パスの動的取得(デスクトップを狙い撃つ)
`”C:\Users\Yamada\Desktop\…”` のようにハードコーディングするのはアマチュアのやり方です。
`CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)` を使うことで、どのユーザーのPCでマクロを実行しても、確実に「デスクトップ」のパスを動的に取得できます。
③ エラーハンドリングと後片付け
CADの自動化において、途中で処理が中断したときにメモリやオブジェクトが残骸として残る(メモリリークやロック)のは最悪です。
`ErrorHandler`ラベルを設置し、万が一エラーが起きた場合でも必ず `sset.Delete` で選択セットを消去する設計にしています。
—
陥りやすい罠とエラー回避の極意
このWBLOCK自動化を実務で運用する際、多くの初学者が以下の壁にぶつかります。
罠1: 「ファイルが既に存在します」と言われて止まる
`WBlock` メソッドは、指定したパスに同名のファイルがあると自動上書きしてくれない場合があります。そのため、コード内で行っているように、事前に `Dir` 関数でファイルの存在を確認し、`Kill` 関数で古いファイルを消去するロジックが必須となります。
罠2: ブロック定義や画層(Layer)の持ち込み問題
WBLOCKで切り出した図面には、選択した図形が属している画層も一緒にエクスポートされます。もし「ゼロからクリーンな状態にしたい」という場合は、書き出した後のファイルを一度バックグラウンドで開き、不不要な画層をパージ(PURGE)する処理を組み合わせると完璧です。
—
おわりに:ここをクリアすれば、あなたはもう中級者
お疲れ様でした!
図面全体を保存するだけのマクロから卒業し、「図面の一部を自在に切り出して流通させる」という高度なデータベース操作をあなたは手に入れました。
この技術を応用すれば、
- 「特定のレイヤの図形だけを全て個別のDWGにバラすバッチ処理」
- 「見積もり用のパーツを自動で別フォルダに切り出すシステム」
などが、あなたの手で簡単に作れるようになります。
ここをクリアしたあなたなら、AutoCAD VBAの基本はもうバッチリです。自信を持って、次の自動化の扉を開いてください。それでは、また次回の極限知見でお会いしましょう!
