こんにちは!SolidWorks自動化の世界へようこそ。
今回は、実務で絶対に避けて通れない「アセンブリ図面(Drawing)自動生成への布石」として、コンポーネントのカスタムプロパティをVBAで一括整備し、バルーン(部品番号)連携の土台を作るテクニックを解説します。
「マクロの記録」ボタンを押して得られたコードをそのまま貼り付けても、アセンブリの中にある無数の部品(コンポーネント)を相手にすると、途端に動かなくなったり、意図しない部品のプロパティを書き換えてしまったりしますよね。
ここをクリアすれば、SolidWorks VBAの構造的な理解はグッと深まり、あなたの設計業務のスピードは文字通り「桁違い」になります。
優しく、そして本質的な部分までしっかりと紐解いていきますので、一緒にマスターしていきましょう!
—
なぜ、図面化の前に「VBAでのプロパティ整備」が必要なのか?
実務でアセンブリの図面を作り、部品表(BOM)を配置したとき、こんなストレスを感じたことはありませんか?
- 「部品名や材質が空欄で、図面側で手打ち修正するハメになった…」
- 「アセンブリ構造が変わるたびに、バルーンの番号やプロパティの整合性を確認するのが面倒…」
SolidWorksの図面(Drawing)や部品表は、大元である部品(Part)やサブアセンブリが持つ「カスタムプロパティ」を忠実に吸い上げて表示しています。つまり、図面を自動化したいなら、「図面を描く前段階で、3Dモデル側のデータをVBAで完璧に整えておくこと」が何よりも確実でスマートなアプローチなのです。
—
SolidWorks VBAの核心:アセンブリからコンポーネントを巡る旅
アセンブリ(`AssemblyDoc`)を操作するとき、VBAは「トップレベルのアセンブリ」からスタートし、その子供である「構成部品(Component2)」のツリー構造を辿っていく必要があります。
ここで重要になるのが、「ドキュメント(ModelDoc2)」と「コンポーネント(Component2)」の二面性です。
- Component2:アセンブリという空間の中で「どこに配置されているか(位置・姿勢・表示状態)」を管理するオブジェクト。
- ModelDoc2:その部品そのもの。「材質、質量、カスタムプロパティ(部品番号や名称)」という中身のデータを管理するオブジェクト。
プロパティを書き換えるには、コンポーネントから「中身のドキュメント」を取り出すという一手間が必要です。ここを理解していないと、エラーの泥沼にハマってしまいます。
—
実務で使える!カスタムプロパティ一括整備マクロ
お待たせしました。アセンブリ内の全構成部品に対し、指定したカスタムプロパティ(例:「部品番号」や「材質」など)を一括で書き込む、実用的なVBAコードを公開します。
このコードは、開発現場でそのままコピペして、自分の環境に合わせて微調整できるように丁寧にコメントを入れています。
Option Explicit
‘ ==============================================================================
‘ 【メイン処理】アセンブリ内の全構成部品のカスタムプロパティを一括整備する
‘ ==============================================================================
Sub UpdateAssemblyComponentProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim swRootComp As SldWorks.Component2
‘ 1. SolidWorksアプリケーションの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 2. アクティブなドキュメントがアセンブリかチェック
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbExclamation
Exit Sub
End If
Set swAssDoc = swModel
‘ 3. アセンブリのルートコンポーネントを取得
Set swRootComp = swAssDoc.GetRootComponent3(True)
If swRootComp Is Nothing Then
MsgBox “ルートコンポーネントを取得できませんでした。”, vbCritical
Exit Sub
End If
‘ 4. 再帰処理(子部品の探索とプロパティ書換)の実行開始
MsgBox “コンポーネントのカスタムプロパティ一括更新を開始します。”, vbInformation
Call TraverseComponent(swRootComp, 0)
‘ 5. モデルの再構築(変更を確実に反映させる)
swModel.ForceRebuild3 True
MsgBox “すべての処理が完了しました!図面化の準備はバッチリです。”, vbInformation
End Sub
‘ ==============================================================================
‘ 【再帰関数】ツリー構造を潜り抜け、下位部品・サブアセンブリを網羅する
‘ ==============================================================================
Sub TraverseComponent(swComp As SldWorks.Component2, ByVal Level As Long)
Dim vChildComps As Variant
Dim swChildComp As SldWorks.Component2
Dim swChildModel As SldWorks.ModelDoc2
Dim i As Long
‘ 子コンポーネントの配列を取得
vChildComps = swComp.GetChildren
If IsEmpty(vChildComps) Then Exit Sub
‘ 子コンポーネントをループ
For i = 0 To UBound(vChildComps)
Set swChildComp = vChildComps(i)
‘ 非表示や軽量化されている部品を除外せず、確実に実体(ModelDoc2)を取得する
Set swChildModel = swChildComp.GetModelDoc2()
If Not swChildModel Is Nothing Then
‘ —【ここにプロパティ操作のロジックを書く】—
‘ 例として「PartNo(部品番号)」というプロパティに、ファイル名を設定してみます
Call SetCustomProperty(swChildModel, “PartNo”, swChildComp.Name2)
‘ ————————————————
‘ サブアセンブリの場合はさらに奥へ潜る(再帰呼び出し)
TraverseComponent swChildComp, Level + 1
End If
Next i
End Sub
‘ ==============================================================================
‘ 【共通関数】指定したモデルのカスタムプロパティを追加・上書きする
‘ ==============================================================================
Sub SetCustomProperty(swModel As SldWorks.ModelDoc2, PropName As String, PropValue As String)
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim configName As String
Dim res As Long
‘ アクティブコンフィギュレーション名を取得(コンフィギュレーションごとのプロパティを操作する場合)
configName = swModel.ConfigurationManager.ActiveConfiguration.Name
‘ ユーザー定義プロパティマネージャーを取得
‘ 引数に空文字 “” を指定すると「ユーザー定義(全コンフィギュレーション共通)」、
‘ コンフィギュレーション名を指定すると「固有のプロパティ」になります。
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)
‘ すでにプロパティが存在するか確認し、追加または値の変更を行う
‘ Add3引数: (名前, 種類, 値, 描画オプション)
‘ swCustomInfoText = 30 (テキスト型)
res = swCustPropMgr.Add3(PropName, swCustomInfoText, PropValue, swCustomPropertyReplaceValue)
If res = swCustomPropertyAddResult_Error Then
‘ すでに存在して置き換えられた場合などのハンドリング(必要に応じて拡張)
End If
End Sub
—
陥りやすいエラーと、プロとしての回避テクニック
初心者がこの領域で必ずと言っていいほどハマる「罠」が2つあります。ここを知っておくだけで、開発スピードが3倍変わります。
1. 軽量コンポーネント(Lightweight)の罠
アセンブリが大きくなると、SolidWorksはメモリ節約のために部品を「軽量」状態で読み込みます。この状態のまま`GetModelDoc2()`を呼ぶと、中身が取得できずにプロパティ書き換えがスルーされてしまいます。
- 対策:実務の堅牢なコードでは、処理の前に`swChildComp.SetResolved()`などを挟んで完全に解決(ロブスト化)するか、あらかじめアセンブリを開く際に完全解決モードで開く運用ルールにします。
2. 「ファイル名」と「コンポーネント名」の混同
アセンブリツリーに同じボルトが10本あるとします。ファイル名はすべて同じですが、コンポーネントのインスタンス名(`swChildComp.Name2`)は `Bolt-1<1>`, `Bolt-1<2>` のようにユニークになります。
部品表(BOM)やバルーンと連携させる際、どのプロパティをどこに紐付けるべきか(ファイル共通の型番なのか、インスタンスごとの番号なのか)を意識してコードを組まないと、図面化したときに意図しない表示になってしまいます。
—
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
お疲れ様でした!今回は「アセンブリのツリー構造を再帰的に巡り、図面化の土台となるカスタムプロパティをプログラムから一括整備する」という、実務で最高に価値のあるテクニックを解説しました。
このコードをベースに、「Excelの部品リストからデータを読み込んでプロパティに流し込む」という仕組みを組み合わせれば、数千部品ある巨大アセンブリの図面化準備も、わずか数秒で終わるようになります。
「マクロの記録」を卒業し、自分の手でオブジェクトをコントロールする快感を手に入れたあなたなら、どんな自動化の壁も必ず突破できます。
ぜひ、あなたの開発現場の業務効率化に役立ててください!次回の応用編もお楽しみに!
