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

スポンサーリンク

マクロ記録の「死」を乗り越えろ:SolidWorksアセンブリ自動化の深淵

多くのエンジニアがSolidWorksの自動化を志す際、最初に触れるのが「マクロ記録」だ。しかし、断言しよう。マクロ記録は「開発の補助ツール」ではなく「APIの書き方を学ぶための使い捨ての教材」に過ぎない。

実務レベルのアセンブリ構築において、マクロ記録の出力コードをそのまま流用しているようでは、いつか必ず「モデルのコンテキスト変化」という地獄を見る。本稿では、レガシーなVBA環境を極限まで使い倒し、堅牢で高速なアセンブリ自動化システムを構築するためのアーキテクチャを伝授する。

—

1. なぜ「SelectByID2」を捨て去るべきなのか

マクロ記録が生成するコードの9割は `SelectByID2` に依存している。これは「ユーザーが画面上でクリックした箇所をシミュレートする」という設計思想に基づいているからだ。

しかし、大規模なアセンブリにおいて「名前による選択」は脆い。部品名が変更されたり、コンフィギュレーションが切り替わったりした瞬間にコードは沈黙する。

真のエンジニアは「ポインタ」を追いかける

堅牢なコードを書くための鉄則は、選択(Select)に頼らず、`IComponent2` インタフェースを直接取得することにある。

‘ 堅牢なコンポーネント取得の極意
Public Function GetCompByName(swAssy As SldWorks.AssemblyDoc, compName As String) As SldWorks.Component2
Dim swModel As SldWorks.ModelDoc2
Set swModel = swAssy

‘ 名前による選択ではなく、コンポーネントのトラバーサル(探索)を行う
Dim swRootComp As SldWorks.Component2
Set swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)

Set GetCompByName = RecursiveFindComponent(swRootComp, compName)
End Function

このように、アセンブリツリーを再帰的に探索し、一意のIDを持つオブジェクトに直接アクセスすることで、UIのステート(選択状態)に依存しない完全なロジックを構築できる。

—

2. メモリ最適化:オブジェクトの「死」を管理せよ

VBAのガーベッジコレクションは非常に怠惰だ。SolidWorksの巨大なAPIオブジェクト(`ModelDoc2` や `Component2`)を生成し続け、解放しないままループを回せば、数千行の処理でSolidWorksは必ずクラッシュする。

究極のメモリ解放術

オブジェクトへの参照を使い終わったら、即座に `Nothing` を代入せよ。 また、アセンブリ構築後は `swModel.ForceRebuild3` を最小限に留めるのが、パフォーマンス維持の極意だ。

‘ オブジェクト管理のベストプラクティス
Sub OptimizeAssemblyTask()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ … 処理 …

‘ ループ処理の最後で確実に解放する
Set swComp = Nothing
Set swMate = Nothing

‘ 最後にメモリの断片化を抑制する工夫
‘ 大規模処理なら DoEvents を挟むのも一つの手だが、
‘ 基本はオブジェクトのスコープを最小に絞ること。
End Sub

—

3. 合致(Mate)定義の自動化:座標系への回帰

アセンブリ構築において、最もエラーが起きやすいのが「合致の作成」だ。マクロ記録のコードは「面」を名前で指定しようとするが、面名はモデルのリビルドで容易に変わる。

シニアレベルの自動化では、「参照ジオメトリ(座標系や平面)」をコンポーネント内に仕込んでおき、それをAPI経由でバインドする手法を推奨する。

‘ 座標系による安定した合致定義の概念
Dim swMateFeature As SldWorks.Feature
‘ 選択セットをクリアし、明示的にエンティティを指定して合致を作成する
swAssy.AddMate5 swMateType_COINCIDENT, swMateAlign_ALIGNED, False, 0, 0, _
faceEntity1, faceEntity2, 0, 0, 0, 0, False, False, False, 0, swMateError

`AddMate5` などの高位APIを使用する際、あらかじめ `GetEntityByName` 等で取得した `Entity` オブジェクトを直接渡すのが、最も低レイヤーで失敗の少ないアプローチだ。

—

4. レガシー環境とシステム連携の極致

社内システム(PDMやERP)から部品構成表(BOM)を読み込み、自動でアセンブリを生成する場合、VBA単体では限界がある。ここで Windows API (`User32.dll`) を使い、SolidWorksのウィンドウハンドルを制御したり、`FileSystemObject` を使った高速なファイルパス検証を組み合わせることで、システムの堅牢性は飛躍的に向上する。

最後に:自動化とは「思考のコード化」である

マクロ記録を信じるな。SolidWorks APIのヘルプ(chm/web)に記された「インターフェースの継承関係」を熟読せよ。

  • ModelDoc2 を軸に、
  • Component2 で構成を把握し、
  • Feature で合致を制御する。

この3層構造を理解した時、君のアセンブリ自動化は「単なるスクリプト」から「堅牢なエンジニアリング・システム」へと進化を遂げるはずだ。

もし、貴殿のシステムが数万点の部品を扱うレベルにあるなら、次は `InProcess` なVBAを捨て、`C# + SolidWorks API` による外部DLL連携へ移行する準備を始めるべきだ。その時、このVBAの経験がすべて「正解」として結実するだろう。

さあ、コードを書け。画面の中の「記録」を消し去り、ロジックを刻み込むのだ。

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