【実務・中級編】【カスタムプロパティ操作】CustomPropertyManager.Add3を使った承認者・図番・材料名のメタデータ自動付与 – SolidWorks VBA解析バイブル

スポンサーリンク

【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%保証する」というエンジニアとしての責任を果たすためには、最も堅牢な選択肢です。

このコードをあなたのツールに組み込み、手作業によるメタデータ入力という「意味のない工数」を今すぐ撲滅してください。システムは、人がミスを犯すという前提で構築する。それが、真に自動化を極めた者の思考です。

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