【入門編】【実務中級】アセンブリのバージョン違いによるAPI仕様変更(AddMate5からAddMate6への移行など)に対応する互換性コードの書き方 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!アセンブリ自動化の世界へようこそ。
マクロの記録ボタンを押してコードを出力する「初学者」のフェーズを抜け出し、いざ自分の手でスマートな自動化ツールを作ろうとすると、誰もが一度はぶ_ち当たる大きな壁があります。

それが「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ライフが、より知的で快適なものになりますように!

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