【入門編】【初心者向け】マクロ記録機能の限界を知る!アセンブリ自動化で自作コードを書くべき理由と基本設計 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは。SolidWorks VBAの深淵へようこそ。

マクロ記録ボタンを押し、アセンブリで部品を配置して合致を付ける――。
生成されたコードを見て「よし、これで自動化ができる!」と意気揚々と実行したのに、二度目の実行ではエラーで止まったり、全く違う場所に部品が飛んでいったりした経験はありませんか?

それはあなたが悪いのではありません。マクロ記録機能の「限界」に触れただけなのです。

今日は、記録されたコードを卒業し、プロフェッショナルな「設計」としてのVBAコードを書くための第一歩を踏み出しましょう。「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」という急所を、丁寧に紐解いていきます。

—

1. なぜ「マクロ記録」のコードは動かなくなるのか?

マクロ記録が生成するコードの主役は、いつも `SelectByID2` というメソッドです。

‘ マクロ記録がよく出すコードの例
boolstatus = swModel.Extension.SelectByID2(“Point1@Part1-1@Assem1”, “EXTSKETCHPOINT”, 0, 0, 0, False, 0, Nothing, 0)

この一行には、実は「自動化を壊す3つの罠」が潜んでいます。

1. 名前の固定化: `”Part1-1@Assem1″` という名前がコードに書き込まれます。部品をもう一つ追加して `”Part1-2″` になったり、アセンブリ名を変えた瞬間に、このコードは対象を見失います。
2. 座標の依存: 記録時のクリック座標(0, 0, 0など)が含まれますが、形状が変わるとその位置にターゲットがいなくなることがあります。
3. 選択の不安定さ: 「今、画面上で何が選択されているか」という状態に依存するため、少しでも前提が狂うとエラーになります。

「名前で探す」のではなく「オブジェクト(実体)を掴む」。 これが記録脱却の第一歩です。

—

2. 脱・記録!アセンブリ自動化の基本戦略

堅牢なプログラムを書くために、私たちは「名前」に頼らず、以下のステップでコードを組み立てます。

1. Componentオブジェクトを取得する: 追加した部品そのものを変数に代入する。
2. エンティティ(面や面)を直接取得する: 部品が持つ「正面」や「原点」を、名前ではなく内部的なポインタで指定する。
3. Select4で選択する: 画面上のクリックを模倣するのではなく、プログラムから直接「これを選択状態にする」と命令する。

それでは、実際に動くコードを見てみましょう。

—

3. 【実践】部品を挿入して原点同士で合致させる

このコードは、新規アセンブリに指定した部品を挿入し、アセンブリの原点と部品の原点を「一致」で拘束する、極めてクリーンな設計例です。

Option Explicit

Sub SolidWorksAssemblyAutomation()
‘ — 1. 定義と接続 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swConfMgr As SldWorks.ConfigurationManager
Dim swConf As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
Dim swInsertedComp As SldWorks.Component2

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

‘ アセンブリが開かれているかチェック
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリファイルを開いた状態で実行してください。”
Exit Sub
End If

Set swAssy = swModel

‘ — 2. 部品の挿入 —
‘ 挿入したい部品のフルパスを指定(環境に合わせて書き換えてください)
Dim partPath As String
partPath = “C:\Temp\SamplePart.sldprt”

‘ AddComponent5 を使用:名前ではなく「オブジェクト」として部品を受け取る
‘ 引数: パス, オプション, インスタンス名, 座標X, Y, Z
Set swInsertedComp = swAssy.AddComponent5(partPath, swAddComponentConfigOptions_CurrentSelectedConfig, “”, False, “”, 0, 0, 0)

If swInsertedComp Is Nothing Then
MsgBox “部品の挿入に失敗しました。パスを確認してください。”
Exit Sub
End If

‘ — 3. 合致のための選択 (SelectByID2を使わないテクニック) —
‘ 部品とアセンブリの「原点」を選択します。
‘ 実は、原点や平面は “Origin@部品名” という指定が必要ですが、
‘ GetModelDoc2経由で安全に選択する方法をとります。

swModel.ClearSelection2 True

‘ A. アセンブリ側の原点を選択
‘ アセンブリの原点は名前が固定的なので Extension.SelectByID2 を使いますが、
‘ 自身のモデル(swModel)に対して行うので安全です。
swModel.Extension.SelectByID2 “Origin”, “EXTSKETCHPOINT”, 0, 0, 0, True, 0, Nothing, 0

‘ B. 挿入した部品側の原点を選択
‘ ここがポイント!部品のインスタンス名を取得して動的に名前を合成します。
Dim compName As String
compName = swInsertedComp.Name2
swModel.Extension.SelectByID2 “Origin@” & compName, “EXTSKETCHPOINT”, 0, 0, 0, True, 0, Nothing, 0

‘ — 4. 合致(Mate)の定義 —
Dim swMate As Mate2
Dim longErrors As Long

‘ AddMate5: プロフェッショナルが愛用する合致メソッド
‘ 一致(swMateCOINCIDENT=0), 位置合わせ(swMateAlignALIGNED=1)
Set swMate = swAssy.AddMate5(swMateCOINCIDENT, swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, longErrors)

swModel.ClearSelection2 True
swModel.EditRebuild3

MsgBox “自動配置が完了しました!これがオブジェクト操作の力です。”
End Sub

—

4. ここが「掌握」のポイント

コードの中で特に重要な部分を解説します。

AddComponent5 の戻り値

マクロ記録では単に「コマンドを実行した」という記録しか残りませんが、自作コードでは `Set swInsertedComp = …` とすることで、挿入した部品へのアクセス権(ハンドル)を即座に確保しています。これにより、その部品が何という名前になっても、後続の処理で確実に追いかけることができます。

動的な名前の合成

`”Origin@” & compName` という書き方に注目してください。
アセンブリ内での部品名は、2個目、3個目と増えるたびに `Part-1`, `Part-2` と変化します。`swInsertedComp.Name2` を使ってその時のリアルな名前を取得し、合致対象の名前を動的に作ることで、「名前が変わってエラーになる」というマクロ記録最大の弱点を克服しています。

AddMate5 の堅牢さ

`AddMate5` は非常に多機能ですが、初めは「どの定数がどの合致に対応するか」を意識するだけで十分です。第1引数に `swMateCOINCIDENT`(一致)や `swMateCONCENTRIC`(同心円)を入れることで、あらゆる合致を自由自在に操れます。

—

最後に:マクロ記録は「辞書」として使おう

マクロ記録を完全に否定する必要はありません。
「この操作、APIでは何ていう名前のメソッドなんだろう?」と思ったときに記録ボタンを押し、出てきたメソッド名(今回の例なら `AddMate5` など)をGoogleやヘルプで調べるための「辞書」として使うのが、最も賢いエンジニアの姿です。

今回紹介した「オブジェクトを掴んで操作する」という感覚に慣れてくれば、SolidWorks VBAの世界は一気に広がります。次は、特定の「面」を自動で探すロジックなどに挑戦してみるのも面白いでしょう。

一歩ずつ、確実に。あなたの設計業務が劇的に効率化される日を楽しみにしています。応援していますよ!

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