こんにちは!AutoCADの自動化設計に日々向き合っている君なら、一度はこんな絶望を味わったことがあるはずだ。
「大量の過去図面をバッチ処理で一括変換しようとマクロを組んだのに、古いSHXフォント(例: `shxfont.shx` 等)が見つからないせいで、『フォント置換』のダイアログボックスが画面の真ん中にポツンと現れ、処理が完全にフリーズした……」
夜間に走らせておいたはずの自動処理が、このダイアログ1つのせいで最初の1ファイル目で完全にストップし、翌朝に絶望的な顔で出社する。……うん、エンジニアなら誰もが通る通過儀礼のようなものさ。
でも安心してほしい。今日、この瞬間からその悩みとはお別れだ。
今回は、AutoCADの裏側でうごめく「フォントマップ(FMP)のメカニズム」をVBAから完全に手なずけ、ダイアログを一切出さずに高速で図面を開き倒す極意を伝授しよう。
ここをクリアすれば、君はもう「マクロの記録」に頼るだけの初級者じゃない。実務の荒波をスマートに泳ぎ切る、本物の自動化エンジニアの仲間入りだ。
—
なぜフォント置換ダイアログでVBAは止まってしまうのか?
まず、敵を知ることから始めよう。
AutoCADは、図面を開くときに「この文字を表示するには、このフォント(SHXやTrueType)が必要だな」と確認する。その際、指定されたフォントファイルがPC内に存在しないと、AutoCADは親切心(余計なお世話)から、次のようなダイアログを画面にポップアップさせる。
> 「おっと、このフォントがないぞ。どのフォントに置き換える?」
しかし、VBA(マクロ)は基本的に「人間の代わりにクリックや文字入力をする」ものだ。画面の裏側でCADのエンジンが「ユーザーのボタン入力を待っています……」とフリーズしている状態(モーダルダイアログの発生)になると、VBAのコードはそこでピタリと実行を停止してしまう。エラーすら吐かずに、ただ沈黙するのだ。
これを防ぐためには、ダイアログを出させないようにする「事前の交通整理」が必要になる。それが今回解説する「フォントマップ(FMPファイル)のプログラム制御」だ。
—
秘伝のレシピ:フォントマップ(.fmp)の仕組み
AutoCADには、「〇〇というフォントが見つからないときは、代わりに××というフォントを使いなさい」という対応表をあらかじめ設定しておく機能がある。それが フォントマップファイル(拡張子: `.fmp`) だ。
通常、このファイルはAutoCADのサポートパス内にテキスト形式(SJIS等)で存在しており、中身はこんなシンプルなルールで書かれている。
; 構文: 無いフォント名 ; 置き換え先のフォント名
shxfont;romans.shx
mitsumori;gothic.shx
つまり、「コード側から、開きたい図面固有の足りないフォント情報を、一時的にこのフォントマップに書き込んでから図面を開けばいい」。これこそが、数千枚の図面を一晩でエラーなく処理するための、ベテランエンジニアが使う隠し技だ。
—
実践!フォント置換を自動回避するVBAコード
それでは、実務でそのままコピペして使える実用コードを公開しよう。
このコードは、指定したフォルダ内のDWGファイルを次々と開き、フォント不足による停止を回避しながら、何かしらの処理(ここでは例として図面保存)を行うプロシージャだ。
Option Explicit
‘ ==============================================================================
‘ 【実務中級者向け】フォントマップを動的制御してダイアログを自動回避するサンプル
‘ ==============================================================================
Sub AutoOpenWithoutFontDialog()
Dim targetFolder As String
Dim targetFile As String
Dim fmpPath As String
Dim fso As Object
Dim fileNum As Integer
‘ 1. 処理対象のフォルダパスを指定(環境に合わせて変更してください)
targetFolder = “C:\AutoCAD_Drawings\”
‘ 2. サポートフォルダからフォントマップファイル(.fmp)のパスを取得
‘ ※通常 “acad.fmp” や “acadiso.fmp” が使われます
fmpPath = ThisDrawing.Application.Preferences.Files.SupportPath
‘ サポートパスの先頭フォルダからacad.fmpのパスを構築
If InStr(fmpPath, “;”) > 0 Then
fmpPath = Left(fmpPath, InStr(fmpPath, “;”) – 1)
End If
fmpPath = fmpPath & “\acad.fmp”
‘ 3. フォントマップに「足りないフォントの救済ルール」を追記する
‘ ここでは「万が一、何指定のフォントがなくても romand.shx に置き換える」というワイルドカード的設定、
‘ もしくは特定の未知フォントを安全な標準フォントにマップします。
On Error Resume Next
fileNum = FreeFile
Open fmpPath For Append As #fileNum
‘ 例: 謎の古いフォント “old_shx” が来たら “romans.shx” に強制置換するルールを追加
Print #fileNum, “old_shx;romans.shx”
Close #fileNum
On Error GoTo 0
‘ 4. フォルダ内のDWGファイルをループ処理
targetFile = Dir(targetFolder & “.dwg”)
Do While targetFile <> “”
‘ 5. ダイアログを完全に抑制するための環境変数設定
‘ FILEDIA: ファイル選択ダイアログの抑制 (0 = 非表示)
‘ CMDECHO: コマンドラインのエコーバック抑制
ThisDrawing.SetVariable “FILEDIA”, 0
ThisDrawing.SetVariable “CMDECHO”, 0
On Error GoTo ErrorHandler
‘ 図面を開く(Documents.Open メソッド)
Dim openDoc As AcadDocument
Set openDoc = Documents.Open(targetFolder & targetFile)
‘ — ここに図面ごとに行いたい処理を記述 —
Debug.Print “正常オープン: ” & targetFile
‘ 例: 簡易的に上書き保存して閉じる場合
‘ openDoc.Save
‘ openDoc.Close
——————————————
GoTo NextFile
ErrorHandler:
‘ 万が一エラーが発生した場合のイミディエイト出力と継続処理
Debug.Print “【エラー発生】ファイル名: ” & targetFile & ” / 理由: ” & Err.Description
Resume Next
NextFile:
‘ 環境変数を元に戻す
ThisDrawing.SetVariable “FILEDIA”, 1
ThisDrawing.SetVariable “CMDECHO”, 1
‘ 次のファイルへ
targetFile = Dir()
Loop
MsgBox “すべての図面処理が完了しました!”, vbInformation, “自動化完了”
End Sub
—
キャンパスの隅で引っかかっていたトゲが綺麗に抜けるような、爽快感のあるコードだろう?
コードの重要ポイント解説
1. `Preferences.Files.SupportPath` からのFMP操作
AutoCADが参照している環境設定から、フォントマップ(`acad.fmp`)の正確な居場所をコードから動的に割り出している。ハードコーディング(直書き)を避けることで、他のPCに持って行ったときでもエラーが起きない頑健な設計にしているのだ。
2. `Open … For Append` によるルールの動的追加
開く直前に「この図面にはあのフォントがないはずだ」という予測に基づき、FMPファイルに置換ルールを一時的に書き足している。これにより、AutoCADは「あ、置き換えルールがあるんだな」と納得し、ダイアログを出さずにシームレスに代替フォントで図面を開いてくれる。
3. 環境変数 `FILEDIA` の活用
VBAで図面を開く際、`FILEDIA` を `0`(オフ)にしておくことは鉄則だ。ダイアログの介入をシステムレベルでシャットアウトすることで、マクロの暴走や予期せぬ停止を防ぐことができる。
—
陥りやすい罠とエンジニアの心得
ここで、現場でありがちな「ハマりポイント」についても触れておこう。
- 罠1:FMPファイルがロックされて書き込めない
ネットワークドライブ上にある共有のFMPなどを書き換えようとすると、権限エラー(書き込み禁止)でVBAが止まることがある。基本的にはローカルのユーザープロファイル下にあるサポートパスを狙うか、エラートップ(`On Error Resume Next`)で安全にスルーする配慮が必要だ。
- 罠2:処理が終わった後のFMPの肥大化
上記のコードは追記(Append)方式をとっているため、何度も実行すると `acad.fmp` に同じ行が何百行も書き込まれてしまう。実務の運用では、処理の最初や最後に「不要になった行を掃除するルーチン」を挟むか、自動化専用のクリーンなFMPファイルを一時的にコピーして差し替える手法(より高度で安全!)をとるのがプロの技と言える。
—
まとめ:AutoCAD VBAの基本は「対話の排除」
今回学んだフォントマップ制御は、単なる「フォントエラーの回避術」にとどまらない。
AutoCAD VBAの本質は、「人間が画面の前でポチポチやっている判断やエラー対応を、いかに事前に先回りしてコードで潰しておくか」という点にある。
「ダイアログを出さない」「例外を予測してあらかじめ環境を整える」。この思想が身につけば、どんなに汚いレガシー図面の山を押し付けられても、君は涼しい顔で一晩で片付けてみせることができるはずだ。
ここをクリアした君なら、もう次のステップへ進む準備は万全だ。
さあ、自分の開発環境に戻って、このコードを試してみてほしい。業務効率化の新しい扉が、音を立てて開くだろう。
