【入門編】【カスタムプロパティ操作】CustomPropertyManager.GetNamesとGet2を用いた既存メタデータの全走査・一括置換ユーティリティ – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksのAPIの世界へようこそ。
「マクロの記録」ボタンを押して操作を記録するだけのステージは、もう卒業しましたね。おめでとうございます。ここからは、SolidWorksの裏側にある強靭なCOMオブジェクトの息吹を感じながら、自分だけの自動化ツールを組み上げる本当のプログラミングの世界です。

今回は、現場で死ぬほど役に立つ「カスタムプロパティの一括走査・置換クレンジング・スクリプト」を伝授します。

社内システムを移行する時、過去の遺産であるパーツファイルのカスタムプロパティ(材質、承認者、図番など)がバラバラに入力されていて頭を抱えたことはありませんか?1ファイルずつプロパティ画面を開いて手作業で修正していたら、定時までに終わりませんよね。

ここをクリアすれば、SolidWorks VBAの「オブジェクトのライフサイクル」と「データの核心へのアプローチ方法」の基本はバッチリです。優しく、そして本質的なところまで深く解説していきますね。

1. 現場の現実:なぜ「カスタムプロパティ操作」でみんな躓くのか?

SolidWorksのAPIで最も重要な概念の一つが、「どこに対して処理を行っているか(コンテキスト)」です。

パーツ(PartDoc)を開いているからといって、いきなりプロパティを書き換えられるわけではありません。
SolidWorksの内部構造は、以下のような階層構造になっています。

SldWorks (アプリケーション)
┗ ModelDoc2 (現在開いているドキュメント)
┗ Extension (拡張機能の窓口)
┗ CustomPropertyManager (プロパティ管理の本体)

この「窓口(Extension)」と「本体(CustomPropertyManager)」の概念を理解していないと、「プロパティが取得できません」「エラー 419: オブジェクト変数が見つかりません」という呪いのエラーに悩まされることになります。

今日の目標は、「アクティブなパーツファイルからすべてのカスタムプロパティの名前と値をごっそり抜き出し、指定したキーワードを一括置換する」という、実務で即戦力になるスクリプトを完成させることです。

2. 【実戦投入コード】カスタムプロパティ全走査・一括置換マクロ

それでは、VBAエディタを開いて、以下のコードを標準モジュールに貼り付けてみてください。
プログラミング初学者でも迷わないよう、一行ずつ魂を込めてコメントを入れています。

Option Explicit

‘ ==============================================================================
‘ 担当エンジニア直伝:カスタムプロパティ一括クレンジング・ユーティリティ
‘ ==============================================================================
Sub CleanUpCustomProperties()

‘ 1. SolidWorks アプリケーションのインスタンスを取得
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

‘ 2. 現在アクティブなドキュメントを取得
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “処理対象となるパーツ(またはアセンブリ)が開かれていません。”, vbExclamation
Exit Sub
End If

‘ 3. 対象がパーツかアセンブリかを確認(今回はPartを想定)
‘ ※ Configuration(コンフィギュレーション)固有のプロパティを扱うか、
‘ ファイル全体のプロパティを扱うかでパスが変わりますが、今回は「ファイル全体」を対象とします。

Dim swModelDocExt As SldWorks.ModelDocExtension
Set swModelDocExt = swModel.Extension

‘ 「空文字(””)」を指定すると、コンフィギュレーション固有ではなく、
‘ ドキュメント情報(ファイル全体のカスタムプロパティ)のマネージャーを取得できます。
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Set swCustPropMgr = swModelDocExt.CustomPropertyManager(“”)

If swCustPropMgr Is Nothing Then
MsgBox “カスタムプロパティマネージャーの取得に失敗しました。”, vbCritical
Exit Sub
End If

‘ ==========================================================================
‘ 4. 既存プロパティ名の全取得 (GetNames)
‘ ==========================================================================
‘ GetNamesメソッドは、Variant型の配列を返します。
‘ ただし、プロパティが1つも登録されていない場合、返り値は「Empty(配列ではない)」になるので注意!

Dim vPropNames As Variant
vPropNames = swCustPropMgr.GetNames

If IsEmpty(vPropNames) Then
MsgBox “このファイルにはカスタムプロパティが1つも登録されていません。”, vbInformation
Exit Sub
End If

‘ ==========================================================================
‘ 5. 走査と一括置換の実行 (Get2 と Set2)
‘ ==========================================================================
Dim i As Long
Dim propName As String
Dim valOut As String
Dim resolvedValOut As String
Dim wasResolved As Boolean
Dim resultCode As Long

‘ 置換ルールの設定(例:「旧名称」を「新名称」に置き換える、あるいは特定の文字列を置換)
Const TARGET_KEYWORD As String = “旧部署名”
Const REPLACE_KEYWORD As String = “新部署名”

Dim reportLog As String
reportLog = “【プロパティ走査・置換レポート】” & vbCrLf

‘ 配列の下限(LBound)から上限(UBound)までループを回す
For i = LBound(vPropNames) To UBound(vPropNames)
propName = vPropNames(i)

‘ Get2メソッドの引数の意味:
‘ Get2(FieldName, valOut, resolvedValOut)
‘ – valOut: 評価前の生の値(数式などを含む場合がある)
‘ – resolvedValOut: 評価済みの値(変数や数式が展開された最終的な文字列)
swCustPropMgr.Get2 propName, valOut, resolvedValOut

‘ ログ用に見やすいたたき台を作成
reportLog = reportLog & “・ ” & propName & ” = ” & resolvedValOut & vbCrLf

‘ ここで値の中に「TARGET_KEYWORD」が含まれているかチェックし、置換処理を行う
If InStr(resolvedValOut, TARGET_KEYWORD) > 0 Then
‘ 文字列を置換
Dim newValue As String
newValue = Replace(resolvedValOut, TARGET_KEYWORD, REPLACE_KEYWORD)

‘ Set2メソッドで値を上書き保存する
‘ Set2(FieldName, Value) ※戻り値として成否を示す列挙体が返る
‘ swCustomInfoAddResult_e や swCustomInfoSetResult_e を参照
resultCode = swCustPropMgr.Set2(propName, newValue)

If resultCode = 0 Then ‘ 0 = swCustomInfoSetResult_Changed (変更成功)
reportLog = reportLog & ” └ 【置換成功】 ” & resolvedValOut & ” ➔ ” & newValue & vbCrLf
End If
End If
Next i

‘ 6. 変更をドキュメントに反映するため、画面を再描画・強制更新
swModel.ForceRebuild3 False

‘ 結果報告
MsgBox reportLog, vbInformation, “クレンジング完了”

End Sub

3. コードのキモ:ここが分かればAPIマスターへの道が開ける

上記のコードの中で、初心者が絶対に押さえておくべき「3つのポイント」を解説します。

① `GetNames` の返り値は「動的なVariant配列」

`swCustPropMgr.GetNames` は、ファイルに登録されているプロパティ名をすべて配列として返してくれます。
ここで重要なのは、「プロパティがゼロ個のときに `IsEmpty` で判定しないと、`UBound` を呼んだ瞬間にインデックスエラー(実行エラー 9)でマクロがクラッシュする」という点です。
実務のコードでは、必ず `If IsEmpty(vPropNames) Then` という防壁を張るのが一流のエンジニアの作法です。

② `Get` ではなく `Get2` を使え!

SolidWorks APIには、古いバージョンからの互換性のために古いメソッドが残っていることがよくあります。
プロパティの値を取得する際、`Get` ではなく必ず `Get2` を使ってください。
`Get2` を使うことで、変数(例えば `$PRPSHEET{材質}` のようなアノテーションや数式)が展開された「解決済みの値(resolvedValOut)」を取得できます。ここを手抜きすると、空っぽの文字列をいじってしまい、データが吹き飛ぶ悲劇が起きます。

③ プロパティの書き換えは `Set2`

書き込みには `Set2(propName, newValue)` を使います。
プロパティがすでに存在する場合は値を上書きし、存在しない場合は新規追加するという賢い挙動をしてくれます。今回は「既存のものをクレンジング(置換)」する目的なので、まさにうってつけのメソッドです。

4. 陥りやすい罠とエラー回避のテクニック

このマクロを実際に動かすときに、誰もが一度はハマる「落とし穴」を先回りして共有しておきます。

  • 罠1:読み取り専用(Read-Only)のファイルを開いている
  • 対策: PDM(SOLIDWORKS PDM)などでチェックアウトしていないファイルに対して `Set2` を走らせるとエラーになります。実行前に `swModel.IsReadOnly` などをチェックするロジックを挟むと完璧です。
  • 罠2:コンフィギュレーション固有のプロパティだった場合
  • 対策: 今回のコードは「ファイル全体(サマリー情報のカスタムタブ)」を対象にしています。もしコンフィギュレーション(Configuration)ごとに値が違うプロパティを操作したい場合は、`swModel.Extension.CustomPropertyManager(“ConfigName”)` のように、引数に明示的にコンフィギュレーション名を入れる必要があります。

最後に:ここをクリアすれば、基本はバッチリ!

いかがでしたでしょうか?
「画面をポチポチ操作してプロパティを直す」という苦行から解放され、VBAのコード数行で数百のファイルを一瞬で浄化できる未来が見えてきたはずです。

SolidWorks VBAの基本は、
1. オブジェクトの階層(App ➔ Model ➔ Extension ➔ Manager)を正しく辿る
2. データの型(Variantや配列)の特性を理解して安全に扱う
3. 適切なバージョン(Get2やSet2)のAPIメソッドを選択する

この3点につきます。ここをクリアしたあなたなら、もうマクロの記録機能に頼る必要はありません。
ぜひ、ご自身の職場のデータに合わせてこのスクリプトをカスタマイズし、圧倒的な業務効率化を達成してください。エンジニアライフを応援しています!

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