こんにちは!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の基本で迷うことはありません。ぜひ、ご自身の設計環境やマクロに取り入れて、圧倒的な業務効率化を体感してくださいね!
