【SolidWorks VBA】カスタムプロパティの自動付与を極める――堅牢なメタデータ管理の設計思想
設計現場で「カスタムプロパティの手入力」を許容することは、技術的負債の第一歩です。PDMとの連携、図面枠の自動更新、さらにはERPへの部品表データ流し込み。これら全てにおいて、カスタムプロパティの整合性はシステム全体の生命線となります。
今回は、単に「書き込む」だけではなく、「どうすればバグを生まず、保守性の高い堅牢なコードを構築できるか」というプロフェッショナルな視点から、`CustomPropertyManager`を完全掌握する実装パターンを伝授します。
—
1. なぜ「単純なAdd3」では不十分なのか
多くの初学者は、`Add3`メソッドを単に呼ぶだけで満足します。しかし、実務では以下の3つの壁に突き当たります。
1. 既にプロパティが存在する場合の戻り値無視: `Add3`は既存のプロパティを上書きしません。無視して進むと、意図しない古いデータが残ります。
2. 設定(Configuration)の罠: プロパティは「全設定共通」なのか「設定固有」なのか。これを明確に制御しないと、アセンブリ上の表示と図面枠の表記が食い違います。
3. データ型の不一致: `Text`以外の型(日付や数値)を扱う際の暗黙の型変換ミス。
これらを解消するには、「存在チェック・削除・再登録」を抽象化したラッパー関数が不可欠です。
—
2. 実務で「負けない」ための実装パターン
以下のコードは、単なるサンプルではありません。大規模な設計自動化ツールでもそのまま採用できる、エラーハンドリングを重視したプロダクションコードです。
Option Explicit
‘ カスタムプロパティを安全に設定するプロシージャ
‘ 戻り値: 成功時はTrue, 失敗時はFalse
Public Function SetCustomProperty( _
ByVal swModel As SldWorks.ModelDoc2, _
ByVal propertyName As String, _
ByVal propertyValue As String, _
Optional ByVal configName As String = “”) As Boolean
On Error GoTo ErrorHandler
Dim swCustPropMgr As SldWorks.CustomPropertyManager
‘ 指定があれば特定の設定、なければ全設定共通(””を指定)のマネージャを取得
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(configName)
‘ 存在確認はせず、一旦削除してから登録する戦略(確実性を優先)
‘ ※Delete2は存在しない場合にエラーを吐くため、あえて無視して登録を試みる
swCustPropMgr.Delete2 propertyName
‘ Add3: 第4引数に値、第5引数に型(swCustomInfoText=30)を指定
Dim result As Long
result = swCustPropMgr.Add3(propertyName, 30, propertyValue, 1)
If result = 0 Then ‘ 0は成功を意味する
SetCustomProperty = True
Else
Debug.Print “Error: Failed to set ” & propertyName & ” (Code: ” & result & “)”
SetCustomProperty = False
End If
Exit Function
ErrorHandler:
Debug.Print “Critical Error: ” & Err.Description
SetCustomProperty = False
End Function
この設計のポイント
- 抽象化: `Add3`の引数を意識せず、プロパティ名と値だけを渡せば良い設計にしています。
- 戦略的削除: `Delete2`を先行させることで、設定変更時の「ゴミデータ」を排除します。
- 型指定の固定: `30`(`swCustomInfoText`)を明示することで、予期せぬ日付変換バグを防ぎます。
—
3. 運用における「3つの鉄則」
コードを書くだけが自動化ではありません。以下の運用ルールを併せて適用してください。
① 設定(Configuration)の範囲を定義する
`configName`引数を空文字`””`にすれば全設定共通になりますが、材料名など「構成部品ごとに変えたい」場合は、必ずアクティブな設定名を取得して渡すようにしてください。
Dim configName As String
configName = swModel.ConfigurationManager.ActiveConfiguration.Name
② データベース連携時のクレンジング
外部システム(ExcelやPDM)から取得したデータを書き込む際は、必ず「トリム(両端のスペース削除)」を行ってください。目に見えないスペースが原因で、PDMの検索にヒットしないというトラブルは後を絶ちません。
‘ データを書き込む前に必ずクレンジング
val = Trim(dataFromDB)
③ ユーザーへのフィードバック
バックグラウンド処理は、完了後に必ず「何件更新されたか」をログとして残してください。SolidWorksの`StatusBar`を活用するのも有効です。
swApp.SendMsgToUser “メタデータの更新が完了しました。”
—
4. 最後に:エンジニアの矜持
「VBAは簡単だ」という言葉を信じてはいけません。SolidWorks APIは、そのオブジェクトのライフサイクルを正しく理解していないと、メモリリークや不安定な挙動の原因になります。
今回提示した「削除してから再登録する」というアプローチは、一見すると泥臭いかもしれません。しかし、「データの整合性を100%保証する」というエンジニアとしての責任を果たすためには、最も堅牢な選択肢です。
このコードをあなたのツールに組み込み、手作業によるメタデータ入力という「意味のない工数」を今すぐ撲滅してください。システムは、人がミスを犯すという前提で構築する。それが、真に自動化を極めた者の思考です。
