【テクニカル・上級編】【初心者向け】図面シートプロパティの自動書き換えと図面情報の一括更新VBA – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】図面シートプロパティの自動書き換えと図面情報一括同期のアーキテクチャ

図面枠の表題欄(Title Block)の入力ミスや、3Dモデル側のカスタムプロパティ(材質、質量、承認者など)との同期漏れ。これは、製造業の現場において幾度となく設計変更の手戻りを生み出してきた「静かなる爆弾」である。

手動での入力に依存している限り、ヒューマンエラーを根絶することは不可能だ。特に大規模なアセンブリから派生する数十枚の図面群を一斉に改訂する際、VBAによる自動化は「あれば便利な機能」ではなく、生き残るための「必須インフラストラクチャ」となる。

今回は、SolidWorks APIのオブジェクトモデルの深淵に踏み込み、図面シートプロパティへ安全かつ高速にアクセスし、一括書き換え・同期を行うための実用的なVBAスクリプトと、その裏にあるオブジェクトのライフサイクル管理の極意を解説する。

—

1. 現場で直面する技術的課題とアーキテクチャの要件

SolidWorksの図面(`.slddrw`)を操作する際、多くの初学者は「画面が見えているから動くだろう」という甘い認識のもと、`SldWorks.ModelDoc2` や `SldWorks.DrawingDoc` を安易に呼び出し、メモリリークやCOM例外を引き起こす。

シニアエンジニアが押さえるべき設計要件は以下の3点である。

1. アクティブドキュメントの安全な取得と型安全性の担保
開かれているファイルが本当に図面であるかを拡張子ベースではなく、APIのドキュメントタイプ(`swDocDrawing`)で厳密に判定する。
2. シート(Sheet)とビュー(View)の階層構造の理解
SolidWorksの図面は「シート」の下に「ビュー」があり、さらにその奥に「モデル」が紐付いている。このポインタを手繰り寄せる順序を誤ると、`.GetFirstView` の無限ループやクラッシュを誘発する。
3. カスタムプロパティマネージャー(CustomPropertyManager)の正確なスコープ指定
図面固有のプロパティと、参照している3Dモデル(部品・アセンブリ)のプロパティは別物である。表題欄がどちらを向いているのかを意識して書き込み先を切り替えなければならない。

—

2. 実装コード:図面情報一括同期・プロパティ書き換えエンジン

以下のコードは、現在アクティブな図面ドキュメントを対象に、シートプロパティ(尺度、図面番号など)の強制書き換えと、モデル側のプロパティ値の表題欄への同期をアトミックに行うプロフェッショナル向けスクリプトである。

‘ ==============================================================================
‘ 模块名: ModDrawingPropertySync
‘ 概要: 図面シートプロパティの自動書き換えとモデル情報一括同期エンジン
‘ 著者: チーフアーキテクト
‘ ==============================================================================
Option Explicit

‘ SolidWorks定数の明示的定義(型ライブラリ非依存の安全策)
Const swDocDrawing As Long = 3
Const swPropTypeText As Long = 3

Public Sub ExecuteDrawingPropertySync()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet

‘ 1. アプリケーションインスタンスの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “警告”
Exit Sub
End If

‘ 2. ドキュメントタイプの厳密なバリデーション
If swModel.GetType() <> swDocDrawing Then
MsgBox “このスクリプトは図面(Drawing)ドキュメントでのみ実行可能です。”, vbCritical, “型不一致”
Exit Sub
End If

Set swDraw = swModel

‘ 3. エラーハンドリングの有効化(COMオブジェクトの確実な解放を担保するため)
On Error GoTo ErrorHandler

‘ 画面描画の凍結(パフォーマンス爆速化の基本テクニック)
swModel.Extension.FreezeView = True

‘ 4. 現在アクティブなシートの取得
Set swSheet = swDraw.GetCurrentSheet()
If swSheet Is Nothing Then
Err.Raise 9999, “ExecuteDrawingPropertySync”, “アクティブシートの取得に失敗しました。”
End If

Dim sheetName As String
sheetName = swSheet.GetName()

‘ 5. シートプロパティ(尺度、用紙サイズなど)の取得と操作例
Dim scale1 As Double, scale2 As Double
Call swSheet.GetScale(scale1, scale2)
Debug.Print “現在のシート [” & sheetName & “] 尺度: 1 / ” & (scale2 / scale1)

‘ 例:シートプロパティの強制的再設定(必要に応じて数値を調整)
‘ swSheet.SetScale 1, 2, True ‘ 1:2に設定する場合

‘ 6. カスタムプロパティマネージャーを介した表題欄データの書き換え
‘ 図面ドキュメント自体のカスタムプロパティを操作
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

If Not swCustPropMgr Is Nothing Then
Dim lRet As Long
‘ 例:「DRAWING_DATE」プロパティに本日の日付を強制書き込み
Dim todayStr As String
todayStr = Format(Now, “yyyy/mm/dd”)

lRet = swCustPropMgr.Set2(“DRAWING_DATE”, todayStr)
If lRet <> 1 Then
Debug.Print “警告: DRAWING_DATE の書き込みに失敗しました (戻り値: ” & lRet & “)”
End If
End If

‘ 7. 参照モデル(3D部品/アセンブリ)からの情報抽出と同期ロジック
‘ 図面ビューの階層を辿り、ルートモデルのプロパティを取得する
Call SyncPropertiesFromFirstAssyModel(swDraw, swCustPropMgr)

‘ 8. 変更の伝播と再構築
swModel.ForceRebuild3 False

‘ 完了通知
MsgBox “図面プロパティの同期と書き換えが正常に完了しました。”, vbInformation, “完了”

CleanUp:
‘ 9. 【最重要】オブジェクトポインタの明示的解放によるメモリ最適化
Set swCustPropMgr = Nothing
Set swSheet = Nothing
Set swDraw = Nothing

If Not swModel Is Nothing Then
swModel.Extension.FreezeView = False
End If
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“説明: ” & Err.Description, vbCritical, “例外発生”
Resume CleanUp
End Sub

‘ ——————————————————————————
‘ 補助ルーチン: 最初のビューから参照モデルを取得し、プロパティを同期する
‘ ——————————————————————————
Private Sub SyncPropertiesFromFirstAssyModel(ByRef swDraw As SldWorks.DrawingDoc, ByRef swTargetPropMgr As SldWorks.CustomPropertyManager)
Dim vViews As Variant
vViews = swDraw.GetViews()

If IsEmpty(vViews) Then Exit Sub

‘ vViewsは2次元配列(シート毎のビュー群)
Dim i As Long
Dim swView As SldWorks.View
Dim swModelRef As SldWorks.ModelDoc2

‘ シート0(最初のシート)の最初の有効なビューを探索
Dim viewIndex As Long
For i = LBound(vViews, 2) To UBound(vViews, 2)
Set swView = vViews(0, i) ‘ 最初のシートのビュー配列
If Not swView Is Nothing Then
‘ ほうきマーク(ルートモデル)を取得
Set swModelRef = swView.ReferencedDocument
If Not swModelRef Is Nothing Then
‘ モデル側のカスタムプロパティマネージャーを取得
Dim swModelPropMgr As SldWorks.CustomPropertyManager
Set swModelPropMgr = swModelRef.Extension.CustomPropertyManager(“”)

If Not swModelPropMgr Is Nothing Then
Dim valOut As String
Dim resolvedValOut As String
Dim wasResolved As Boolean

‘ 例: モデル側の「PART_NAME」を読み取り、図面の「DESCRIPTION」に転記する
swModelPropMgr.Get4 “PART_NAME”, False, valOut, resolvedValOut, wasResolved
If wasResolved And Len(resolvedValOut) > 0 Then
swTargetPropMgr.Set2 “DESCRIPTION”, resolvedValOut
Debug.Print “モデルからプロパティを同期しました: ” & resolvedValOut
End If
End If
Exit For ‘ 最初に見つかったモデルで処理を抜ける
End If
End If
Next i
End Sub

—

3. チーフアーキテクトが解説するコードの急所

上記のコードが一般的なネット上のサンプルと一線を画す、プロフェッショナルな設計思想をいくつか解説する。

画面描画の凍結 (`swModel.Extension.FreezeView = True`)

大規模なアセンブリ図面やマルチシート図面に対してプロパティを一括操作する際、SolidWorksはバックグラウンドでビューの再描画(グラフィックスの更新)を走らせようとする。これが実行時間の9割を無駄に消費する原因となる。処理の冒頭で描画をフリーズさせ、最後に解除することで、処理速度を最大で10倍以上向上させることが可能である。

COMオブジェクトの徹底的な解放 (`Set xxx = Nothing`)

VBAのランタイムはガベージコレクション(GC)を持たない。特にSolidWorks VBAでは、APIから返されるCOMオブジェクト(`CustomPropertyManager`, `View`, `Sheet` など)の参照を明示的に `Nothing` に代入して解放しないと、ExcelやSolidWorksのプロセス内にメモリリークが蓄積し、やがて「Automation Error」や突然のクラッシュを引き起こす。
エラーハンドラー (`On Error GoTo ErrorHandler`) を必ず経由させ、`CleanUp` ラベルで全変数を確実に破棄する構造が、実務レベルのコードでは絶対条件となる。

バリアント配列 `GetViews()` の安全な走査

SolidWorks APIの `DrawingDoc.GetViews()` は2次元配列を返すため、インデックスの境界値(`LBound`, `UBound`)を誤ると簡単にインデックスエラーが発生する。この配列構造を正しく理解し、シートごとのビューの参照関係を安全に手繰ることで、マルチシート図面であっても破綻しない堅牢性を実現している。

—

4. まとめとさらなる自動化への展望

本稿で解説した図面シートプロパティの自動書き換えとモデル情報の同期ロジックは、社内PDMシステムやPLMシステム、あるいはExcelマスタからのデータ一括流し込み(BOM連携)のコアエンジンとしてそのまま転用できる。

手作業による設計の不整合や、表題欄のミスによる下流工程(製造・調停)でのトラブルを完全に断ち切るために、この堅牢なアーキテクチャをあなたの開発環境に組み込んでほしい。妥協のないコードだけが、エンジニアの時間を真にクリエイティブな領域へと解放する。

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