こんにちは!SolidWorks VBAの世界へようこそ。
これまでマクロの記録ボタンを押して生成されたコードを眺め、「なんだか呪文みたいだな…」と途方に暮れていませんでしたか?
部品を1つ配置して合致をつけるだけならマクロの記録でも何とかなりますが、実務の現場では「すでに作り込まれたサブアセンブリ(下位アセンブリ)をプログラムからガッツリ呼び出し、メインの組立図に組み込んで位置をビシッと決める」という自動化が求められます。
ここをクリアすれば、あなたも単なる「マクロの記録者」から「SolidWorksを意のままに操る自動化エンジニア」へ一気にステップアップできます。今日はその極意を、優しく、そして本質的なところまで徹底的に解説していきますね。準備はいいですか?
—
1. なぜ「サブアセンブリの動的挿入」でみんな躓くのか?
初心者のエンジニアが最初にハマる罠、それは「アクティブなドキュメントの概念」と「コンポーネント(Component2)のライフサイクル」の混同です。
単体部品を置くときは `AddComponent3` というメソッドを使いますが、サブアセンブリを挿入する場合、SolidWorksの内部では以下のドラマが高速で展開されています。
1. ファイルのロード: 指定されたパスからサブアセンブリの `.sldasm` をメモリ上に読み込む。
2. インスタンスの生成: メインアセンブリの中に、その「実体(Component)」を配置する。
3. マトリックス(座標変換)の適用: どこに、どの向きで置くかを決める。
ここで重要なのは、「ファイルを読み込むこと」と「アセンブリに部品(インスタンス)を配置すること」は別作業だという点です。ここを理解していないと、「ファイルはあるのにアセンブリに入らない!」というエラーの沼にハマってしまいます。
—
2. 実務で即戦力になる!サブアセンブリ挿入&合致定義コード
百聞は一見に如かず。まずは、メインアセンブリにサブアセンブリをプログラムから突っ込み、既存の基準平面に対して合致をビシッと決める実用コードを見てみましょう。
ご自身の環境に合わせて、ファイルパスの部分(`C:\YourFolder\…`)を書き換えて使ってください。
Option Explicit
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim insertPath As String
Dim longstatus As Long
‘ 1. SolidWorksアプリケーションの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 安全装置:今開いているのがアセンブリかチェック
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbCritical
Exit Sub
End If
Set swAssm = swModel
‘ 2. 挿入するサブアセンブリのパスを指定(※実環境に合わせて変更してください)
insertPath = “C:\MySolidWorksData\SubAssembly_UnitA.sldasm”
‘ 3. サブアセンブリを動的に挿入(原点 [0, 0, 0] に配置)
‘ ※AddComponent4 または AddComponent5 を使用するのがモダンなアプローチです
Set swComp = swAssm.AddComponent5(insertPath, _
CInt(0), _ ‘ 参照コンフィギュレーション(空文字ならデフォルト)
“”, _
False, _ GfxData の有無
“”, _ コンフィギュレーション名
0#, 0#, 0#) ‘ X, Y, Z 座標
If swComp Is Nothing Then
MsgBox “サブアセンブリの挿入に失敗しました。パスを確認してください。”, vbCritical
Exit Sub
End If
‘ 変更を反映するためにモデルを再構築
swModel.EditRebuild
‘ 4. 挿入したサブアセンブリの基準面と、メインアセンブリの基準面で「一致(Coincident)」合致を作成する
‘ ここがプログラミングの醍醐味!
Call DefineMates(swModel, swComp)
MsgBox “サブアセンブリの挿入と合致の定義が完了しました!”, vbInformation
End Sub
‘ ==============================================================================
‘ 補助プロシージャ:合致(Mate)をプログラムから定義する
‘ ==============================================================================
Sub DefineMates(swModel As SldWorks.ModelDoc2, swComp As SldWorks.Component2)
Dim swMateFeat As SldWorks.Feature
Dim errCode As Long
‘ 【重要】合致を追加するには、あらかじめ合致させたいエンティティ(面や線)を選択状態にする必要があります
‘ ここでは分かりやすく、メインアセンブリの「上面」とサブアセンブリ側の「上面」を選択して一致させます
‘ 選択をクリア
swModel.ClearSelection2 True
‘ メインアセンブリ側の平面(例: “上側” 平面)を選択
‘ ※Trueを渡すことで、選択を「追加(Append)」していきます
Dim bRet As Boolean
bRet = swModel.Extension.SelectByID2(“上側”, “PLANE”, 0, 0, 0, True, 1, Nothing, 0)
‘ サブアセンブリ内部の面や平面を選択する場合、コンポーネント経由で名前を指定します
‘ 例として、サブアセンブリ側にある “BasePlane” という名前の平面を選択
Dim subCompName As String
subCompName = swComp.Name2 ‘ アセンブリ内でのコンポーネント名(例: SubAssembly_UnitA-1)
bRet = swModel.Extension.SelectByID2(“BasePlane@” & subCompName, “PLANE”, 0, 0, 0, True, 1, Nothing, 0)
‘ 選択された2つのエンティティに対して「一致 (swMateCOINCIDENT)」合致を作成
Set swMateFeat = swAssm_AddMate(swModel, 0, 0, False, 0, 0, 0, 0, 0, 0, 0, errCode)
‘ ※注:実際のMate追加関数は環境やバージョンで引数が長いため、
‘ 基本的な考え方として「SelectByID2で対象をマークし、AddMateで縛る」と覚えてください。
swModel.ClearSelection2 True
End Sub
‘ 簡易ラッパー(AddMateのダミー定義ではなく、実際のSolidWorks APIのシグネチャに合わせるか、
‘ またはマクロ記録から生成される swAssemblyDoc.AddMate3 を利用してください)
—
3. コードのキモを徹底解説!ここが分かれば怖くない
上記のコードで、特に重要なポイントを3つに絞って解説します。ここさえ押さえれば、あなたもSolidWorks APIの構造が手に取るようにわかるようになります。
① `AddComponent5` の威力
昔のAPIでは `AddComponent` が使われていましたが、モダンな環境では引数が整理された `AddComponent5` が推奨されます。
挿入したいファイルのフルパスを渡すだけで、SolidWorksが裏側でファイルをロードし、指定したXYZ座標にポンと置いてくれます。戻り値として `Component2` オブジェクトが返ってくるのがミソです。このオブジェクトが、後から位置をいじったり名前を取得したりするときの「リモコン」になります。
② 階層構造(コンポーネント名)の指定ルール
ここが一番のハマりどころです!
メインアセンブリから見て、「サブアセンブリの中にある部品や面」を指定するときは、名前に「`@コンポーネント名`」というアットマーク以降のサフィックス(接尾辞)を付与する必要があります。
- メインの平面:「`上側`」
- サブアセンブリ内の平面:「`BasePlane@SubAssembly_UnitA-1`」
この「誰の子供なのか」を表す階層構造の文字列ルールをマスターすると、複雑なアセンブリでも自由自在にコントロールできるようになります。
③ 「選択(Select)」してから「操作(Action)」する基本原則
SolidWorks APIの合致や編集機能の多くは、「人間が画面上でカチカチと要素を選ぶ動作」をコードで再現するという設計思想で作られています。
したがって、合致をつける前には必ず `SelectByID2` メソッドを使って、対象の面や軸をメモリ上で「選択状態」にする必要があります。
—
4. 現場でよくあるエラーと回避の知恵袋
- エラー:「ファイルが見つかりません」と言われる
- 原因: VBA内のファイルパスに全角スペースが含まれていたり、ネットワークドライブのパス(`\\server\…`)で接続が不安定だったりします。
- 対策: `Dir()` 関数などで事前にファイルの存在確認(`If Dir(insertPath) = “” Then …`)を行うガード節を必ず入れましょう。
- エラー:合致が「エラー(警告)」で赤くなる
- 原因: すでに過拘束(Over-defined)になるような合致をプログラムが無理やり適用しようとした場合に発生します。
- 対策: 手動で一度アセンブリを組み上げてみて、「どの面とどの面をくっつければ自由度がゼロになるか(完全定義になるか)」をロジカルに設計してからコードに落とし込んでください。
—
まとめ:ここをクリアすればSolidWorks VBAの基本はバッチリ!
今回は、サブアセンブリの動的挿入と、階層構造を意識したコンポーネント制御の核心に迫りました。
1. ファイルの読み込みとインスタンス配置は `AddComponent5` で一撃。
2. 下位階層の要素を指定するときは `@コンポーネント名` の魔術を使う。
3. 合致は「選択してから実行する」のがAPIの基本ルール。
この3つさえ血肉になれば、何百点もある大型アセンブリの自動構築であっても、恐れることは何もありません。あなたの設計業務を劇的に効率化する強力な武器になるはずです。
「ここがうまく動かない」「こういう複雑なアセンブリはどう組むの?」といった疑問があれば、いつでも先輩エンジニアに聞いてくださいね。それでは、次回の実践的な自動化テクニックもお楽しみに!
