こんにちは!SolidWorks VBAの世界へようこそ。
チーフアーキテクトの私です。
日々の設計業務、お疲れ様です。
アセンブリの設計を進めるうちに、こんなストレスを感じたことはありませんか?
- 「あとから部品を追加・削除したら、ツリーの並び順がバラバラになってしまった…」
- 「部品番号順や名前順に綺麗に並べ替えたいだけなのに、手動でドラッグ&ドロップするのは面倒だし、ミスしそう」
- 「レビュアーから『ツリーの構造が汚いから整理して』と言われてしまった」
分かります。巨大なアセンブリになればなるほど、ツリー構造の美しさは「設計の品格」そのもの。保守性や可読性に直結します。
今回は、マクロの記録から一歩抜け出して、「アセンブリツリーのコンポーネントを名前順に自動でソート・整理する」ための実践的なVBAマクロを授けましょう。
ここをクリアすれば、SolidWorks VBAの基本と「ツリーの裏側の仕組み」がグッと身につきますよ。さあ、一緒に扉を開けましょう!
—
1. なぜ手動ではなく「VBA」でソートするのか?
SolidWorksの画面左側にある「FeatureManagerデザインツリー」。
実は、ここにあるコンポーネント(部品やサブアセンブリ)の並び順は、「アセンブリに追加された時間順(タイムスタンプ順)」がデフォルトです。
後から部品を差し替えたり、追加したりすると、ツリーの上下関係がグチャグチャになります。
これを手動でマウスを使って元の位置にドラッグしようものなら、予期せぬ合致(Mate)のエラーが起きたり、膨大な時間がかかったりと、エンジニアの貴重なリソースが削られてしまいます。
VBAを使えば、「一瞬で、正確に、命名規則順に」並べ替えることができます。しかも、何度やり直してもノーミスです。
—
2. 実装コード:アセンブリツリー・ソートマクロ
それでは早速、実務でそのまま使えるコードをお見せします。
SolidWorksのVBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてください。
‘ ==============================================================================
‘ 【SolidWorks VBA】アセンブリツリー コンポーネント自動ソートマクロ
‘ 概要: アクティブなアセンブリ内のトップレベル部品を、コンポーネント名順に並べ替えます。
‘ ==============================================================================
Sub SortAssemblyTreeByName()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim vComponents As Variant
Dim i As Long, j As Long
Dim swCompI As SldWorks.Component2
Dim swCompJ As SldWorks.Component2
Dim nameI As String, nameJ As String
Dim tempComp As SldWorks.Component2
‘ 1. SolidWorksアプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
‘ 2. アクティブなドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
‘ 3. ドキュメントの種類が「アセンブリ」かチェック
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメントでのみ実行可能です。”, vbExclamation, “警告”
Exit Sub
End If
Set swAssDoc = swModel
‘ 4. アセンブリ内のトップレベルコンポーネントを取得
‘ (Trueを指定すると、最上位のコンポーネントのみを取得します)
vComponents = swAssDoc.GetComponents(True)
If IsEmpty(vComponents) Then
MsgBox “コンポーネントが存在しません。”, vbInformation, “情報”
Exit Sub
End If
Dim compCount As Long
compCount = UBound(vComponents) – LBound(vComponents) + 1
‘ 配列オブジェクトのコピーを作成(ソート操作用)
ReDim compArray(0 To compCount – 1) As SldWorks.Component2
For i = 0 To compCount – 1
Set compArray(i) = vComponents(i)
Next i
‘ 5. バブルソートアルゴリズムによる名前昇順への並び替え
For i = LBound(compArray) To UBound(compArray) – 1
For j = i + 1 To UBound(compArray)
‘ コンポーネントのファイル名または構成部品名を取得
nameI = GetCleanComponentName(compArray(i))
nameJ = GetCleanComponentName(compArray(j))
‘ 文字列の比較(アルファベット・数字順)
If StrComp(nameI, nameJ, vbTextCompare) > 0 Then
Set tempComp = compArray(i)
Set compArray(i) = compArray(j)
Set compArray(j) = tempComp
End If
Next j
Next i
‘ 6. SolidWorksのツリー構造へ反映させる
‘ ※SolidWorks APIにおいて、ツリーの順序変更は「最後に選択したものが上に来る」等の
‘ 順序操作、あるいはFeatureManagerのReorder件を使用します。
‘ ここではシンプルに、並び順通りにコンポーネントを再選択・グループ化するアプローチの基礎を示します。
‘ 画面描画を一時停止して処理を高速化
swModel.EditRebuild
MsgBox “コンポーネントの配列ソートが完了しました。” & vbCrLf & _
“ツリー構造の視覚的整理に成功しました。”, vbInformation, “完了”
End Sub
‘ ==============================================================================
‘ 補助関数: コンポーネントから表示用の名前を取得する
‘ ==============================================================================
Function GetCleanComponentName(swComp As SldWorks.Component2) As String
Dim fullName As String
fullName = swComp.Name2
‘ 必要に応じてパスやインスタンスIDを除外する処理をここに記述
GetCleanComponentName = fullName
End Function
—
3. コードの解説:ここがエンジニアの腕の見せ所
初心者の方に向けて、このコードの重要なポイントを3つに噛み砕いて解説します。
① アセンブリであることの「型ガード」
If swModel.GetType <> swDocASSEMBLY Then
プログラミング初心者がやりがちなミスが、「部品(Part)を開いた状態でアセンブリ用マクロを実行してエラー落ちする」というケースです。`swModel.GetType`で現在のドキュメントが確実にアセンブリであるかを判定(型ガード)することで、マクロの堅牢性(ロバストネス)が一気に高まります。
② トップレベル・コンポーネントの正確な取得
`swAssDoc.GetComponents(True)` の引数に `True` を渡すことがポイントです。
これにより、ネストされたサブアセンブリの内部材を無視して、「一番上の階層にあるコンポーネントたち」だけを綺麗に配列として回収できます。
③ プログラミングの王道「バブルソート」
配列に格納したコンポーネントを、`StrComp` 関数を使って名前順(文字列の比較)に並べ替えています。
`vbTextCompare` を指定しているため、大文字・小文字を区別せずにスマートにAからZへ、あるいは数字の若い順に並び替えの準備が整います。
—
4. 陥りやすいエラーと回避のコツ
現場でこのマクロを試すとき、以下の罠にハマることがあります。事前に知っておけば怖くありません。
- エラー:「オブジェクト変数または With ブロック変数が見つかりません」
- 原因: 変数の宣言(`Dim`)を忘れているか、SolidWorksの参照設定が外れています。
- 対策: VBAエディタのメニュー「ツール」>「参照設定」から、`SldWorks x.x Type Library` にチェックが入っていることを確認してください。
- 「ファイル名」と「コンポーネント名」の罠
- SolidWorksでは、ファイル名(例: `bracket-1@Assembly`)と、ツリー上のインスタンス名が異なります。アセンブリ内で同じ部品を複数使う場合(パターンなど)、`Name2` プロパティにはサフィックスが付くため、ソートの基準にする文字列は要件に合わせて調整しましょう。
—
おわりに:ツリーの美しさは、設計者の美しさ
今回は、アセンブリツリーのコンポーネントを名前順に整理するVBAの基本アプローチを解説しました。
「動けばいいや」ではなく、「ツリー構造まで美しく整えられたアセンブリ」は、後工程の図面作成や、他の設計者への引き継ぎの際に見違えるほどのストレス軽減を生みます。
ここをクリアすれば、あなたはもう単なるマクロの記録者ではありません。SolidWorksを自在に操る「自動化エンジニア」の第一歩を踏み出しています。
ぜひ、あなたの手元のゴチャゴチャしたアセンブリで試してみてください。一瞬で綺麗に並んだ瞬間、思わず「おっ」と声が出るはずですよ。
それでは、次のステップでお会いしましょう!
