【実務・中級編】【レガシー保守】SolidWorks 2010以前の古いAPI(SelectByID等)を最新のSolidWorks 2024対応コードへ完全リファクタリングする手順 – SolidWorks VBA解析バイブル

スポンサーリンク

葬り去られたレガシーを叩き直せ:SolidWorks 2010以前のコードを2024へ最適化する極意

SolidWorksのAPIは、この15年で劇的な進化を遂げた。しかし、現場の共有フォルダに眠る「先代が作ったマクロ」は、今なお2010年以前の旧態依然としたコードで溢れている。`SelectByID`を乱用し、エラー処理もままならないそれらのコードは、現代のSolidWorks 2024環境では「地雷」でしかない。

本稿では、レガシーコードを現代基準へ引き上げ、堅牢な自動化ツールへと昇華させるための「アーキテクトの思考法」を伝授する。

1. なぜ「古いコード」は動かなくなるのか?

多くのレガシーコードが抱える最大の癌は、「不確実な選択(Select)」と「グローバルオブジェクトへの過度な依存」だ。

  • SelectByIDの罠: 文字列によるオブジェクト指定は、UIの言語設定やモデルの構成に左右される。現代のAPIでは、`IModelDocExtension::SelectByID2` を正しく使い、かつ可能な限り「オブジェクト参照」を直接操作する設計が求められる。
  • 型ミスマッチ: 32bit時代の`Integer`型(16bit)が、64bit環境の`Long`型(32bit)と衝突するケースが多い。全てを`LongLong`や`LongPtr`で型安全に書き換えるのが鉄則だ。

2. リファクタリングの鉄則:3つのステップ

レガシーマクロを「プロダクション級」に変える手順は以下の通りだ。

1. Selection Managerを排除せよ: セレクションに頼るコードは、UIの表示状態に依存する不安定なコードだ。`Feature.Select2`や`Entity`オブジェクトを直接操作する手法へ切り替える。
2. `ModelDocExtension`への移行: `IModelDoc2`直下のメソッドではなく、`Extension`オブジェクトを介することで、処理速度と堅牢性が劇的に向上する。
3. エラーハンドリングの徹底: マクロの実行停止は業務の停止を意味する。`On Error GoTo`による局所的なガードは必須だ。

3. 実践:レガシーからの脱却コード例

以下は、古い`SelectByID`を排し、現代的な`Extension`を用いた「安全なフィーチャ選択と編集」のテンプレートだ。

‘ ———————————————————
‘ 現代的なSolidWorks APIによるフィーチャ操作のプロトタイプ
‘ ———————————————————
Option Explicit

Public Sub RefactoredFeatureEdit()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension
Dim swFeat As SldWorks.Feature

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

If swModel Is Nothing Then Exit Sub

‘ 1. Extensionオブジェクトを確立する
Set swExt = swModel.Extension

‘ 2. 名前による選択ではなく、フィーチャオブジェクトを直接取得する
Set swFeat = swModel.FeatureByName(“Boss-Extrude1”)

If Not swFeat Is Nothing Then
‘ 3. SelectByID2を適切に使用(False: 追加選択しない, 0: 未定義, Nothing: 選択タイプ)
‘ セレクションを行わず直接操作するのが最速だが、必要なら以下を使う
Dim status As Boolean
status = swExt.SelectByID2(“Boss-Extrude1”, “BODYFEATURE”, 0, 0, 0, False, 0, Nothing, swSelectOptionDefault)

If status Then
‘ 処理成功時のロジックをここに記述
Debug.Print “フィーチャを選択しました: ” & swFeat.Name
End If
Else
‘ 4. エラー処理の徹底
Err.Raise vbObjectError + 1001, “RefactoredFeatureEdit”, “指定のフィーチャが見つかりません。”
End If
End Sub

4. 業務自動化エンジニアとしての「魂の助言」

インターフェースの境界線を守れ

マクロ内で`swApp`を多用するな。クラスモジュールを作成し、`swModel`をプロパティとして保持する設計にせよ。これにより、ファイル単位での処理が独立し、データベース連携(CSV出力やSQL登録)を行う際にスパゲッティコード化することを防げる。

パフォーマンスの極意

`swModel.ViewZoomtofit2` などをループ内で実行していないか?
GUIの更新を抑制する `swApp.Frame.KeepAlive = False` や、再構築(Rebuild)を最小限にする `swModel.EditRebuild3` の使用タイミングを精査せよ。「画面を描画させない」ことこそが、自動化の最大の高速化である。

最後に

レガシーコードは「動けば良い」という時代の遺物だ。我々が書くべきは、5年後のチームメンバーが読み解き、拡張できる「資産」である。`SelectByID`の書き換えは、その第一歩に過ぎない。

このコードをベースに、あなたの開発環境を堅牢なものへと塗り替えてほしい。技術に魔法はない。あるのは、細部への徹底したこだわりと、設計への哲学だけだ。

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