こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺める日々から、「そろそろ本格的なAPIを使いこなして、設計業務を圧倒的に効率化したい!」と一歩踏み出したあなたへ。
今回は、設計現場で長年運用されたモデルにつきものの「あの問題」を鮮やかに解決する、ちょっとディープで最高に実用的なテーマをお届けします。
テーマはずばり、【カスタムプロパティの高度なメタデータ管理】CustomPropertyManager.GetNamesとDelete2によるクレンジング自動化 です。
「何それ難しそう…」と思いましたか?大丈夫。優しく、そして本質的な部分までしっかりと噛み砕いて解説していきますね。ここをクリアすれば、あなたのSolidWorks VBAスキルは確実に中級者から「エンジニアの領域」へとステップアップしますよ!
—
1. なぜカスタムプロパティの「クレンジング」が必要なのか?
皆さんは、こんなモヤモヤを抱えたことがありませんか?
- 「過去の設計者ごとにプロパティの命名規則がバラバラ(`材質`だったり`Material`だったり`マト`だったり…)」
- 「設計変更を繰り返すうちに、使われなくなった『幽霊プロパティ』が何個も残っている」
- 「PDMや外部システム連携の際、不要なゴミデータのせいでエラーが起きる」
これらは、図面や3Dモデルのメタデータ(属性情報)が「汚染」されている状態です。手作業で1つずつプロパティタブを開いて削除するのは、エンジニアの貴重な時間を奪う苦行でしかありません。
これをSolidWorks VBAで一瞬にして自動スキャンし、不要なものを駆逐し、美しく整える。それが今回のゴールです。
—
2. SolidWorks APIの心臓部:オブジェクトモデルの階層を理解する
プログラミングに入る前に、SolidWorksが内部でデータをどう持っているか、その「地図」を確認しておきましょう。ここを理解すると、APIリファレンスが怖くなくなります。
[SldWorks (アプリケーション)]
└─ [ModelDoc2 (現在開いている図面・部品・アセンブリ)]
├─ [Configuration (コンフィギュレーション) ※設定別プロパティの場合]
└─ [CustomPropertyManager (プロパティ管理の専門家オブジェクト)]
├─ GetNames (プロパティ名のリストを取得)
├─ Get (値を取得)
└─ Delete2 (プロパティを消去)
ポイントは、「CustomPropertyManager」という専用のマネージャーオブジェクトです。
プロパティをいじりたいときは、常に「今開いているドキュメント(ModelDoc2)」からこのマネージャーを召喚して作業することになります。
—
3. 実装コード:ゴミを一掃し、命名規則を整えるガバナンス・マクロ
それでは、実際の現場で即戦力として使えるVBAコードを公開します。
このコードは、アクティブなドキュメントのカスタムプロパティを取得し、
1. 指定した不要なプロパティの完全削除
2. 定義されたブラックリスト(ゴミ)の自動削除
を行います。
Option Explicit
Sub CleanUpCustomProperties()
‘ 1. オブジェクト変数の宣言
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれていない場合は処理を中断
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
‘ 2. カスタムプロパティマネージャーの取得
‘ ※今回は「アクティブなコンフィギュレーション」のプロパティを対象にします
Dim activeConfigName As String
activeConfigName = swModel.GetActiveConfiguration.Name
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(activeConfigName)
‘ 3. 登録されているすべてのプロパティ名(配列)を取得
Dim propNames As Variant
propNames = swCustPropMgr.GetNames
‘ プロパティが一つもない場合は終了
If IsEmpty(propNames) Then
MsgBox “カスタムプロパティは存在しません。”, vbInformation, “通知”
Exit Sub
End If
‘ 4. 削除したい「不要なプロパティ名」のリスト(ブラックリスト)を定義
‘ ここをご自身の現場の環境に合わせて書き換えてください
Dim blackList As Variant
blackList = Array(“Old_Material”, “Temp_Memo”, “DrawnBy_Old”, “UnusedTag”)
Dim i As Long
Dim j As Long
Dim propName As String
Dim isDeleted As Boolean
Dim deleteCount As Long
deleteCount = 0
‘ 5. ループを回して全プロパティをチェック&クレンジング
For i = LBound(propNames) To UBound(propNames)
propName = propNames(i)
isDeleted = False
‘ ブラックリストに含まれているかチェック
For j = LBound(blackList) To UBound(blackList)
If StrComp(propName, blackList(j), vbTextCompare) = 0 Then
‘ Delete2メソッドでプロパティを削除(引数はコンフィギュレーション名)
swCustPropMgr.Delete2 (propName)
deleteCount = deleteCount + 1
isDeleted = True
Debug.Print “削除成功: ” & propName
Exit For
End If
Next j
‘ (応用)もし特定のプレフィックス(例: “Tmp_”で始まるもの)を全て消したい場合はここで判定可能
If Not isDeleted Then
If Left(propName, 4) = “Tmp_” Then
swCustPropMgr.Delete2 (propName)
deleteCount = deleteCount + 1
Debug.Print “プレフィックス一致により削除: ” & propName
End If
End If
Next i
‘ 6. 完了メッセージ
MsgBox “クレンジングが完了しました。” & vbCrLf & _
“削除された不要プロパティ数: ” & deleteCount & “件”, vbInformation, “処理完了”
End Sub
—
4. コードの重要ポイントと「初心者がハマりやすい罠」
ここで、今回のコードのキモとなる部分と、実務で絶対に知っておくべき注意点を解説します。
① `GetNames` が返すのは「配列(Variant)」
APIの仕様上、`CustomPropertyManager.GetNames` は文字列の配列をVariant型として返します。
そのため、配列に何も入っていない(プロパティがゼロ個)のときにそのままループを回すと、「インダックスが有効範囲にありません(Error 9)」というVBA定番の呪い(エラー)に引っかかります。
コード内の `If IsEmpty(propNames) Then` によるガード処理は、実務コードでは必須のテクニックです。
② `Delete2` の正しい挙動を知る
プロパティを消去するメソッドは `Delete2` です(古い `Delete` メソッドは現在非推奨です)。
ここで注意なのが、アクティブドキュメントの「ユーザー定義タブ(Document Level)」か「コンフィギュレーション特有タブ」かによって、マネージャーの取得元を変える必要がある点です。
今回は `swModel.Extension.CustomPropertyManager(“”)` (空文字)を使えばファイル固有、コンフィギュレーション名を指定すればコンフィギュレーション固有のプロパティを操作できます。この使い分けをマスターすれば完璧です。
—
5. まとめと次のステップ
今回は、`CustomPropertyManager.GetNames` と `Delete2` を駆使した、カスタムプロパティのクレンジング自動化について解説しました。
ここをクリアしたあなたなら、単なる「マクロの記録の貼り付け」ではなく、「データを自ら検査し、ロジックで制御する」というエンジニアとしての強力な武器を手に入れたことになります。
さらに応用を進めれば、
- フォルダ内の何百個もの部品ファイル(`.sldprt`)を自動で巡回し、バッチ処理でクレンジングを行う(ファイルを開かずにプロパティを書き換える `InDom` / `Specification` 系のテクニック)
- 必須プロパティ(`材質`、`図番`など)が欠落している場合に自動でアラートを出す設計チェッカーへの昇華
といった、さらなる高みへ進むことができます。
日々のルーティンワークをプログラムに任せ、私たち人間は「よりクリエイティブな設計」に集中しましょう。それでは、次回のSolidWorks VBA極限講座でお会いしましょう!
