【AutoCAD VBA超実践】バラバラのフォントを駆使した図面を「MSゴシック」へ一瞬で強制統一する堅牢なコード設計
図面納品前の最終チェック。他社から受領した図面、あるいは社内の複数担当者がバラバラの環境で作成した図面を開いた瞬間、絶望したことはないだろうか。
「寸法値はメイリオ、注記はMSゴシック、タイトルは游ゴシック……おまけに文字スタイルごとにフォントファイルが違うせいで、文字化けやレイアウト崩壊のオンパレードだ」
このような「フォントの無秩序」は、CADオペレーターが手作業で1つずつ修正しようものなら数時間の残業が確定する悪夢の元凶である。
今回は、AutoCAD VBAのオブジェクトモデルを正しく理解し、図面内のすべての文字スタイル(TextStyle)を社内標準フォント(例: MSゴシック)へ一瞬で強制統一する、実務直結のプロダクションコードを伝授する。
—
1. なぜ「個別の文字」ではなく「文字スタイル」を叩くべきなのか?
初学者がやりがしな最大のアンチパターンがこれだ。
> 「よし、図面内のすべてのTextオブジェクトやMTextオブジェクトをループさせて、 `.FontName = “MS Gothic”` に書き換えよう!」
今すぐその発想を捨ててほしい。
これをやってしまうと、CAD内部のデータベース(DXFグループコード)を無駄に肥大化させるだけでなく、属性定義(Attribute)やブロック内部にネストされた文字を取りこぼす。何より、AutoCADの本質である「オブジェクト指向のデータベース構造」を完全に無視した非効率なアプローチだ。
AutoCADの文字は、「文字スタイル(TextStyle)」という親データに紐づいている。
人間で言えば、戸籍(TextStyle)が変われば、そこにぶら下がる家族(Text/MText)のフォント設定も自動的に統制される仕組みだ。
したがって、我々が操作すべきは個々の文字オブジェクトではなく、`AcadDocument.TextStyles` コレクションそのものである。大元を断つことで、図面全体の整合性を一撃で担保できる。
—
2. 堅牢なVBAコード設計のポイント
実務で使えるツールを作るにあたり、以下の3点を担保しなければならない。
1. エラーハンドリングの徹底: 読み取り専用(Read-only)のシステムスタイル(例: `Standard` など)や、外部参照(Xref)由来のスタイルを誤って破壊し、実行時エラーでマクロがクラッシュするのを防ぐ。
2. トランザクション的思考(画面描画の抑制): ループ処理中の画面再描画(`Regen`)を止め、処理速度を極限まで高める。
3. 完全修飾(Fully Qualified)な記述: 暗黙的なアクティブオブジェクトへの依存を断ち切り、複数の図面を開いているマルチドキュメント環境(MDI)でも暴走しない設計にする。
—
3. 【コピペOK】社内標準フォント一括強制変更プロシージャ
以下のコードをAutoCADのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けて実行してほしい。
Option Explicit
‘ ==============================================================================
‘ 処理名 : ForceUnifyTextStylesToMSGothic
‘ 概要 : アクティブ図面内の全文字スタイルを「MSゴシック」へ強制統一する
‘ 備考 : 読み取り専用スタイルや特殊フォントへの配慮を組み込んだ堅牢版
‘ ==============================================================================
Public Sub ForceUnifyTextStylesToMSGothic()
‘ 1. 宣言と環境の固定
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.Application.ActiveDocument
‘ マルチドキュメント環境での安全性を考慮し、画面描画をロックしてパフォーマンスを最大化
acadDoc.Utility.SetVariable “REGENMODE”, 0
On Error GoTo ErrorHandler
Dim targetStyle As AcadTextStyle
Dim targetFontName As String
targetFontName = “MS Gothic” ‘ 社内標準フォントを指定
Dim modifiedCount As Long
modifiedCount = 0
‘ 2. TextStylesコレクションを走査
Dim styleItem As Variant
For Each styleItem In acadDoc.TextStyles
Set targetStyle = styleItem
‘ 【重要】シェイプファイル(.shx)を使用しているスタイルや、
‘ 読み取り専用フラグが立っている特殊なスタイルはスキップまたは安全に処理
If Not IsShapeFileStyle(targetStyle) Then
‘ フォント名とスタイル名をチェック(必要に応じてログ出力等も可)
‘ すでにMSゴシックになっている場合は無駄な書き換えを避ける
Dim currentFont As String
Dim dummyHeight As Double, dummyWidth As Double
Dim dummyOblique As Double, dummyBold As Boolean, dummyItalic As Boolean
Dim dummyCharset As Long, dummyPitchAndFamily As Long
‘ 現在のフォント情報を取得
acadDoc.GetTextStyle targetStyle.Name, currentFont, dummyHeight, dummyWidth, _
dummyOblique, dummyBold, dummyItalic, dummyCharset, dummyPitchAndFamily
If StrComp(currentFont, targetFontName, vbTextCompare) <> 0 Then
‘ TrueTypeフォントとしてMSゴシックを設定
‘ 引数: StyleName, FontName, Height, Width, ObliqueAngle, Bold, Italic, CharSet, PitchAndFamily
acadDoc.SetTextStyle targetStyle.Name, targetFontName, 0#, 1#, 0#, False, False, 1, 34
modifiedCount = modifiedCount + 1
End If
End If
Next styleItem
‘ 3. 終了処理と通知
‘ 画面描画を復旧し、強制再描画を実行
acadDoc.Utility.SetVariable “REGENMODE”, 1
acadDoc.Regen acAllViewports
MsgBox “文字スタイルの統一が完了しました。” & vbCrLf & _
“変更されたスタイル数: ” & modifiedCount & “件”, vbInformation, “AutoCAD VBA 自動化”
Exit Sub
ErrorHandler:
‘ 異常時のクリーンアップ
acadDoc.Utility.SetVariable “REGENMODE”, 1
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub
‘ ==============================================================================
‘ 補助関数 : シェイプファイル(.shx)を使用しているスタイルか判定する
‘ ==============================================================================
Private Function IsShapeFileStyle(ByVal txtStyle As AcadTextStyle) As Boolean
‘ FontFileプロパティに拡張子「.shx」が含まれている場合はTrueを返す
If InStr(1, txtStyle.fontFile, “.shx”, vbTextCompare) > 0 Then
IsShapeFileStyle = True
Else
IsShapeFileStyle = False
End If
End Function
—
4. チーフアーキテクトが解説するコードの急所
① `REGENMODE` の制御による爆速化
AutoCADは、図面データベース(DB)のプロパティが書き換わるたびに、デフォルトで画面の再描画(Regen)を走らせようとする。スタイルが50個ある図面なら、50回画面が再計算されるためフリーズしたようになる。
コードの最初で `REGENMODE` を `0`(オフ)にし、処理が終わった最後に `1` に戻して `Regen acAllViewports` を叩く。この一手間で、実行時間が数秒から数ミリ秒へと劇的に短縮される。
② `.shx`(シェイプファイル)の排除ロジック
AutoCADには、TrueTypeフォント(MSゴシックなど)の他に、AutoCAD固有のベクターフォントである `.shx` ファイルが存在する。これを無理やりTrueTypeのフォント名で上書きしようとすると、CAD内部で例外が発生するか、スタイルが破損する。
そのため、補助関数 `IsShapeFileStyle` を挟み、レガシーな `.shx` スタイルを安全に除外する設計にしている。
—
5. さらなる実務への応用:データベース連携・自動バッチ化
このマクロを単体の図面で動かすだけでは、プロの自動化エンジニアとは言えない。
実務では、「フォルダ内にある数百枚の図面を夜間に一括処理し、すべて社内標準フォントに書き換えて上書き保存する」という要件が必ず降ってくる。
その場合は、`AcadApplication.Documents.Open` を用いたドキュメント横断バッチ処理へと拡張すればよい。
(※ファイル一括処理の際は、必ずトランザクションのリークや「保存確認ダイアログ」の抑制(`FILEDIA = 0`)を考慮すること忘れないでほしい。)
業務効率化の本質は、「人が手作業で行う迷い(判断)」と「単純作業(反復)」をコードに肩代わりさせることにある。フォントの不統一という不毛なトラブルをこのスクリプトで完全に根絶し、よりクリエイティブな設計業務へリソースをシフトしてほしい。
