こんにちは!アセンブリ自動化の世界へようこそ。
マクロの記録ボタンを押してコードを出力する「初学者」のフェーズを抜け出し、いざ自分の手でスマートな自動化ツールを作ろうとすると、誰もが一度はぶ_ち当たる大きな壁があります。
それが「SolidWorksのバージョン違いによるAPIの仕様変更(メソッドの廃止や引数の追加)」です。
「昨日まで動いていたマクロが、SolidWorksのバージョンアップ(2023から2024へ、あるいは2025へ)を行ったら突然エラーで止まった……」
そんな経験はありませんか?
特に、アセンブリの命である「合致(Mate)」の定義を行う `AddMate` メソッドは、歴史的な背景もあり、バージョンによって `AddMate5` から `AddMate6` へと進化(あるいは仕様変更)を遂げています。複数の社内PCで異なるバージョンが混在している環境では、この違いを吸収する「ロバスト(堅牢)な互換性コード」を書けるかどうかが、プロのエンジニアの分かれ道です。
今回は、バージョン差異を華麗に乗りこなし、どの環境でも一発で動くアセンブリ自動化マクロの極意を、優しく丁寧にお伝えします。ここをクリアすれば、あなたのVBAスキルは実務中級へと確実にステップアップしますよ!
—
1. なぜAPIのバージョン違いでマクロが壊れるのか?
SolidWorksのAPI(Application Programming Interface)は、ソフトの進化とともに機能拡張を続けています。
合致(Mate)を例に取ると、初期のシンプルな「面と面の平行」などを設定していた時代から、より高度な拘束条件、マルチボディへの対応、エラーハンドリング用の戻り値の拡充などが行われてきました。
その結果、APIのメソッドも以下のように世代交代しています。
- `AddMate` (古い基本形)
- `AddMate5` (引数が追加され、より詳細な設定が可能に)
- `AddMate6` (最新の仕様やエラーコードを返すように最適化)
もし、あなたが古いバージョン(例:2021)で開発した `AddMate5` を使ったマクロを、最新の環境(例:2024や2025)で動かそうとしたとき、あるいはその逆を行ったとき、VBAは「そんなメソッド、または引数はありません!」(コンパイルエラー または 実行時エラー 438)と悲鳴を上げて止まってしまいます。
すべてのPCに全く同じバージョンのSolidWorksが入っていれば苦労しませんが、協力会社とのやり取りや社内の部署間移行期などでは、複数バージョンへの配慮が不可欠です。
—
2. マクロの記録から脱却する!合致追加の基本構造
まずは、APIで合致を追加する基本の形を見ておきましょう。
SolidWorks VBAにおいて、アセンブリに合致を定義するには `IAssemblyDoc::AddMate5`(または `AddMate6`)を使用します。
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
Dim swMateFeat As SldWorks.Feature
Dim lErr As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssm = swModel
‘ 【注意】以下はバージョン依存がある呼び出し方のイメージです
Set swMateFeat = swAssm.AddMate5( _
MateType:=1, _ ‘ 1 = swMatCV (一致/Coincident) など
Alignment:=0, _ ‘ 0 = swAlignENC (近接)
Flip:=False, _
Dist:=0, _
DistMax:=0, _
DistMin:=0, _
GearRatioNumerator:=1, _
GearRatioDenominator:=1, _
Angle:=0, _
AngleMax:=0, _
AngleMin:=0, _
LockRotation:=False, _
UseConditions:=0, _
ErrorStatus:=lErr _
)
非常に多くの引数を取るため、マクロの記録をそのまま貼り付けると長大なコードになり、メンテナンス性が最悪になります。これを整理しつつ、バージョン違いに対応する仕組みを組み込んでいきましょう。
—
3. 複数のバージョンをスマートに乗りこなす「互換性コード」の書き方
では、本題の互換性コードの構築方法です。
VBAには、C#やVB.NETのような強力な `#if` プリプロセッサ(条件付きコンパイル)によるバージョン分岐が標準では使いにくいため(※条件付きコンパイル引数を使えば可能ですが、実務では少し大掛かりになります)、もっとシンプルで確実なアプローチを取ります。
それが「実行時のエラー捕捉(On Error Resume Next)」または「型な遅延バインディング(あるいはバージョンチェック関数)」の活用です。
実務で最も安全かつ現実的な、バージョン差異を吸収するラッパー関数(自作関数)の書き方を見てみましょう。
実装サンプルコード
‘ ==============================================================================
‘ 互換性を保ちながら安全に合致を追加するラッパー関数
‘ ==============================================================================
Function SafeAddMate(swAssm As SldWorks.AssemblyDoc, _
mateType As Long, _
alignment As Long, _
flip As Boolean, _
dist As Double, _
ByRef errCode As Long) As SldWorks.Feature
Dim swFeat As SldWorks.Feature
‘ エラーハンドリングを有効化
On Error GoTo ErrorHandler
‘ まずは最新の仕様(AddMate6など)での実行を試みる
‘ ※環境によって存在しない場合はエラーになるため、トラップします
Set swFeat = swAssm.AddMate6(mateType, alignment, flip, dist, 0, 0, 1, 1, 0, 0, 0, False, 0, errCode)
Set SafeAddMate = swFeat
Exit Function
ErrorHandler:
‘ AddMate6が使えない古い環境(または仕様が変わった場合)のフォールバック
On Error GoTo OldVersionHandler
‘ AddMate5で再挑戦
Set swFeat = swAssm.AddMate5(mateType, alignment, flip, dist, 0, 0, 1, 1, 0, 0, 0, False, 0, errCode)
Set SafeAddMate = swFeat
Exit Function
OldVersionHandler:
‘ さらに古い環境、あるいは致命的なエラーの場合
MsgBox “お使いのSolidWorksのバージョンでは、この合致メソッドをサポートしていません。”, vbCritical
Set SafeAddMate = Nothing
errCode = -999
End Function
このコードが優れている理由
1. 落ちない仕組み(フォールバック): 最新のメソッドを試してみて、ダメなら自動的に一つ前の世代のメソッドへ切り替える(縮退運転)ため、マクロが突然停止するリスクを防げます。
2. 呼び出し側のクリーン化: メインの処理では `SafeAddMate` 関数を呼ぶだけで済むため、コードの見通しが劇的に良くなります。
3. エラーコードの集約: どのメソッドが使われた場合でも、`errCode` を通じてSolidWorksからのエラーステータスをキャッチできます。
—
4. 現場で陥りやすい罠とデバッグのコツ
互換性コードを実装する際、初学者が陥りやすい罠がいくつかあります。ここを押さえておけば完璧です。
- 罠1:選択状態(Seleection)のクリア忘れ
- `AddMate` を実行する直前に、合致させたいエンティティ(面やエッジ)が正しく選択されていなければなりません。APIを呼ぶ前に `IModelDocExtension::SelectByID2` などで確実にアタッチしているか、セレクションマネージャの状態をデバッグ(ローカルウィンドウで確認)してください。
- 罠2:エラーコード(lErr)の確認不足
- マクロが「成功したように見えて実は合致がついていない」というケースは、大抵 `ErrorStatus` の戻り値を確認していないことが原因です。`swAddMateError_e` の列挙体を参照し、戻り値が `0 (swAddMateError_NoError)` であることを必ずチェックする癖をつけましょう。
—
まとめ:ワンランク上のSolidWorks自動化エンジニアへ
今回は、SolidWorksアセンブリ自動化のキモである「合致の追加」におけるバージョン互換性の持たせ方を解説しました。
- APIのバージョンアップに伴うメソッド変更(`AddMate5` ➔ `AddMate6` など)は実務では避けて通れない。
- エラーハンドリング(`On Error`)を利用したフォールバック構造を作ることで、複数バージョンが混在する社内環境でも動くロバストなマクロが書ける。
- 自動化のコードは「動けばいい」ではなく、「環境が変わっても壊れない」メンテナンス性を意識する。
ここをクリアすれば、もう「マクロの記録」に頼りきりだった過去の自分とはおさらばです。どんな環境でもスマートに動く最強の自動化ツールを組んで、周囲をあっと言わせるような業務効率化を実現してくださいね。
あなたのVBAライフが、より知的で快適なものになりますように!
