【入門編】【上級】AcadDocument.Database.LayoutsのTabOrder再整列:図面名称の連番に基づいてレイアウトタブの並び順を自動でソートする – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!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の基礎はバッチリです!
ぜひ自分の図面環境に組み込んで、ワンクリックで美しく整う快感を味わってみてください。それでは、次の自動化の旅でお会いしましょう!

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