【実務・中級編】【カスタムプロパティの高度なメタデータ管理】CustomPropertyManager.GetNamesとDelete2によるクレンジング自動化 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見
第1回:カスタムプロパティの高度なメタデータ管理 — ゴミデータ一掃クレンジング自動化の極意

こんにちは。開発プロジェクトの現場で数々のCAD自動化アーキテクチャを構築してきたチーフアーキテクトの私だ。

長年運用されているSolidWorksのPDM環境や共有サーバーを見てみてほしい。設計変更の歴史、担当者の交代、適当にコピペされた過去図面……。それらの負債がどこに蓄積しているか分かるか?
答えは「カスタムプロパティのメタデータ」だ。

使われていない古いタグ、スペルミスのあるプロパティ名、空っぽのまま放置されたゴミデータ。これらが図面枠の自動連係をバグらせ、PDMの検索性を著しく低下させ、下流工程へのデータ引き渡しで致命的なエラーを引き起こす。

今回は、`CustomPropertyManager` の真髄である `GetNames` と `Delete2` を完全に手なづけ、「一瞬で不要なゴミを刈り取り、組織の命名規則を強制統一するデータガバナンス自動化マクロ」の全貌を授けよう。

1. なぜ「手作業のプロパティ整理」は破綻するのか?

設計者に「プロパティの整理整頓をしてくれ」と頼むのは、砂漠で針を探させるようなものだ。
さらに、人間が手動でプロパティを削除・修正しようとすると、以下の悪夢が発生する。

  • 設定(Configuration)固有とアクティブ(CustomPropertyManager)の混同

コンフィギュレーションごとに散らばったプロパティを取りこぼす。

  • 大文字・小文字の揺れ

`Material` と `MATERIAL` と `material` が共存し、PDMの自動採番やERP連携がクラッシュする。

  • 削除APIのトラップ

間違ったAPIメソッドを叩き、SolidWorksごと沈没する(COMオブジェクトの解放漏れ)。

これを防ぐ唯一の解が、APIによる完全自動クレンジングである。

2. APIアーキテクチャの核心:`CustomPropertyManager` の裏側

SolidWorksのカスタムプロパティを操作する場合、ルートオブジェクトである `ModelDoc2` からアプローチするだけでは不十分だ。

1. アクティブドキュメント自体のプロパティ
2. コンフィギュレーション(Configuration)ごとのプロパティ
3. 拡張子(Part/Assembly/Drawing)による構造の違い

これらを網羅的に走査し、かつ「消して良いもの(ホワイトリスト/ブラックリスト)」を判定するロジックが必要となる。
ここで鍵となるのが、`CustomPropertyManager.GetNames` が返す Variant(配列) のハンドリングだ。プロパティが1つも存在しない場合、このメソッドは `Empty` を返す。ここを見落として型ミスマッチ(エラー 13)を起こす初学者が後を絶たない。プロフェッショナルなら、当然このガード句を美しく実装するはずだ。

3. 【プロダクションコード】一括クレンジング&ガバナンス強制マクロ

以下のコードは、実務の現場でそのまま稼働できる堅牢性を持たせたVBAモジュールだ。
アクティブなモデル(部品・アセンブリ)に対し、「許可されたプロパティ名以外をすべて削除」し、さらに「キー名の正規化(大文字統一など)」を自動で行う。

Option Explicit

‘ ==============================================================================
‘ 業務自動化アーキテクチャ ―― カスタムプロパティ・ガバナンス自動化スクリプト
‘ ターゲット: SldWorks 2021以降推奨
‘ ==============================================================================

Sub Main_PropertyGovernanceCleanse()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim 処理件数 As Long

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

‘ 1. ドキュメントのオープンチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “ガバナンスエラー”
Exit Sub
End If

‘ 実行確認
If vbYes <> MsgBox(“この操作は、定義済みホワイトリスト以外のカスタムプロパティを完全削除します。” & vbCrLf & _
“続行しますか?”, vbYesNo + vbExclamation, “プロパティ・クレンジング実行”) Then
Exit Sub
End If

On Error GoTo ErrorHandler

‘ 2. カスタムプロパティのクレンジング実行(ファイル標準 & コンフィギュレーション別)
处理件数 = 0

‘ 2-1. ユーザー定義プロパティ(ファイルレベル)の処理
Call CleanseCustomProperties(swModel, “”, 処理件数)

‘ 2-2. コンフィギュレーション固有プロパティの処理
Dim vConfigNames As Variant
Dim i As Long
vConfigNames = swModel.GetConfigurationNames()

If Not IsEmpty(vConfigNames) Then
For i = LBound(vConfigNames) To UBound(vConfigNames)
Call CleanseCustomProperties(swModel, CStr(vConfigNames(i)), 処理件数)
Next i
End If

‘ 3. 変更を強制反映・リビルド
swModel.EditRebuild3

MsgBox “クレンジングが完了しました。” & vbCrLf & _
“削除・整理された項目数: ” & 処理件数 & ” 件”, vbInformation, “完了”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

‘ ==============================================================================
‘ 内部プロシージャ: 指定スコープ(ファイル or コンフィグ)のプロパティを精査
‘ ==============================================================================
Private Sub CleanseCustomProperties(ByRef swModel As SldWorks.ModelDoc2, ByVal configName As String, ByRef totalCleaned As Long)
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim vPropNames As Variant
Dim i As Long
Dim propName As String
Dim valOut As String
Dim resolvedOut As String
Dim evalWasCopied As Boolean
Dim linkVal As Long

‘ スコープに応じたCustomPropertyManagerの取得
If configName = “” Then
‘ ファイルレベル(カスタムプロパティ)
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)
Else
‘ コンフィギュレーション固有プロパティ
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(configName)
End If

If swCustPropMgr Is Nothing Then Exit Sub

‘ プロパティ名の一覧を取得(※存在しない場合 Empty が返るため注意)
vPropNames = swCustPropMgr.GetNames
If IsEmpty(vPropNames) Then Exit Sub

‘ ホワイトリスト(会社で許可する正式なプロパティ名)の定義
‘ ※実際の運用では外部CSVや設定シートから読み込むように拡張せよ
Dim whiteList As Variant
whiteList = Array(“MATERIAL”, “FINISH”, “AUTHOR”, “DESCRIPTION”, “PART_NO”, “VENDOR”)

For i = LBound(vPropNames) To UBound(vPropNames)
propName = CStr(vPropNames(i))

‘ 判定ロジック: ホワイトリストに含まれているか?(大文字小文字を区別しない比較)
If Not IsInArray(UCase(propName), whiteList) Then
‘ — ゴミデータ・非推奨プロパティの削除実行 —
swCustPropMgr.Delete2 propName
totalCleaned = totalCleaned + 1
Else
‘ — 命名規則の強制統一(例: 大文字への自動変換) —
If propName <> UCase(propName) Then
‘ 値を退避
swCustPropMgr.Get4 propName, False, valOut, resolvedOut, evalWasCopied, linkVal
‘ 旧プロパティを削除
swCustPropMgr.Delete2 propName
‘ 大文字のキーで再登録
swCustPropMgr.Add3 UCase(propName), swCustomInfoText, resolvedOut, swCustomPropertyAddOptionReplace
totalCleaned = totalCleaned + 1
End If
End If
Next i
End Sub

‘ ==============================================================================
‘ ユーティリティ: 配列内に特定の値が含まれているか判定
‘ ==============================================================================
Private Function IsInArray(ByVal stringToFind As String, ByRef arr As Variant) As Boolean
Dim i As Long
For i = LBound(arr) To UBound(arr)
If arr(i) = stringToFind Then
IsInArray = True
Exit Function
End If
Next i
IsInArray = False
End Function

4. チーフアーキテクトが教える実装の急所と注意点

上記のコードを単なる「動くサンプル」で終わらせず、エンタープライズレベルの堅牢なツールに昇華させるための重要知見を授ける。

① `GetNames` の戻り値の罠

先ほども触れたが、プロパティが0個のとき、`GetNames` は `Empty` を返す。これに対し `UBound` を直接叩くと、VBAは容赦なく「インデックスが有効範囲にありません」というエラーを吐く。
コード内にある通り、必ず `IsEmpty(vPropNames)` によるガードを入れること。これがバグを生み出さないプロの作法だ。

② `Delete2` と `Add3` のアトミック性(不可分性)

今回のコードでは、大文字・小文字の揺れを矯正するために「一度削除して、値を取り出して、大文字で再追加する」という荒業を行っている。
SolidWorks APIにはプロパティ名の「リネーム」専用メソッドが存在しないため、この手順を踏む必要がある。この一連の処理の途中で予期せぬエラー(ファイルの強制終了など)が起きないよう、エラーハンドリングとトランザクション的な意識を持つことが不可欠だ。

③ 大規模アセンブリへの適用時のパフォーマンス

アセンブリ(`.sldasm`)に対してこのマクロを走らせる場合、構成部品(子パーツ)のプロパティまで一括で書き換えたい誘惑に駆られるだろう。
だが、待ってほしい。
トップアセンブリから子部品の `CustomPropertyManager` を深追いして書き換えると、意図しないコンポーネントの強制チェックアウトや、メモリリーク、処理の極端な低速化を招く。
子部品のクレンジングを行いたい場合は、トップダウンではなく、「ファイルウォーカー(FileSystemObject等)を用いて、個別パーツファイルをサイレントオープン(`OpenDoc6` の非表示オプション)してバッチ処理する」アーキテクチャを採用すべきだ。これ鉄則。

5. 次なるステップ:データベース連携への布石

今回のコードではホワイトリストをソースコード内にハードコーディングしたが、実際の現場では、これらをExcelマスタ外部データベース(SQL Serverなど)から動的に読み込ませるべきだ。
「どの設計部門が、どのプロパティを必須としているか」のメタデータを集中管理すること。それこそが、真のCADデータガバナンスの姿である。

ゴミのない美しいデータは、設計者の思考をクリアにし、自動図面化やERP連携の成功率を100%へと近づける。
君たちのプロジェクトでも、今すぐこのクレンジング自動化を導入し、負の遺産を断ち切ってほしい健闘を祈る。

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