こんにちは!チーフアーキテクトの私です。
現場で何年も動き続けているSolidWorksのマクロ(VBA)を開いてみて、「うわっ、なんだこのスパゲッティコードは……しかも、一部の処理がやけに遅い、あるいは突然フリーズするぞ」と頭を抱えた経験はありませんか?
「マクロの記録」ボタンを押して出力されたコードや、ネットの古いフォーラムから拾ってきたコードをそのまま使い続けると、SolidWorksのバージョンアップのたびに動作が不安定になったり、巨大アセンブリの処理でメモリリークを引き起こしたりします。
今回は、「レガシーコードの近代化」をテーマに、古いSolidWorks APIの見つけ方と、それを爆速かつ堅牢に生まれ変わらせるリファクタリングの極意を、優しく、そして徹底的に解説していきます。
ここをクリアすれば、あなたのVBAスキルは「ただ動くレベル」から「プロのアーキテクトレベル」へと一気に飛躍しますよ!
—
1. なぜレガシーコードは「悪」なのか?
SolidWorks APIの歴史は長く、何世代も前のバージョンから引き継がれてきた古いメソッド(関数や手続き)が、互換性のために一応残されています。しかし、これらは「動作が重い」「予期せぬエラー(特にNULL参照落ち)を引き起こしやすい」「最新のフィーチャー構造に対応していない」という爆弾を抱えています。
特に、「マクロの記録」をそのまま貼り付けたコードは、画面の描画更新(Redraw)やアクティブドキュメントへの過剰な依存が多く含まれており、大規模なモデルを扱う現場では致命的なパフォーマンス低下を招きます。
—
2. 駆逐すべき「3大レガシーパターン」
まずは、あなたの手元のコードに以下の古い書き方が残っていないかチェックしてみましょう。
1. `SldWorks.ActivateDoc` や `SldWorks.DocumentVisible` の乱用
- → ウィンドウをアクティブにしたり切り替えたりする処理は、SolidWorksにとって非常に重い負荷です。バックグラウンド処理(非アクティブのまま操作)に書き換えるべきです。
2. 型を明示しない `As Object` や `Variant` の多用
- → 実行時バインディングになり、IDE(VBAエディタ)の補効が効かないだけでなく、実行速度が低下します。
3. エラーハンドリング(`On Error Resume Next`)の安易な放置
- → バグを隠蔽し、オブジェクトが解放されないままメモリリーク(ゾンビプロセス化)を引き起こす主原因です。
—
3. 【実践】レガシーコードをモダンに書き換える
百聞は一見に如かず。実際に「古くて遅いコード」を「美しく堅牢なモダンコード」へリファクタリングするプロセスを見てみましょう。
悪い例:レガシーなマクロコード(リファクタリング前)
‘ 【アンチパターン】マクロの記録ベースの古いコード
Sub OldMacro()
Dim swApp As Object
Dim swDoc As Object
Set swApp = CreateObject(“SldWorks.Application”)
‘ アクティブなドキュメントを取得(不安定)
Set swDoc = swApp.ActiveDoc
‘ 画面を無理やりアクティブにする
swApp.ActivateDoc swDoc.GetTitle
‘ 古い選択メソッド
swDoc.Extension.SelectByID2 “Front Plane”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0
‘ 処理…
MsgBox “完了!”
End Sub
このコードは、`CreateObject` で毎回インスタンスを作ろうとしたり、`ActiveDoc` に依存していたりと、実務で使うには危なっかしい要素が満載です。
—
良い例:モダンで堅牢なAPIコード(リファクタリング後)
‘ 【推奨】型安全・高速・スマートなモダンコード
Option Explicit
Sub ModernMacro()
‘ 1. 適切な型宣言(事前バインディングによる高速化とインテリセンスの活用)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim boolstatus As Boolean
‘ 2. すでに起動しているSolidWorksのセッションを安全に取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 3. アクティブドキュメントを安全な型(ModelDoc2)で取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbExclamation
Exit Sub
End If
‘ 4. 画面描画のロック(爆速化のキモ!)
swModel.EnableRebuild3 False ‘ リビルドと画面描画を一時停止
On Error GoTo ErrorHandler
‘ — ここからメインの処理 —
‘ 例:フィーチャーマネージャーの操作や属性の取得など
Debug.Print “現在処理中のファイル: ” & swModel.GetPathName
‘ —————————-
‘ 5. 描画の復元
swModel.EnableRebuild3 True
MsgBox “モダン処理が正常に完了しました!”, vbInformation
Exit Sub
ErrorHandler:
‘ エラー発生時でも必ず描画ロックを解除する(これぞプロの技)
swModel.EnableRebuild3 True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
4. リファクタリングの3大キモ(ここを押さえろ!)
上記のモダンコードに盛り込んだ、プロエンジニア直伝の極意を解説します。
① `Application.SldWorks` の活用
外部から `CreateObject` するのではなく、すでに立ち上がっているセッションを正しく捉えることで、メモリの無駄遣いや二重起動を防ぎます。
② `EnableRebuild3` による描画・再計算の抑制
SolidWorksは、コード内でモデルを変更するたびに「画面の再描画(画面更新)」と「フィーチャーの再計算(リビルド)」を走らせようとします。これを処理の直前で `False` にし、処理が終わったら `True` に戻すだけで、処理速度が数倍〜数十倍に跳ね上がります。 これは大規模アセンブリを扱うなら必須のテクニックです。
③ エラー時のクリーンアップ処理
`On Error GoTo` を使って、万が一マクロの途中でエラーが起きた場合でも、必ず描画ロックを解除するように担保します。これを怠ると、SolidWorksの画面がフリーズしたまま固まる原因になります。
—
まとめ:古いコードの呪縛から脱却しよう
SolidWorks VBAの世界において、動くだけのコードは「技術的負債」の第一歩です。
古いAPIやマクロの記録をそのまま使うのをやめ、「適切な型宣言」「画面描画のコントロール」「堅牢なエラーハンドリング」を意識するだけで、あなたの書くコードは見違えるほど安定し、実務で頼りになる強力なツールへと生まれ変わります。
「ここをこう直したらもっと早くなるかな?」という探究心を大切に、ぜひ今日の業務から試してみてくださいね。あなたのAutomationライフが快適なものになるよう、応援しています!
