【実務・中級編】【上級】AcadApplication.Preferences.Filesを操作し、社内標準のサポートパスを自動追加・同期 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見:サポートパス自動同期術

こんにちは。AutoCADのカスタマイズや大規模な業務自動化を統括しているチーフアーキテクトの私だ。

読者諸君は、新しいPCへの移行時や、複数拠点間でのデータ共有の際、こんな絶望的なエラーに直面したことはないだろうか?

  • 「指定されたフォント(SHX)が見つかりません。代替フォントで置換します」
  • 「カスタム線種(LIN)がロードできず、図面が崩れています」
  • 「社内標準のブロックライブラリやダイナミックブロックへのパスが通っていません」

原因は明白だ。AutoCADの「サポートファイルの検索パス」が、ローカル環境のままで放置されている。これを手動でオプション画面からポチポチ追加・修正しているとしたら……今すぐその作業をやめてほしい。エンジニアの労働時間をドブに捨てるようなものだ。

今回は、`AcadApplication.Preferences.Files` を完全掌握し、起動時や図面オープン時に社内標準のサポートパスを一瞬で自動追加・同期する堅牢なプロダクションコードを伝授する。

なぜ「愚直な文字列操作」では破綻するのか?

多くの初学者は、サポートパスの操作と聞くと、現在のパス文字列を取得し、それに新しいパスをセミコロン(`;`)で連結して書き戻すというコードを書く。

‘ 【アンチパターン】絶対にやってはいけない実装例
Dim currPaths As String
currPaths = ThisDrawing.Application.Preferences.Files.SupportPath
‘ 末尾に無理やり追加(重複チェックなし、セミコロンの抜け漏れリスク)
ThisDrawing.Application.Preferences.Files.SupportPath = currPaths & “;C:\CAD_Standard\Fonts”

このアプローチは技術的負債の塊だ。
1. 重複登録の嵐: マクロを実行するたびに同じパスが無限に増殖し、最終的に文字数制限に引っかかってAutoCADがクラッシュする。
2. 順序の崩壊: 社内標準パスの優先順位(検索順)がバラバラになり、古いフォントが優先されて図面が化ける。
3. ネットワーク切断時のタイムアウト: 存在しない社内共有サーバー(UNCパス)を無理やり登録すると、AutoCADの起動やドキュメントオープン時にフリーズする。

プロのエンジニアであれば、「べき等性(何度実行しても結果が同じになり、安全であること)」「実존確認(パスの物理的な存在チェック)」を担保したアーキテクチャを組まなければならない。

堅牢なサポートパス同期エンジンの設計思想

今回構築するモジュールの要件は以下の通りだ。

1. 配列ベースの処理: 文字列のセミコロン分割・結合をスマートに行うため、VBAの `Split` / `Join` 関数を用いて配列としてメモリ上でハンドリングする。
2. 重複排除(Unique): すでに登録されているパスはスキップする。
3. 優先順位の制御: 社内標準パスは、ユーザー固有のパスよりも上位(配列の先頭付近)に差し込む。
4. 存在確認(FileSystemObject): ネットワークドライブのオフライン時を想定し、フォルダが存在するものだけを登録対象とする。

【実装コード】プロダクション品質のVBAモジュール

以下のコードを、AutoCADのVBAIDE(`Alt + F11`)の標準モジュールにそのまま貼り付けてほしい。実務でそのまま使えるレベルの堅牢性を備えている。

Option Explicit

‘===============================================================================
‘ モジュール名: MdlPathSynchronizer
‘ 概要: AutoCADのサポートファイルの検索パスを社内標準に自動同期する
‘===============================================================================

‘ 社内標準で必ず通すべきパスのリスト(必要に応じて変更・拡張してください)
Private Function GetStandardPaths() As String()
Dim paths(1 To 3) As String

‘ 例: サーバー上の共通リソースやローカルの標準フォルダ
paths(1) = “C:\CompanyCAD\StandardFonts”
paths(2) = “C:\CompanyCAD\Linetypes”
paths(3) = “\\server01\cad_common\Blocks” ‘ UNCパスの例

GetStandardPaths = paths
End Function

Public Sub SyncCompanySupportPaths()
Dim acadPrefFiles As AcadPreferencesFiles
Set acadPrefFiles = ThisDrawing.Application.Preferences.Files

Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

On Error GoTo ErrorHandler

‘ 1. 現在のサポートパスを取得し、配列に展開
Dim rawSupportPath As String
rawSupportPath = acadPrefFiles.SupportPath

Dim currentPaths() As String
currentPaths = Split(rawSupportPath, “;”)

‘ 2. 社内標準パスを取得
Dim stdPaths() As String
stdPaths = GetStandardPaths()

‘ 3. 既存パスから「社内標準パス」をいったんすべて排除(クリーンアップ)
‘ ※これにより、順序の再編成や不要になったパスの動的削除も同時に実現する
Dim cleanedPaths As Collection
Set cleanedPaths = New Collection

Dim i As Long, j As Long
Dim isStdPath As Boolean

For i = LBound(currentPaths) To UBound(currentPaths)
Dim trimmedPath As String
trimmedPath = Trim(currentPaths(i))

If trimmedPath <> “” Then
isStdPath = False
For j = LBound(stdPaths) To UBound(stdPaths)
If StrComp(trimmedPath, stdPaths(j), vbTextCompare) = 0 Then
isStdPath = True
Exit For
End If
Next j

‘ 社内標準以外、または存在し続けるべきユーザー固有パスのみ保持
If Not isStdPath Then
cleanedPaths.Add trimmedPath
End If
End If
Next i

‘ 4. 社内標準パスを【最優先(先頭)】に挿入する
‘ 存在確認(フォルダが存在するか)を行い、ない場合は警告を出してスキップ
Dim finalPaths() As String
ReDim finalPaths(1 To cleanedPaths.Count + UBound(stdPaths))

Dim index As Long
index = 1

‘ まず有効な社内標準パスを先頭に積む
For j = LBound(stdPaths) To UBound(stdPaths)
If fso.FolderExists(stdPaths(j)) Then
finalPaths(index) = stdPaths(j)
index = index + 1
Else
‘ ログ出力の代わりにイミディエイトウィンドウへ通知(必要ならLog出力に変更)
Debug.Print “[警告] 社内標準パスが見つからないためスキップしました: ” & stdPaths(j)
End If
Next j

‘ 残りの既存パスを後ろに連結
For i = 1 To cleanedPaths.Count
finalPaths(index) = cleanedPaths(i)
index = index + 1
Next i

‘ 配列のサイズを有効な要素数に再調整
ReDim Preserve finalPaths(1 To index – 1)

‘ 5. AutoCADのPreferencesに書き戻し
acadPrefFiles.SupportPath = Join(finalPaths, “;”)

MsgBox “社内標準サポートパスの同期が正常に完了しました。”, vbInformation, “AutoCAD環境構築”
Exit Sub

ErrorHandler:
MsgBox “サポートパスの同期中に予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “エラー”
End Sub

チーフアーキテクトが教える実装のポイント

1. FileSystemObjectによる存在チェックの重要性
ネットワーク環境において、存在しないUNCパスがサポートパスに含まれていると、AutoCADがハッチングパターンやフォントを検索しに行くたびに致命的なタイムアウト遅延が発生する。`fso.FolderExists` による事前フィルタリングは、パフォーマンス維持のために絶対に外せない防衛策だ。

2. クリーンアップ&プリアペンド(先頭追加)戦略
コードのステップ3〜4で、既存のパスから社内標準を一度完全に取り除き、常に「最新の正しい順序で先頭に差し込む」というロジックをとっている。これにより、社内標準のフォルダ構成が変更された場合でも、マクロを一度走らせるだけで全PCの環境をクリーンにアップデートできる。

3. イベントトリガーとの連携
この `SyncCompanySupportPaths` サブルーチンを、例えば社内の共通 `acaddoc.lsp` や、VBAの `AcadApplication_Startup` イベント(あるいは社内ニッチメニューから呼び出すボタン)に紐づけておく。これだけで、エンドユーザーが意識することなく、常に最新のCAD環境が強制同期される仕組みが完成する。

結びにかえて

環境構築の自動化は、地味ではあるが、開発現場の生産性を底上げする最も費用対効果の高い投資だ。「人が手動で設定する」というプロセスを排除し、コードによってインフラストラクチャをコード化(Infrastructure as Code)する思想を、ぜひあなたのAutoCAD開発現場にも取り入れてほしい。

妥協のない設計で、強固なCADライフを。

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