【入門編】【カスタムプロパティ操作】CustomPropertyManager.GetNamesとEnumCustomPropertiesを用いたメタデータの完全同期・一括クリーンアップ – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
日々、設計業務で大量のパーツモデルを扱う中で、「過去の遺産であるレガシーパーツのカスタムプロパティ(メタデータ)がバラバラで、PDMや図面枠との連携がうまくいかない…」といった悩みを抱えたことはありませんか?

「材料」や「承認者」といったプロパティが重複していたり、使われていないゴミデータが残っていたりすると、いざ下流工程でデータを活用しようとした時に大事故に繋がります。

今回は、そんなレガシーパーツのメタデータを完全同期し、社内標準の最新スキーマへ一括クリーンアップするための実践的コードを、世界最高峰の視点から優しく、そして深く解説していきます。

ここをクリアすれば、あなたも単なる「マクロの記録者」から「真のSolidWorks自動化エンジニア」への大きな一歩を踏み出せますよ。さあ、一緒に本質を学んでいきましょう!

1. なぜ「カスタムプロパティの同期」でつまづくのか?

SolidWorksのAPIでカスタムプロパティを操作する際、多くの初学者が陥る罠があります。それは「プロパティが存在するかどうかを推測で処理しようとする」ことです。

パーツによって「材質」という名前だったり「Material」だったり、あるいは大文字・小文字が混ざっていたり…。これらをハードコーディング(決め打ち)で処理しようとすると、存在しないプロパティを叩いてエラー(実行時エラー)を起こしたり、値が上書きされずにゴミが残り続けたりします。

ここで登場するのが、今回の主役である `CustomPropertyManager` オブジェクト、そして `GetNames` メソッドです。

データの裏側を覗き見る:GetNames と EnumCustomProperties

SolidWorksの内部では、各設定(Config)やファイルスコープごとにカスタムプロパティのコンテナが存在しています。

  • `GetNames`:そのコンテナに登録されているすべてのプロパティ名の「配列」を一網打尽に取得するメソッドです。
  • `EnumCustomProperties`:古いバージョンや特殊な環境で使われる列挙用メソッドですが、現代のVBAでは `GetNames` を使う方が圧倒的に安全で高速です。

まずは「今、このパーツに何という名前のプロパティが登録されているのか」を正確にスキャンすること。これが一括クリーンアップの第一歩です。

2. 実践!メタデータ完全同期・一括クリーンアップスクリプト

それでは、開発現場でそのままコピペして使える実用コードを公開します。
このスクリプトは、アクティブなパーツを開いた状態で実行すると、以下の処理を自動で行います。

1. 全プロパティの列挙とスキャン
2. 不要・重複プロパティの完全削除(クリーンアップ)
3. 社内標準スキーマに基づく最新プロパティの強制書き込み(同期)

VBAコード例

Option Explicit

‘ ==============================================================================
‘ 担当エンジニア直伝:レガシーパーツのプロパティ完全同期・クリーンアップマクロ
‘ ==============================================================================
Sub CleanAndSyncCustomProperties()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swCustPropMgr As SldWorks.CustomPropertyManager

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 1. ドキュメントが開かれているか、パーツ/アセンブリかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

Dim docType As Long
docType = swModel.GetType
If docType <> swDocPART And docType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ実行可能です。”, vbExclamation, “対象外”
Exit Sub
End If

‘ 2. カスタムプロパティマネージャーの取得
‘ ※今回はファイル全体のカスタムプロパティ(Configurationなし)を対象とします
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

If swCustPropMgr Is Nothing Then
MsgBox “CustomPropertyManagerを取得できませんでした。”, vbCritical, “エラー”
Exit Sub
End If

‘ 3. 現在登録されているすべてのプロパティ名を取得(GetNamesの真骨頂!)
Dim vPropNames As Variant
vPropNames = swCustPropMgr.GetNames

Dim i As Long

‘ 4. クリーンアップフェーズ:既存のプロパティをすべて削除
‘ (※社内標準に完全準拠させるため、一度まっさらな状態にします)
If Not IsEmpty(vPropNames) Then
For i = LBound(vPropNames) To UBound(vPropNames)
‘ 削除を実行(戻り値で成功・失敗を判定可能)
swCustPropMgr.Delete vPropNames(i)
Next i
End If

‘ 5. 同期フェーズ:社内標準の最新スキーマを書き込む
‘ ここでは例として「社内標準キー」を定義して一括設定します
Call SetStandardProperty(swCustPropMgr, “PartNo”, “100-200-300”, swCustomInfoText)
Call SetStandardProperty(swCustPropMgr, “Material”, “A5052”, swCustomInfoText)
Call SetStandardProperty(swCustPropMgr, “Designer”, “T.Engineer”, swCustomInfoText)
Call SetStandardProperty(swCustPropMgr, “LastUpdated”, Format(Date, “YYYY/MM/DD”), swCustomInfoText)

‘ 6. モデルの再構築と画面更新
swModel.ForceRebuild3 False

MsgBox “カスタムプロパティのクリーンアップと同期が完了しました!”, vbInformation, “完了”

End Sub

‘ ==============================================================================
‘ 補助プロシージャ:安全なプロパティ追加・更新ラッパー
‘ ==============================================================================
Private Sub SetStandardProperty(propMgr As SldWorks.CustomPropertyManager, propName As String, propVal As String, propType As Long)
Dim opResult As Long

‘ Add3メソッドを使用することで、存在しない場合は追加、存在する場合は値とタイプを上書きします
‘ 引数: Add3 (Name, Type, Value, OverWriteOption)
‘ OverWriteOption: 1 = 上書きする
opResult = propMgr.Add3(propName, propType, propVal, 1)

If opResult <> swCustomInfoAddResult_Changed_Value And opResult <> swCustomInfoAddResult_Added Then
Debug.Print “警告: プロパティ ‘” & propName & “‘ の設定に失敗しました。コード: ” & opResult
End If
End Sub

3. コードの核心を読み解く:プロフェッショナルの技術解説

ここからは、なぜこのコードが堅牢(ロバスト)なのか、その背景にあるSolidWorks APIの設計思想を解説します。

① `GetNames` で配列の存在を安全にハンドリングする

VBAで最も怖いエラーの一つが、`Null` や `Empty` の配列をループさせたときに発生する「型が一致しません」エラーです。
`swCustPropMgr.GetNames` は、プロパティが1つも登録されていない場合、有効な配列ではなく `Empty` を返します。そのため、コード内の `If Not IsEmpty(vPropNames) Then` というガード句によって、プロパティがゼロ個のレガシーモデルであってもエラーでクラッシュすることなく、安全にスキップできるようになっています。

② `Add3` メソッドによる「スマート上書き」

プロパティを追加・更新する際、古いAPI(`Add` や `Set`)では「既に存在しているとエラーになる」「値の型が変わると失敗する」といった問題がありました。
現代のSolidWorks APIである `Add3` メソッドを使うと、第4引数に `1`(上書き許可)を指定することで、「あれば更新、なければ新規作成」というアップサート(Upsert)処理をたった1行で安全に行うことができます。これが実務で最もバグを減らすテクニックです。

4. 陥りやすい罠とエンジニアからのアドバイス

罠その1:「ファイルスコープ」と「コンフィギュレーションスコープ」の混同

SolidWorksのプロパティには、「ファイル全体(Custom Property)」と、「コンフィギュレーション別(Configuration-Specific Property)」の2種類が存在します。
今回のサンプルコードはファイル全体(`””`を指定)を対象としています。もし「コンフィギュレーションごとに値が違うパーツ」を扱う場合は、`swModel.Extension.CustomPropertyManager(“Default”)` のように、対象のコンフィギュレーション名を明示的に渡す必要がある点に注意してください。

罠その2:変更後の「保存」と「再構築」のタイミング

プログラムからプロパティを変更しても、SolidWorksの画面上やPDMのインデックスには即時反映されない場合があります。処理の最後に `swModel.ForceRebuild3 False` を挟むことで、モデルの整合性を保ち、確実にメタデータを同期させることができます。

まとめ

今回は、`CustomPropertyManager.GetNames` を用いたメタデータの完全スキャンと、レガシーパーツのクリーンアップ・最新スキーマへの一括同期手法について解説しました。

  • `GetNames` で現在の状態を完全に把握する
  • 一度クリア(削除)するか、`Add3` でスマートに上書きする
  • 配列の `Empty` チェックなど、例外を想定した堅牢なコードを書く

この基本原則さえ押さえれば、どんなに荒れ果てたレガシーデータの山であっても、一瞬で綺麗に整えられた最新の社内標準データへと生まれ変わらせることができます。

ここをクリアしたあなたなら、もうSolidWorks VBAの基本で迷うことはありません。ぜひ、ご自身の設計環境やマクロに取り入れて、圧倒的な業務効率化を体感してくださいね!

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