【AutoCAD VBA 掌握術】「今開いている図面」と「全ての図面」を支配する:ThisDrawing.Close と Documents.Close の決定的な違い
こんにちは。AutoCAD VBAの世界へようこそ。
マクロの記録機能を使って「あ、これ自動化できそうだな」と感じ始めたあなた。素晴らしい一歩を踏み出しましたね。でも、記録されたコードを眺めているうちに、「あれ? この `ThisDrawing` って何? `Documents` と何が違うの?」という疑問が湧いてきませんでしたか?
実は、ここが「ただのマクロ記録ユーザー」と「プロフェッショナルな自動化エンジニア」を分ける、最初の、そして非常に重要な境界線なのです。
今日は、図面ファイルを閉じるという一見シンプルに見える動作の裏側にある、オブジェクトの構造と、プロが必ず意識する「メモリと制御」の考え方を伝授します。ここをクリアすれば、あなたのVBAは一段上のステージへと進化しますよ。
1. 概念の整理: 「自分」か「世界」か
まず、頭の中にイメージを持ってください。AutoCADという「アプリケーション」という大きな箱の中に、複数の「図面(ドキュメント)」が入っている状態を。
ThisDrawing: 「今、自分が手にしている一枚」
`ThisDrawing` は、現在マクロが実行されている「まさにその図面」を指すショートカットです。
例えるなら、あなたが机の上で作業しているとき、「今、自分の目の前で開いているその紙」のこと。自分自身のことを指す「私」に近い存在です。
Documents: 「机の上に並んだ全ての書類の束」
`Documents` は、AutoCADの中で現在開いている「全ての図面を管理しているコレクション(集合体)」です。
例えるなら、机の上に積み上げられた「書類のスタック全体」のこと。その中から「2枚目の図面」や「”A設計.dwg”という名前の図面」を指名して操作することができます。
2. メソッドの違いと使い分け
では、具体的にどう使い分けるのかを見ていきましょう。
ThisDrawing.Close
これは「今動いているこの図面を閉じなさい」という命令です。
- いつ使うか?:
「この図面に対して処理が終わったから、自分自身を閉じたい」という、非常に限定的なシーンで使います。
- 注意点(重要!):
マクロが動いている最中に自分自身(`ThisDrawing`)を閉じると、実行中のコードも強制終了されます。 「作業が終わる前に、自分が消えてしまう」という現象が起きるため、ループ処理の中でこれを使うと、プログラムが予期せぬ動きをすることがあります。
Documents.Close
これは「(指定した)図面を閉じなさい」という、管理者の命令です。
- いつ使うか?:
「開いている図面を順番に全部処理して、一つずつ閉じていきたい」という、バッチ処理(一括処理)の際に真価を発揮します。
- 強み:
「今、アクティブな図面ではないけれど、裏で開いているあの図面を閉じたい」といった、対象をピンポイントで指定した制御が可能です。
3. 【実践】初心者が必ず陥る「ループの罠」
ここからが、エンジニアとしての腕の見せ所です。
「開いている図面を全部閉じたい」と思ったとき、初心者はつい以下のようなコードを書いてしまいます。
❌ やってはいけない例(エラーやスキップの原因)
' ⚠️ 注意:これは推奨されない書き方です
Sub BadCloseLoop()
Dim i As Integer
' 開いている図面の数だけ繰り返す
For i = 1 To Documents.Count
' 1番目から順番に閉じていく
Documents.Item(i).Close
Next i
End Sub
なぜこれがダメなのか?
ここが「オブジェクトのライフサイクル」の恐ろしいところです。
例えば、図面が3枚開いているとします。
1. `i = 1` のとき、1枚目の図面を閉じます。
2. すると、2枚目だった図面が、自動的に「1枚目」に繰り上がります。
3. 次のループ `i = 2` が回ったとき、プログラムは「新しい2枚目(元々は3枚目だったもの)」を見に行きます。
4. 結果として、繰り上がった図面がスキップされてしまうのです!
✅ プロの書き方: 「後ろから攻める」
大量のファイルを処理するプロは、必ず「後ろ(インデックスの大きい方)から」処理します。
' ✨ プロの書き方:後ろからカウントダウンする
Sub GoodCloseLoop()
Dim i As Integer
' Documents.Count から 1 に向かって、Step -1 で減らしていく
' これなら、図面を閉じても「次に処理すべき番号」がズレない!
For i = Documents.Count To 1 Step -1
On Error Resume Next ' 万が一のファイルロックエラー対策
' 保存せずに閉じる場合は False を指定
Documents.Item(i).Close False
On Error GoTo 0
Next i
MsgBox "全ての図面を閉じました。"
End Sub
4. 伝説のアーキテクトからのアドバイス: メモリへの配慮
最後に、一歩先の視点を授けましょう。
なぜ、図面を閉じることを意識しなければならないのか。それは「メモリ(RAM)」のためです。
AutoCADは非常に重厚なソフトウェアです。巨大な図面を何枚も開いたままにすると、PCのメモリを食いつぶし、AutoCADの動作が極端に重くなったり、最悪の場合はクラッシュします。
自動化ツールを作る際は、「処理が終わった図面は、速やかに、確実に閉じる」。
これが、ユーザーにストレスを与えない「一流のツール」を作るための鉄則です。
- `ThisDrawing.Close` は「自分」を閉じる。
- `Documents.Close` は「管理対象」を閉じる。
- ループで閉じるなら、必ず `Step -1`(逆順) で!
まとめ
| 特徴 | `ThisDrawing.Close` | `Documents.Close` |
|---|---|---|
| 対象 | 現在マクロが動いている図面 | 指定した図面(または全図面) |
| 主な用途 | 単一図面での完結した処理 | 複数図面のバッチ処理・一括管理 |
| リスク | コードが途中で強制終了する | ループ時にインデックスがズレる |
| エンジニアの心得 | 自身のライフサイクルを意識せよ | 逆順ループで集合体を制御せよ |
ここを理解したあなたは、もう「記録されたコード」をただ写しているだけの初心者ではありません。オブジェクトの動きを予測し、制御しようとする「エンジニア」の入り口に立っています。
一歩ずつ、確実に。AutoCAD VBAの世界を、あなたの手で自由に操ってください。応援していますよ!
