SolidWorks VBAの「負の遺産」を浄化せよ:2010以前のコードを2024仕様へ進化させる極意
こんにちは。SolidWorksの世界で、かつて書かれた「動くけれど不安定なコード」と格闘しているエンジニアの皆さん。
マクロの記録から脱却し、自動化の扉を開こうとする姿勢、素晴らしいです。しかし、2010年以前の古いマクロをそのまま使うのは、例えるなら「化石燃料で走る旧式エンジン」を最新のF1マシンに無理やり載せるようなもの。動作の不安定さやメモリリークに悩まされるのは当然の結果です。
今日は、あなたの手元にある「レガシーマクロ」を、SolidWorks 2024で輝く「堅牢なプログラム」へと生まれ変わらせるための、エンジニアとしての知見を授けます。
—
1. なぜ「SelectByID」は卒業すべきなのか?
古いコードによくあるのが、以下の記述です。
‘ 【レガシー】かつての定番(現在は非推奨)
boolstatus = Part.SelectByID(“Face1”, “FACE”, 0, 0, 0)
このコードの何が問題か、わかりますか?
「名前(Face1)や座標(0,0,0)に依存している」点です。モデルが変更され、面が再構築(Rebuild)されるたびに、その面が本当に「Face1」という名前である保証はどこにもありません。
現代のスタンダード:ModelDocExtension.SelectByID2
現代のSolidWorks APIでは、より正確に、かつ安全にオブジェクトを特定する手法が求められます。
‘ 【モダン】確実な選択処理
Dim swModelDocExt As ModelDocExtension
Set swModelDocExt = swModel.Extension
‘ 戻り値を利用し、選択成功を確実に判定する
Dim bRet As Boolean
bRet = swModelDocExt.SelectByID2(“Face1”, “FACE”, 0, 0, 0, False, 0, Nothing, swSelectOptionDefault)
ここで重要なのは、`swModelDocExt`というインターフェースを介すことです。これはAPIの設計思想が「ドキュメント操作(ModelDoc)」から「拡張機能(Extension)」へと進化していることを意味します。
—
2. 実践:レガシーコードを2024仕様へ書き換える3ステップ
古いマクロを保守する際、以下の3ステップを意識するだけで、コードの安定性は劇的に向上します。
ステップ1:オブジェクトの明示的な型定義
`Dim Part As Object` と書いていませんか? これがエラーの元凶です。
`Object`型は実行時に型を判定するため、パフォーマンスが低下し、予期せぬ挙動を生みます。
【修正前】
`Dim Part As Object`
【修正後】
`Dim swModel As SldWorks.ModelDoc2`
`Dim swPart As SldWorks.PartDoc`
ステップ2:不要な再描画の抑制
古いマクロは、処理のたびに画面を更新しようとしてフリーズしがちです。これを防ぐのが「処理のロック」です。
‘ 処理開始時に画面更新を止める
swApp.UserControl = False
swModel.ViewZoomtofit2
‘ 処理終了後に戻す
swApp.UserControl = True
ステップ3:戻り値(Boolean)の厳格なチェック
「とりあえず動けばいい」ではなく、「失敗したらなぜ失敗したか」をログに残す姿勢が、プロの自動化エンジニアです。
—
3. リファクタリングの実践例(パーツの面を選択するコード)
実際に、古いコードを現代版に書き換えた例を見てみましょう。
Sub ModernSelectFace()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Exit Sub
Set swExt = swModel.Extension
‘ 選択のクリア(これを忘れると以前の選択が残り、バグの温床になります)
swModel.ClearSelection2 True
‘ 2024仕様のSelectByID2
‘ 最後の引数に「swSelectOptionDefault」を指定し、確実に選択を行う
Dim bRet As Boolean
bRet = swExt.SelectByID2(“”, “FACE”, 0, 0, 0, False, 0, Nothing, swSelectOptionDefault)
If bRet Then
Debug.Print “面を選択しました。”
Else
Debug.Print “選択に失敗しました。モデルの状態を確認してください。”
End If
End Sub
—
最後にお伝えしたいこと:エラーは「設計のヒント」
「型ミスマッチ」や「メソッドが見つかりません」というエラーが出たら、それはあなたのコードが間違っているのではなく、SolidWorksという巨大なシステムの「最新の作法」に合わせるチャンスです。
1. Object型から卒業する(インターフェースを明記する)
2. Extensionを活用する(直接操作ではなく、窓口を通す)
3. 選択状態を管理する(ClearSelection2を使いこなす)
この3つを意識するだけで、あなたのマクロは今日から「レガシーな遺物」から「現場を救う強力なツール」へと進化します。
もし、さらに深い設計(FeatureManagerの走査や、アセンブリ内のコンポーネント操作など)で躓いたら、いつでも相談してください。SolidWorksの内部構造を知り尽くした先には、もっと快適な自動化の世界が待っていますよ。
さあ、古いコードを一つずつ書き換えて、自分だけの最強のツールボックスを作り上げましょう!
