【SolidWorks VBA極限解説】図面シートプロパティの自動書き換えと一括同期の全技術
図面管理において最も不毛で、かつヒューマンエラーが発生しやすい作業は何か?
それは「図面枠(表題欄)のテキスト手動書き換え」と「モデルプロパティとの同期漏れ」だ。
「図面番号を変えたのに、表題欄のテキストが古いままだった」
「尺度や投影法が設計変更時に更新されておらず、製造現場と大トラブルになった」
もし君が、このような手作業の修正に毎日の貴重な時間を溶かしているなら、今すぐそのマウスを置きたまえ。
今回は、SolidWorks VBAのAPIを叩き、図面シートプロパティへ安全かつ劇的にアクセスし、表題欄の情報を一括で自動同期・書き換える「プロダクション品質」のコードを伝授する。
単なる入門記事のコードではない。現場の泥臭い例外やAPIのクセを知り尽くしたアーキテクトが設計した、「絶対に落とさない堅牢なコード」をその目に焼き付けてほしい。
—
1. なぜ初心者は「図面プロパティの書き換え」で爆死するのか?
多くのVBA初心者が最初に犯す致命的なミス、それは「図面ビュー(DrawingView)やシート(Sheet)のオブジェクト階層構造を無視して、画面上の文字(Note)を直接無理やり書き換えようとすること」だ。
SolidWorksの図面データ構造は、以下のような厳密な階層を持っている。
SldWorks.ModelDoc2 (図面ドキュメント)
┣ SldWorks.DrawingDoc (図面特有の操作)
┗ SldWorks.Sheet (シート:複数存在しうる)
┣ SldWorks.View (図面ビュー:モデルへの参照を持つ)
┗ CustomProperties (カスタムプロパティ:表題欄と連動)
これを無視して、図面上の「文字(Note)」の文字列を直接書き換えるようなアプローチをとると、次のような地獄を見る。
- 3Dモデルのプロパティ(質量や材料など)を変更した瞬間、手動で書き換えた文字が上書きされて消える。
- シートを複数持つマルチシート図面で、アクティブでないシートのデータが更新されない。
- 図面テンプレートの変更に耐えられず、リンク切れを起こす。
プロが取るべき正しいアプローチ
表題欄の制御において、文字を直接叩くのは「最終手段(またはエスケープルート)」でしかない。
本質的なアプローチは、「図面ドキュメント(またはモデル)が持つカスタムプロパティをAPI経由で正確に書き換え、シートのプロパティを最新の状態に強制同期させること」である。
—
2. 堅牢な一括更新VBAコード(プロダクション版)
以下のコードは、現在開いている図面のアクティブシートからカスタムプロパティ(図面番号、承認者、尺度など)を一括書き換えし、表題欄を自動更新させるための完全なスクリプトだ。
余計なエラーハンドリングの抜けを排除し、実務でそのまま組み込めるよう設計している。
Option Explicit
‘ ==============================================================================
‘ 処理名: 図面シートプロパティの一括書き換えと表題欄同期マクロ
‘ 概要 : 図面のカスタムプロパティを安全に更新し、ビューとシートを再描画する
‘ 著者 : チーフアーキテクト
‘ ==============================================================================
Sub UpdateDrawingTitleBlock_Production()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim custPropMgr As SldWorks.CustomPropertyManager
Dim status As Long
Dim sheetName As String
‘ 1. アプリケーションおよびアクティブドキュメントの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “図面ファイルが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
‘ 2. アクティブドキュメントが「図面」であるかの厳密な型チェック
If swModel.GetType() <> swDocDRAWING Then
MsgBox “このマクロは図面ファイルでのみ実行可能です。”, vbCritical, “型エラー”
Exit Sub
End If
Set swDraw = swModel
‘ 3. アクティブシートの取得
Set swSheet = swDraw.GetCurrentSheet
sheetName = swSheet.GetName()
‘ 4. トランザクション処理の開始(パフォーマンスとundoの保証)
swModel.Extension.SetCommandLock swCommands_Lock
On Error GoTo ErrorHandler
‘ 5. カスタムプロパティマネージャーの取得
‘ ※引数に空文字を指定することで、図面ドキュメント全体のカスタムプロパティにアクセス
Set custPropMgr = swModel.Extension.CustomPropertyManager(“”)
‘ ==========================================================================
‘ 【重要】プロパティの一括書き換え(存在しない場合は自動追加される)
‘ 引数: (Name, LinkToProperty(bool), Value, Type)
‘ ==========================================================================
Dim propName As String
Dim propValue As String
‘ 図面番号の更新
propName = “DRAWING_NO”
propValue = “DWG-202X-001”
status = custPropMgr.Set2(propName, propValue)
‘ 承認者の更新
propName = “APPROVED_BY”
propValue = “CHIEF ARCHITECT”
status = custPropMgr.Set2(propName, propValue)
‘ 尺度の取得と設定(シートプロパティから動的に取得する場合の例)
Dim sheetProps As Variant
sheetProps = swSheet.GetProperties()
‘ sheetProps(2) = 尺度の分子, sheetProps(3) = 分母 (環境により異なるため注意)
‘ 6. 変更の反映と図面の強制リビルド(ここが肝心)
‘ 図面全体のリフレッシュとシートフォーマットの再評価
swModel.ForceRebuild3 False
swDraw.EditRebuild
‘ 7. ビューの強制更新
swModel.WindowRedraw
‘ 正常終了
swModel.Extension.ReleaseCommandLock swCommands_Lock
MsgBox “図面シートプロパティの更新と表題欄の同期が完了しました。”, vbInformation, “成功”
Exit Sub
ErrorHandler:
‘ 異常終了時のクリーンアップ
swModel.Extension.ReleaseCommandLock swCommands_Lock
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
3. コードのキモ:プロが解説する設計思想
上記のコードが「なぜ現場でバグらないのか」、その理由をアーキテクトの視点から3つに分解して解説する。
① 厳密な型チェック (`swModel.GetType()`)
VBA初心者は `ActiveDoc` を取得したあと、そのままプロパティを操作しようとする。しかし、ユーザーが間違えて「部品(Part)」や「アセンブリ(Assembly)」を開いている状態でマクロを実行すれば、型ミスマッチでVBAはクラッシュする。
`swDocDRAWING` による明示的なガードを入れることが、ツールを「壊れないインフラ」にする第一歩だ。
② コマンドロックとパフォーマンス (`SetCommandLock`)
APIで一括処理を行う際、裏でSolidWorksのグラフィックエンジンやフィーチャーマネージャーが再描画を繰り返すと、処理速度が何倍にも低下し、最悪の場合はハングアップする。
`SetCommandLock` をかけることで、余計なGUIの割り込みを防ぎ、CPUパワーをプロパティ書き換えだけに集中させることができる。
③ 確実なリビルド (`ForceRebuild3` と `EditRebuild`)
プロパティの値を書き換えただけでは、画面上の表題欄(テキスト)は即座に更新されないケースがある。特に、テキストノートに `$PRP:”DRAWING_NO”` のようにリンクが貼られている場合、ドキュメントの再評価(Rebuild)を明示的に走らせる必要がある。
コード内の `swModel.ForceRebuild3 False` は、アセンブリや図面のすべてのコンポーネントに強制再計算を命じる強力なAPIだ。
—
4. 実務への展開:外部データベースやCSVとの連携
このスクリプトをベースにすれば、次のような高度な自動化システムへ簡単に拡張できる。
- PDS/PLM連携: 外部の生産管理システム(DB)からSQLで図面番号や改訂履歴を取得し、VBA経由でSolidWorks図面へ自動流し込み。
- 一括処理(バッチ化): フォルダ内の数千枚の図面ファイルを `FileSystemObject` で順次開き、このコードをサイレント実行して一斉にプロパティを更新・上書き保存する巡回スクリプトの作成。
—
5. 結びにかえて
「動けばいいや」で作られたVBAは、SolidWorksのバージョンアップや、テンプレートのわずかな構造変化で簡単にゴミと化す。
しかし、オブジェクトのライフサイクルを理解し、適切なAPIの組み合わせで構築されたマクロは、あなたの会社の開発プロセスを何倍も加速させる「最強の武器」となる。
今回のコードをベースに、君の現場のワークフローを極限まで自動化してほしい。妥協なきエンジニアリングの健闘を祈る。
