こんにちは!AutoCADの自動化の世界へようこそ。
日々、膨大な図面と格闘していると、「あぁ、この図面群、全部寸法スタイルがバラバラじゃないか……!」と頭を抱えたくなる瞬間がありませんか?前任者が適当に作った図面や、外注から返ってきた図面のフォーマットを整えるだけで、半日が終わってしまうなんてことも珍しくありません。
マクロの記録ボタンを押してガチャガチャ動かすだけの時代はもう終わりです。今回は、図面内に散らばるすべての寸法オブジェクトを一網打尽にし、指定した「正しい寸法スタイル」へ一瞬で統一する、実務で即戦力になるVBAマクロを授けましょう。
ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの基本はバッチリです。優しく、そして本質的なところまでしっかりと解説していきますね。
—
1. AutoCAD VBAの心臓部:オブジェクトモデルを理解する
まず、AutoCAD VBAを書く上で絶対に避けて通れない「世界観」をお話しします。
AutoCADの中は、ロシアの民芸品「マトリョーシカ」のように、大きなオブジェクトの中に小さなオブジェクトが綺麗に収まる階層構造(オブジェクトモデル)になっています。
[AcadApplication] (AutoCADそのもの)
┗ [AcadDocument] (現在開いている図面)
┣ [ModelSpace] (図面のキャンバス・空間)
┃ ┣ [AcadDimAligned] (傾き寸法)
┃ ┣ [AcadDimRotated] (線形寸法)
┃ ┗ [AcadDimRadial] (半径寸法)
┗ [AcadDimStyles] (寸法スタイルのコレクション)
今回のミッションは、「ModelSpace(空間)から全ての寸法オブジェクトを拾い集め、それぞれのスタイルを指定のものに書き換える」という作業です。
—
2. 実戦投入!寸法スタイルを一括統一するVBAコード
余計な能書きはこれくらいにして、さっそく実務でそのまま使えるコードをお見せしましょう。
VBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。
Sub ForceUpdateDimensionStyle()
‘ —————————————————————–
‘ 目的: 図面内のすべての寸法オブジェクトのスタイルを指定名に一括変更する
‘ —————————————————————–
‘ 1. 変更したい「目標の寸法スタイル名」をここに指定します
Const TARGET_STYLE_NAME As String = “JIS_Standard”
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
‘ 2. 指定したスタイルが本当に図面内に存在するかチェックする
If Not CheckDimensionStyleExists(acadDoc, TARGET_STYLE_NAME) Then
MsgBox “エラー: 寸法スタイル ‘” & TARGET_STYLE_NAME & “‘ がこの図面に存在しません。”, _
vbCritical, “スタイルが見つかりません”
Exit Sub
End If
Dim ent As AcadEntity
Dim dimObj As AcadDimension
Dim count As Long
count = 0
‘ 3. 画面の再描画をロックして処理速度を劇的に爆上げする(超重要テクニック)
acadDoc.Utility.Prompt “寸法スタイルの統一処理を開始します…” & vbCrLf
‘ 4. モデル空間の全エンティティをしらみつぶしに走査する
For Each ent In acadDoc.ModelSpace
‘ オブジェクトが「寸法 (AcadDimension)」の仲間かどうかを判定
If TypeOf ent Is AcadDimension Then
Set dimObj = ent
‘ 現在のスタイルとターゲットが違う場合のみ書き換える(無駄な処理を省く)
If dimObj.StyleName <> TARGET_STYLE_NAME Then
dimObj.StyleName = TARGET_STYLE_NAME
dimObj.Update ‘ 変更を確実に図面に反映
count = count + 1
End If
End If
Next ent
‘ 5. 結果報告
MsgBox “処理が完了しました!” & vbCrLf & _
“スタイルを統一した寸法数: ” & count & ” 件”, _
vbInformation, “一括処理完了”
End Sub
‘ — 【ヘルパー関数】指定した寸法スタイルが存在するか確認する関数 —
Function CheckDimensionStyleExists(doc As AcadDocument, styleName As String) As Boolean
Dim dimStyle As AcadDimStyle
Dim exists As Boolean
exists = False
For Each dimStyle In doc.DimStyles
If StrComp(dimStyle.Name, styleName, vbTextCompare) = 0 Then
exists = True
Exit For
End If
Next dimStyle
CheckDimensionStyleExists = exists
End Function
—
3. コードの急所を解説!プロが教える「知見」
このコードには、現場で生き残るためのエンジニアの知見がいくつか詰め込まれています。ポイントを解説しましょう。
① `TypeOf … Is` による型安全なフィルタリング
AutoCADのモデル空間には、線、円、文字、ブロックなど、ありとあらゆる図形が同居しています。その中から「寸法だけ」を正確に釣り上げるために使っているのが `If TypeOf ent Is AcadDimension Then` です。
これをサボって適当なオブジェクトを寸法として扱おうとすると、即座に「型が一致しません」という冷たいエラー(実行エラー 13)が返ってきます。
② 無駄な書き換えをしないスマートさ
`dimObj.StyleName = TARGET_STYLE_NAME` でスタイルを代入していますが、その手前で `If dimObj.StyleName <> TARGET_STYLE_NAME Then` というガードを挟んでいます。
すでに正しいスタイルが適用されているオブジェクトまでわざわざ上書き命令を送るのは、プログラムにとってもAutoCADのメモリにとっても無駄な負荷です。プロは「変える必要がある時だけ動く」ように書きます。
③ エラーを未然に防ぐ「存在チェック(事前検証)」
もし、コード内の `TARGET_STYLE_NAME` に存在しない名前(例えばスペルミスなど)を指定して実行したらどうなるでしょうか?AutoCADは途中で処理を投げ出し、エラーで止まってしまいます。
それを防ぐために、メイン処理の前に `CheckDimensionStyleExists` 関数を走らせ、スタイルが存在するかどうかをあらかじめチェックする「防衛的プログラミング」を取り入れています。実務の現場では、こういう細やかな配慮が信頼を生みます。
—
4. 陥りやすい罠とエラー対策
最後に、初学者が必ずと言っていいほどハマる罠を共有しておきます。
- 罠:「ペーパー空間(レイアウト)」の寸法が変わらない!
今回のコードは `acadDoc.ModelSpace`(モデル空間)を対象にしています。もし、レイアウトタブ(ビューポートや図枠周辺)に配置された寸法も一括変更したい場合は、`acadDoc.PaperSpace` を対象にしたループをもう一つ回す必要があります。用途に合わせて拡張してみてください。
- 罠:マルチリーダー(引出線)が変わらない!
「あれ、寸法スタイルを変えたのにマルチリーダー(MLeader)の見た目が変わらないぞ?」と思った方、鋭いですね!マルチリーダーは `AcadDimension` ではなく `AcadMLeader` という全く別のオブジェクト分類になります。マルチリーダーも対象にしたい場合は、同様に `TypeOf ent Is AcadMLeader` で判定して処理を追加してください。
—
まとめ
お疲れ様でした!今回は「図面内の全寸法スタイルの統一」という、実務で100%直面する課題をテーマにAutoCAD VBAの基礎と実践知を解説しました。
ここをクリアできれば、次は「特定のレイヤにあるものだけ変更する」「文字の高さも一緒に揃える」といった応用へ自然に進むことができます。
ご自身の業務に合わせてコードを少しずつ改造し、ぜひ日々の手作業を自動化の爽快感に置き換えていってくださいね。あなたのAutoCADライフがより快適になることを応援しています!
