こんにちは!AutoCADの自動化の世界へようこそ。
日々、膨大な数の図面と格闘していると、こんなストレスを感じたことはありませんか?
「レイアウトタブがバラバラに追加されてしまい、シート番号順になっていない…」
「提出前の最終チェックで、タブの順番を1枚ずつ手動でドラッグして並べ替えるのが面倒くさい…」
分かります。その手作業、エンジニアの誇りにかけて今すぐ自動化しましょう!
今回は、AutoCAD VBAの心臓部である`Database`と`Layouts`コレクション、そしてタブの並び順を司る`TabOrder`プロパティを完全に掌握し、図面名称の連番に基づいてレイアウトタブを美しく自動ソートする極上のロジックを伝授します。
ここをクリアすれば、あなたも単なる「マクロの記録者」から「AutoCAD VBAのアーキテクト」への階段を確実に登ることができますよ。それでは、熱いエンジニア魂を込めて解説していきましょう!
—
1. AutoCAD VBAの基礎:なぜ「Database」を経由するのか?
まず、AutoCAD VBAのオブジェクトモデルの基本を押さえましょう。
私たちは普段、画面上で見えている図面を操作するとき、ついつい `ActiveDocument` という言葉を安易に使ってしまいがちです。
しかし、プロとしてワンランク上のコードを書くためには、「Document(ドキュメント)」と「Database(データベース)」の分離を意識する必要があります。
- `AcadDocument`: 今画面で開いている「ファイル」としての側面(ウィンドウや選択セットなど)を管理します。
- `AcadDatabase`: 図面の中に眠る「データそのもの」(画層、ブロック、そして今回の主役であるレイアウトなど)の構造を管理します。
レイアウトタブの並び順(`TabOrder`)を書き換えるという行為は、図面のデータ構造を直接いじる作業です。そのため、`ThisDrawing.Database.Layouts` というルートをたどるのが、最も堅牢でプロフェッショナルなアプローチなのです。
—
2. 核心に迫る:TabOrderプロパティの罠と仕様
レイアウトの並び替えを行う上で、絶対に知っておかなければならないAutoCADの仕様があります。それが「Model(モデル空間)タブの特別扱い」と「TabOrderの重複禁止」です。
1. Modelタブは常に `TabOrder = 0`:
モデル空間のタブは、常に一番左(あるいは最初)に固定されるべき絶対王者です。ペーパー空間のレイアウトタブは、必ず `TabOrder >= 1` の整数で管理されます。
2. 一意性(ユニーク)の原則:
もし既に存在する `TabOrder` の番号を別のレイアウトに割り当てようとすると、AutoCADはエラーを吐いて怒り出します。そのため、並び替えを行う際は「一旦、仮の大きな番号を振る」あるいは「配列やコレクションで綺麗に並べ替えてから一括割り当てする」というスマートなアルゴリズムが必要になります。
—
3. 【実践】レイアウト自動ソートマクロの全コード
お待たせしました。現場でそのままコピペして使える、実用性抜群の完全版コードを公開します。
このコードは、レイアウト名(例: `A-001`, `A-002`, `A-010`…)の文字列を読み取り、昇順に美しく並べ替えるものです。
Sub SortLayoutTabsByTabName()
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.Application.ActiveDocument
Dim acadDb As AcadDatabase
Set acadDb = acadDoc.Database
Dim layoutsCol As AcadLayouts
Set layoutsCol = acadDb.Layouts
‘ 1. Modelタブ以外のレイアウトを格納する動的配列を準備
Dim targetLayouts() As AcadLayout
Dim count As Integer
count = 0
Dim lay As AcadLayout
For Each lay In layoutsCol
‘ Model空間のレイアウトは並び替え対象外(TabOrder = 0 のため除外)
If Not (lay.ModelSpace) Then
ReDim Preserve targetLayouts(count)
Set targetLayouts(count) = lay
count = count + 1
End If
Next lay
‘ レイアウトが1つ以下なら並び替えの必要なし
If count <= 1 Then
MsgBox "並び替えるペーパー空間レイアウトが十分ではありません。", vbInformation
Exit Sub
End If
' 2. バブルソートアルゴリズムによるレイアウト名の昇順ソート
Dim i As Integer, j As Integer
Dim temp As AcadLayout
For i = 0 To count - 2
For j = i + 1 To count - 1
' レイアウト名(Nameプロパティ)で比較
If StrComp(targetLayouts(i).Name, targetLayouts(j.Name), vbTextCompare) > 0 Then
Set temp = targetLayouts(i)
Set targetLayouts(i) = targetLayouts(j)
Set targetLayouts(j) = temp
End If
Next j
Next i
‘ 3. 競合を避けるため、まず全対象レイアウトに一時的な大きなTabOrderを割り当て
For i = 0 To count – 1
targetLayouts(i).TabOrder = i + 1000
Next i
‘ 4. ソート順に従って正しいTabOrder(1から始まる連番)を再割り当て
‘ ※ ModelタブのTabOrderは常に 0 なので、ペーパー空間は 1 からスタート
For i = 0 To count – 1
targetLayouts(i).TabOrder = i + 1
Next i
‘ 画面を強制リフレッシュしてタブの表示を更新
acadDoc.Regen acAll
MsgBox “レイアウトタブの並び替えが完了しました!”, vbInformation, “自動化完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
4. コードの解説:ここがエンジニアのこだわりポイント!
初心者向けのチュートリアルだと、「単にループを回して `TabOrder` を代入するだけ」のコードが多く見られますが、それだと確実にエラーで止まります。このコードの美しいポイントを解説します。
① ターゲットの絞り込み (`Not (lay.ModelSpace)`)
`For Each lay In layoutsCol` で回すと、必ず「Model」という名前のモデル空間用レイアウトがヒットします。これを一緒にソートしようとすると破綻するため、`ModelSpace` プロパティを使って厳密に除外しています。
② 一時的な退避番号(`+ 1000` の魔法)
前述の「一意性の原則」をクリアするため、一度すべてのレイアウトのタブオーダーを `1000` 以上の世界に飛ばしています。これにより、番号の重複によるAutoCAD内部の衝突エラーを完璧に回避しています。
③ 文字列比較の工夫 (`StrComp`関数)
単純に `> Operator` で比較するのではなく、`StrComp(…, vbTextCompare)` を使用することで、大文字・小文字を区別しない堅牢な文字列比較を実現しています。
—
5. さらに実用性を高めるための応用アイデア
今回のコードをベースにすれば、現場の要件に合わせた様々なカスタマイズが可能です。
- 「図面番号(プレフィックス)」でのソート:
レイアウト名が `[図面番号]_[図面名称]` のようになっている場合、文字列の左側(例: Left関数など)を切り出してグループごとにソートするロジックに拡張できます。
- シートセット(DST)との連携:
もしシートセットマネージャを使用しているならタブの順序は自動制御されますが、単体のDWGファイルで複数枚の図面を管理する現場(プラットフォーム設計や建築実施設計など)では、このマクロをリボンメニューやボタンに割り当てるだけで、業務効率が劇的に跳ね上がります。
—
まとめ
今回は、`AcadDocument.Database.Layouts` と `TabOrder` を駆使した、レイアウトタブの自動ソート術を解説しました。
「タブの並び替え」という、一見地味で誰もが諦めて手作業で行っていた領域にこそ、プログラムの automaty(自動化)の真髄があります。こういう細部こそこだわるエンジニアこそが、まわりから信頼される真のオートCADマスターです。
ここをクリアしたあなたなら、もうAutoCAD VBAの基礎はバッチリです!
ぜひ自分の図面環境に組み込んで、ワンクリックで美しく整う快感を味わってみてください。それでは、次の自動化の旅でお会いしましょう!
