こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
マクロの記録ボタンを押して生成されたコードを眺めるだけの階段は、もう登り終えましたか?
「ボタン一つで日々の定型業務を終わらせたい」「アセンブリのデータ品質を保ちたい」——そんな実務の壁にぶつかっているあなたなら、ここからの話は最高にエキサイティングなものになります。
今回は、実務で絶対に直面する「アセンブリ内のパーツごとに定義されたカスタムプロパティの命名規則違反を一括スキャンして修正するツール」の作り方を解説します。
大規模なアセンブリになると、設計者によって「PartNo」「部品番号」「part_no」など、カスタムプロパティのキー名がバラバラになりがちです。これが後工程の図面作成やPDM連携で致命的なエラーを引き起こす。
これをVBAの力で一網打尽に美しく整えるデータ品質管理術を、一緒にマスターしましょう!ここをクリアすれば、あなたのSolidWorks VBAスキルは間違いなく中級者の領域に到達します。
—
なぜアセンブリのプロパティ管理は地獄と化すのか?
アセンブリを開いたとき、そこには数多の部品(Component)が存在します。
手作業で一つひとつ部品を開き、「ファイル」>「プロパティ」からキー名を確認して修正していく……想像しただけで発狂しそうになりますよね。
SolidWorks VBAにおけるアセンブリの走査(トラバーサル)の本質は、「ツリー構造の海をいかに迷わず泳ぎ切るか」にあります。
アセンブリの中にサブアセンブリがあり、その中にパーツがある。この階層構造(親子関係)を再帰的、あるいは堅牢なループで辿り、すべてのコンポーネントの背後にある「ModelDoc2(ドキュメント実体)」を掴み取る。これが今回のキモです。
—
実装の全体像:何をするマクロなのか?
今回のツールは、以下のステップで動作します。
1. アクティブなアセンブリドキュメントを取得する
2. アセンブリに含まれる全コンポーネントを列挙する(コンポーネントの重複やマタイトルの処理に注意!)
3. 各コンポーネントの「カスタムプロパティマネージャー」にアクセスする
4. 定義されたキー名をスキャンし、許容されていない古いキー名(例: “PartNo”)を見つけたら、正しいキー名(例: “部品番号”)へ値ごと移行する
それでは、実際のコードを見ていきましょう。開発環境(VBAエディタ)の標準モジュールにそのまま貼り付けて動かせる実用コードです。
—
実務仕様:一括スキャン&修正VBAコード
Option Explicit
‘ ==============================================================================
‘ 【実務対応】アセンブリ内カスタムプロパティ一括補正マクロ
‘ 概要: アセンブリ内の全構成部品をスキャンし、誤ったプロパティキーを正しいキーへ移行する
‘ ==============================================================================
Sub FixCustomPropertiesInAssembly()
Dim swApp As SldWorks.SldWorks
Dim swAssmDoc As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
Set swApp = Application.SldWorks
Set swAssmDoc = swApp.ActiveDoc
‘ 1. ドキュメントが開かれており、かつアセンブリであるかチェック
If swAssmDoc Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
If swAssmDoc.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If
Set swAssm = swAssmDoc
‘ 性能向上のため、画面描画と再構築を一時停止(超重要テクニック!)
swAssmDoc.UserControl = False
swAssmDoc.Visible = False
‘ 2. アセンブリ内の全コンポーネントを取得(TopLevelのみならず、サブアセンブリも含める場合は再帰処理が必要ですが、今回は簡潔に全コンポーネント取得を使用)
Dim vComps As Variant
vComps = swAssm.GetComponents(True) ‘ Trueを指定して非表示コンポーネント等も網羅
If IsEmpty(vComps) Then
MsgBox “コンポーネントが見つかりませんでした。”, vbExclamation, “通知”
GoTo CleanUp
End If
Dim i As Long
Dim swComp As SldWorks.Component2
Dim swCompDoc As SldWorks.ModelDoc2
Dim processedCount As Long
processedCount = 0
‘ 3. ループ処理による全コンポーネントの走査
For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)
‘ コンポーネントからModelDoc2を取得
Set swCompDoc = swComp.GetModelDoc2()
If Not swCompDoc Is Nothing Then
‘ プロパティ修正メイン処理の呼び出し
If ProcessCustomProperties(swCompDoc) Then
processedCount = processedCount + 1
End If
End If
Nxt:
Next i
CleanUp:
‘ 画面描画と再構築を復元
swAssmDoc.Visible = True
swAssmDoc.UserControl = True
swAssmDoc.EditRebuild
MsgBox “処理が完了しました。” & vbCrLf & _
“修正・確認を行った部品数: ” & processedCount & ” 件”, vbInformation, “完了”
End Sub
‘ ==============================================================================
‘ 個別ドキュメントのプロパティをチェック・修正する関数
‘ ==============================================================================
Private Function ProcessCustomProperties(ByVal swModel As SldWorks.ModelDoc2) As Boolean
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim configName As String
‘ アクティブコンフィギュレーション名を取得(コンフィギュレーション固有プロパティを対象にする場合)
‘ ※今回は「ユーザー定義(カスタム)」プロパティ(”” を指定)を対象とします
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)
If swCustPropMgr Is Nothing Then
ProcessCustomProperties = False
Exit Function
End If
‘ — ルールの定義 —
‘ 誤ったキー名 (Old Key) -> 正しいキー名 (New Key) のマッピング
‘ 実務では配列やDictionaryで管理すると拡張性が高まります
Dim targetOldKey As String
Dim targetNewKey As String
targetOldKey = “PartNo” W ‘ 良くある誤り(例)
targetNewKey = “部品番号” ‘ 正しい規則
Dim valOut As String
Dim resolvedValOut As String
Dim wasResolved As Boolean
Dim evalResult As Long
‘ 古いキーが存在するかチェック
evalResult = swCustPropMgr.Get4(targetOldKey, False, valOut, resolvedValOut)
If evalResult = swCustomPropertyResolved Then
‘ 古いキーの値を取得できた場合、新しいキーに値をコピーし、古いキーを削除する
Dim addResult As Long
‘ 新しいキーに追加(すでにある場合は上書き、あるいは新規追加)
‘ swCustomPropertyAddResult_Added(1) または swCustomPropertyAddResult_Changed(2)
addResult = swCustPropMgr.Add3(targetNewKey, swCustomPropertyText, valOut, swCustomPropertyReplaceVal)
If addResult = swCustomPropertyAddResult_Added Or addResult = swCustomPropertyAddResult_Changed Then
‘ 古いキーを削除
swCustPropMgr.Delete (targetOldKey)
‘ 変更を保存させるためにドキュメントをダーティ(変更あり)状態にする
swModel.SetSaveFlag
ProcessCustomProperties = True
Exit Function
End If
End If
ProcessCustomProperties = False
End Function
—
ジグザグとしたコードに見えるかもしれませんが、ここにはSolidWorks APIを扱う上での「プロフェッショナルの知見」が詰まっています。ポイントを深掘りしていきましょう。
1. パフォーマンスの魔術:`UserControl = False` と `Visible = False`
アセンブリ内の数百・数千というパーツをマクロが巡回する際、SolidWorksがいちいち画面を再描画していたら、数十分の地獄待ち時間が発生します。
コード内の `swAssmDoc.UserControl = False` と `Visible = False` は、「バックグラウンドでこっそり処理しろ、画面は書き換えるな」というGPUとCPUへの最強の命令です。処理速度が何倍にも跳ね上がります。最後に必ず `Visible = True` で元に戻すのを忘れないでください。
2. カスタムプロパティマネージャーの要諦 (`CustomPropertyManager`)
SolidWorksにおいて、プロパティは「どこに」ぶら下がっているかが重要です。
- `””` (空文字)を指定すると、全コンフィギュレーション共通の「ユーザー定義プロパティ」にアクセスできます。
- コンフィギュレーション固有のプロパティを操作したい場合は、第1引数にコンフィギュレーション名を渡します。実務では「ユーザー定義」をターゲットにすることが多いため、今回はここを攻めています。
3. 安全な値の移行プロセス
`Get4` メソッドで古いキーの値を取得し、もし存在すれば `Add3`(引数に `swCustomPropertyReplaceVal` を指定)で新しいキー名へ安全に流し込みます。その後、不要になった古いキーを `Delete` で消去する。
この「移行してから消す」という安全第一の哲学が、データの破損を防ぎます。
—
陥りがちな罠とエラー回避の心得
ここを通ればあなたも一人前。現場でよくある失敗を先回りして共有します。
- 罠1: 外部参照(仮想コンポーネントや読取専用部品)の壁
- アセンブリに含まれるパーツが「読取専用(Read-Only)」になっている場合、プロパティの書き換え(DeleteやAdd)は拒絶され、サイレントエラー(失敗しているのにエラーが出ない)になります。厳密なツールを作る場合は、`swComp.IsReadOnly` などを事前にチェックするガード節を入れましょう。
- 罠2: 変更の保存忘れ
- マクロが走ってプロパティが書き換わっても、ドキュメント自体の「変更フラグ」が立っていないと、アセンブリを閉じたときに保存されません。コード内の `swModel.SetSaveFlag` は、SolidWorksに「このファイルは変更されたから保存が必要だよ」と教えるための必須の呪文です。
—
まとめ:自動化の先にある未来
今回は、アセンブリ内のカスタムプロパティの命名規則違反を一挙にスキャンし、正しい形へと導く実務的なツールを作成しました。
「手作業で数時間を費やしていたデータクレンジングが、ボタン一つで、しかも一瞬で終わる」
この感動を味わうと、もう二度と手作業には戻れなくなります。それこそが、プログラミングを学ぶ最大の醍醐味です。
SolidWorks VBAの基本、そしてオブジェクトのライフサイクルとパフォーマンスの制御方法。ここをクリアしたあなたなら、どんな複雑なアセンブリ自動化の要望が来ても怖くありません。
自信を持って、次の自動化の扉を開いていきましょう!それでは、また次の現場でお会いしましょう。
