こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押してコードを生成する日々から一歩進み、「自分で意のままに3Dモデルやデータを操りたい」と感じているなら、あなたは今、とてもエキサイティングな扉を開こうとしています。
今回は、実務の現場で100%と言っていいほど直面する「カスタムプロパティ(メタデータ)の安全な操作と重複防止」について、私の知見をすべて注いで解説します。
「プロパティを更新したはずなのに、図枠のREV(リビジョン)が古いまま変わらない…」
「気づいたら同じ名前のプロパティが何重にも重複して登録されていた…」
そんな地獄のようなトラブルを華麗に回避し、一発で古いデータを消し去るスマートなテクニックをマスターしましょう。ここをクリアすれば、あなたのVBAスキルは確実にプロの領域へとステップアップしますよ!
—
1. なぜ「カスタムプロパティの重複」が起きるのか?
SolidWorksのパーツやアセンブリには、材質、質量、設計者名、承認日など、様々なメタデータ(カスタムプロパティ)を埋め込むことができます。
ここで初心者がハマる最初の罠があります。
SolidWorksのAPIには、プロパティを追加・設定するための `Add3` や `Set2` というメソッドが存在します。しかし、「すでにある名前のプロパティを上書きしようとして `Add3` を呼び出すと、上書きされずに【同じ名前のプロパティが二重に生成される】」という仕様(あるいは仕様のバグのような挙動)があるのです。
これが蓄積すると、図面枠(DRW)がどちらの数値を読み取ればいいか混乱し、最終的に「あれ、図面と3Dモデルのデータが食い違ってるぞ!」という大惨事に繋がります。
—
2. 解決の切り札:`CustomPropertyManager.Delete2` の正しい作法
この重複地獄から抜け出すための黄金律、それが「追加・更新する前に、必ず古いプロパティを完全消去(Delete)する」というアプローチです。
ここで登場するのが、今回の主役である `CustomPropertyManager.Delete2` メソッドです。
データの裏側:プロパティの「置き場所」を理解する
SolidWorksのAPIでは、プロパティを操作するために「誰の」プロパティマネージャーを掴むべきかを知る必要があります。
パーツファイル(`.sldprt`)であれば、大元である `ModelDoc2` から `Extension` を経由して、さらに「コンフィギュレーション(設定)固有」または「ユーザー定義(ファイル全体)」の `CustomPropertyManager` を取得します。
このオブジェクトに対して `Delete2(PropertyName)` を実行することで、指定した名前のメタデータを物理的に根こそぎ消し去ることができるのです。
—
3. 【実務直結】重複防止&安全クリーンアップのVBAコード
それでは、現場でそのままコピペして使える、極めて堅牢な実用コードを公開しましょう。
このコードは、アクティブなパーツに対して「”STATUS”(ステータス)」というカスタムプロパティが存在していればそれを削除し、まっさらな状態にしてから「Approved(承認済み)」という新しい値を安全に書き込むサンプルです。
Sub SafeUpdateCustomProperty()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim propName As String
Dim propVal As String
Dim deleteResult As Long
Dim addResult As Long
‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれていない場合のガード節
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
‘ パーツまたはアセンブリ以外は弾く(図面は対象外とする場合)
If swModel.GetType <> swDocPART And swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ実行可能です。”, vbExclamation, “確認”
Exit Sub
End If
‘ 2. 操作するプロパティ名と設定する値の定義
propName = “STATUS”
propVal = “Approved”
‘ 3. カスタムプロパティマネージャーの取得
‘ ※今回はファイル全体(ユーザー定義)のプロパティを対象にします
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)
If swCustPropMgr Is Nothing Then
MsgBox “CustomPropertyManagerの取得に失敗しました。”, vbCritical
Exit Sub
End If
‘ —————————————————-
‘ 4. 【核心】古いプロパティの確実な消去 (Delete2の実行)
‘ —————————————————-
‘ 既に存在するかどうかにかかわらず、Delete2を叩きます。
‘ 戻り値(deleteResult)の定数意味:
‘ swCustomInfoDeleteSuccess (0) = 削除成功、または元々存在しなかった
deleteResult = swCustPropMgr.Delete2(propName)
‘ 5. 新しいプロパティの安全な追加 (Add3の実行)
‘ 引数: (名前, タイプ(テキスト=30), 値)
‘ 既にDelete2で消去済みなので、重複生成が100%起きません。
addResult = swCustPropMgr.Add3(propName, swCustomInfoText, propVal, swCustomPropertyReplaceExisting)
‘ 6. 結果の判定とフィードバック
If addResult = swCustomInfoAddResult_Added Then
MsgBox “カスタムプロパティ「” & propName & “」を正常に更新しました!”, vbInformation, “完了”
Else
MsgBox “プロパティの追加に失敗しました。エラーコード: ” & addResult, vbCritical, “エラー”
End If
End Sub
—
4. コードの深掘り解説:なぜこの書き方が「プロ仕様」なのか?
① コンフィギュレーション指定の空文字 `””` の意味
`swModel.Extension.CustomPropertyManager(“”)` の部分に注目してください。引数に空の文字列 `””` を渡しています。
これは、「アクティブなコンフィギュレーションに依存しない、ファイル共通のユーザー定義プロパティ([ユーザー定義]タブのデータ)」を対象にするという指定です。
もし特定のコンフィギュレーション(例: “default” や “ConfigA”)ごとにプロパティを管理したい場合は、この引数にコンフィギュレーション名を文字列で渡します。実務ではこの切り分けが非常に重要になります。
② `Delete2` のエラーハンドリングに囚われない知恵
`Delete2(propName)` は、指定したプロパティが存在しない場合でもエラー(実行時エラー)を吐かずに処理を続行してくれます。そして「元々なかった」あるいは「うまく消せた」という状態を吸収してくれます。
そのため、「あらかじめ存在チェックの `If` 文を書く必要がない」という極めてスマートな構造にできるのが、このメソッドの最大の美しさです。
③ `Add3` の第4引数 `swCustomPropertyReplaceExisting`
SolidWorks APIの奥深さを示すのがこの定数です。万が一、何らかの理由で古いプロパティの削除が漏れていたとしても、`swCustomPropertyReplaceExisting` を指定しておくことで、API内部で既存のものを置き換える保険の役割を果たしてくれます。
「消す」と「置き換える」の二段構えにすることで、バグの入り込む隙を完全にシャットアウトしているのです。
—
5. 陥りやすいエラーと先輩からのアドバイス
実務でこのコードを組み込む際、以下のポイントでつまずく人が多いので心に留めておいてください。
- 図面(`.slddrw`)をアクティブにして実行してしまう
図面ファイルを開いている状態では、パーツ特有のカスタムプロパティ構造とは勝手が違うため、意図通りに動かないかエラーになります。必ず `swModel.GetType` でドキュメントの種類を判定するガード節を入れましょう。
- 読取専用(Read-Only)ファイルへの書き込み
PDMや共有フォルダで「読取専用」になっているパーツに対してプロパティを変更しようとすると、APIは沈黙するかエラーを返します。処理の冒頭で `swModel.IsReadOnly` などをチェックする親切設計を入れると、さらにエンジニアとしての格が上がります。
—
おわりに
今回は、SolidWorks VBAにおけるカスタムプロパティの安全なクリーンアップと重複防止について解説しました。
「古いものを確実に消し去ってから、新しく書き込む」
たったこれだけの意識ですが、この基本を徹底するだけで、あなたの組むマクロはプロレベルの安定性を手に入れることができます。
ここをクリアすれば、もうファイルのメタデータ管理で頭を悩ませることはありません。ぜひ、あなたの日常業務の自動化ツールにこのロジックを取り入れてみてください。
それでは、また次の知見でお会いしましょう。あなたのSolidWorksライフが快適なものになりますように!
