【入門編】【実務中級】アセンブリ内の指定したサブアセンブリだけを切り出して独立したSTEPファイルとして自動エクスポートする – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
大規模なアセンブリを扱っていて、こんな面倒な作業に頭を悩ませたことはありませんか?

「親アセンブリから、特定のサブアセンブリだけを抜き出して、取引先や別部署用に『STEPファイル』として個別に書き出したい……」

これを手作業でやろうとすると、親ファイルを開いて、不要な部品を非表示(あるいは削除)にして、名前をつけて保存し直して……と、気の遠くなるような手順を踏むことになりますよね。しかも、元のアセンブリを壊してしまうリスクもあります。

ここをクリアすれば、あなたもマクロの記録から完全に脱却し、「現場で頼られる自動化エンジニア」の仲間入りです。今回は、SolidWorks VBAの裏側の仕組み(オブジェクトのライフサイクル)に少しだけ踏み込みながら、指定したサブアセンブリだけを鮮やかに切り出してSTEPエクスポートする実用コードを一緒に見ていきましょう。

—

なぜ「手作業」や「マクロの記録」では限界があるのか?

まず知っておいてほしいのは、SolidWorksのマクロ記録機能は「画面上のマウス操作をトレースしているだけ」という点です。そのため、巨大なアセンブリのツリー構造から特定のサブアセンブリだけを狙い撃ちして、裏側(バックグラウンド)でサクッと別名保存してSTEPに変換するような知的な処理は、マクロ記録では絶対に書けません。

私たちが書くべきVBAコードの戦略はこうです。

1. 今開いているアセンブリから、目的の「サブアセンブリ」のコンポーネントオブジェクトを特定する。
2. そのサブアセンブリの「実体ファイル(パス)」を取得する。
3. SolidWorksの裏側(非表示モード)で、そのファイルだけを新しく独立して開く。
4. 開いたドキュメントに対して、STEP形式での保存命令(SaveAs)を実行する。
5. 開いたウィンドウを静かに閉じる(メモリ解放)。

この「バックグラウンドで処理を完結させる」というアプローチが、パフォーマンスを保ち、エラーを防ぐプロの技です。

—

実務でそのまま使える!自動エクスポート・マクロ

それでは、お待ちかねの実装コードです。
SolidWorksのVBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ 【実務対応】指定サブアセンブリの独立STEPエクスポート・マクロ
‘ ==============================================================================
Sub ExportSubAssemblyToStep()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 1. アクティブドキュメントが存在するか、それがアセンブリかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメントで使用してください。”, vbCritical, “エラー”
Exit Sub
End If

Set swAssDoc = swModel

‘ ==============================================================================
‘ 【設定エリア】ここにエクスポートしたいサブアセンブリの「部品名(またはファイル名)」を指定
‘ ※ツリーに表示されているコンポーネント名(拡張子なし、またはインスタンス名)を指定します
‘ ==============================================================================
Dim targetCompName As String
targetCompName = “Unit_A-1” ‘ ← ここをあなたの環境のサブアセンブリ名に変更してください

‘ 2. アセンブリ内からターゲットのコンポーネントを探索
Dim vComps As Variant
vComps = swAssDoc.GetComponents(True) ‘ True = トップレベルのみならず下層も含めて再帰的に取得

Dim i As Long
Dim foundComp As SldWorks.Component2
Set foundComp = Nothing

For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)
‘ コンポーネントの名前(User-Assigned Name または 構成部品名)をチェック
If UCase(swComp.Name2) Like UCase(“” & targetCompName & “”) Then
Set foundComp = swComp
Exit For
End If
Next i

If foundComp Is Nothing Then
MsgBox “指定されたサブアセンブリ [” & targetCompName & “] が見つかりませんでした。”, vbExclamation, “確認”
Exit Sub
End If

‘ 3. 該当コンポーネントの「元のファイルパス」を取得
Dim subModelPath As String
subModelPath = foundComp.GetPathName

If subModelPath = “” Then
MsgBox “指定された構成部品は仮想コンポーネント(内部保持)のため、直接ファイルパスを取得できません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 4. バックグラウンド(非表示)でサブアセンブリを開く
Dim errCode As Long
Dim warnCode As Long
Dim subModel As SldWorks.ModelDoc2

‘ VisibleをFalseにすることで、画面描画の負荷を消し去り超高速化する
Set subModel = swApp.OpenDoc6(subModelPath, swDocASSEMBLY, swOpenDocOptions_Silent, “”, errCode, warnCode)

If subModel Is Nothing Then
MsgBox “サブアセンブリの読み込みに失敗しました。エラーコード: ” & errCode, vbCritical, “エラー”
Exit Sub
End If

‘ 5. 保存先のパスを決定(親アセンブリと同じフォルダにSTEPとして出力)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim parentPath As String
parentPath = fso.GetParentFolderName(swModel.GetPathName)

Dim baseName As String
baseName = fso.GetBaseName(subModelPath)

Dim exportPath As String
exportPath = parentPath & “\” & baseName & “.step”

‘ 6. STEP形式で保存
‘ SaveAs2を使用(引数: 保存パス, バージョン, オプション, ログ, エラー, 警告)
Dim saveStatus As Boolean
saveStatus = subModel.Extension.SaveAs(exportPath, 0, 0, Nothing, errCode, warnCode)

‘ 7. バックグラウンドで開いたドキュメントを閉じる(メモリのリークを防ぐ極めて重要な処理)
swApp.CloseDoc subModel.GetTitle

‘ 8. 完了報告
If saveStatus Then
MsgBox “以下のSTEPエクスポートが完了しました!” & vbCrLf & exportPath, vbInformation, “成功”
Else
MsgBox “STEPファイルの保存中にエラーが発生しました。エラーコード: ” & errCode, vbCritical, “エラー”
End If

End Sub

—

コードの核心:プログラマが押さべき3つのポイント

このコードが「実務レベル」である所以を、少しだけ技術的な視点から解説させてください。

1. `swAssDoc.GetComponents(True)` による全階層スキャン

`True` という引数を渡すことで、メインアセンブリの直下だけでなく、さらに深い階層にあるサブアセンブリや部品まで、すべてフラットな配列として拾い上げることができます。これによって、ツリーのどこに配置されているモジュールであっても一網打尽に検索できます。

2. 仮想コンポーネント(Virtual Component)への配慮

SolidWorksには、ファイルを別名で保存せずアセンブリ内部にデータを抱え込む「仮想コンポーネント」という仕組みがあります。これらは実ファイルを持たないため、`GetPathName` が空文字を返します。プログラマンシップとして、こうした「例外が起きるポイント」を事前に `If subModelPath = “” Then` で弾いている点が、現場でエラーを吐かない強靭なコードの秘訣です。

3. メモリのライフサイクル管理 (`swApp.CloseDoc`)

バックグラウンドで `OpenDoc6` を使ってファイルを開いた場合、処理が終わったら必ず `CloseDoc` で閉じる必要があります。これを忘れると、見えないところでSolidWorksがメモリを食い潰し、PCがフリーズしたり動作が重くなったりする原因になります。オブジェクトを開いたら閉じる、これはプログラマの美しいマナーです。

—

陥りやすい罠とエラー対策

  • エラーコード `errCode` が返ってきたら?

SolidWorksのAPIは、処理が失敗したときに数値のエラーコード(Bitマスク)を返します。もし保存に失敗する場合は、出力先のフォルダの書き込み権限や、ファイル名に使用できない文字(`/`や`:`など)が含まれていないかを確認してください。

  • コンポーネント名が一致しない

コード内の `targetCompName` は、フィーチャーマネージャーデザインツリーに表示されている名前の部分一致で探しています。インスタンス番号(例: `Unit_A-1<1>`)などを考慮して、ユニークにヒットする文字列を指定するのがコツです。

—

まとめ:ここをクリアすれば基本はバッチリ!

お疲れ様でした!今回は「アセンブリから特定のサブアセンブリを切り出してSTEP化する」という、実務で100回は遭遇する課題をVBAでスマートに解決する方法を解説しました。

  • アセンブリからコンポーネントを検索するロジック
  • ファイルパスの取得とバックグラウンド処理 (`OpenDoc6`)
  • 確実な保存 (`SaveAs`) とメモリ解放 (`CloseDoc`)

この一連の流れをマスターしていれば、ファイル一括変換や図面の一括PDF出力など、他の業務自動化への応用は余裕で可能です。「ここをこう書き換えたら、次は全パーツを個別にSTEPにできるのでは……?」そう気づいた瞬間から、あなたの中のSolidWorks VBAスキルは本物になっています。

日々の退屈な手作業はマクロに任せて、私たちはもっとクリエイティブな設計業務に集中しましょう!それでは、また次回の知見でお会いしましょう。

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