SolidWorks VBAの「闇」を照らす:ミリ秒単位のボトルネック可視化テクニック
こんにちは。SolidWorksの自動化の世界へようこそ。
「マクロを実行したら、画面がフリーズしたまま数分間動かない……」
「どこで時間がかかっているのか分からないまま、ただ祈るように待つしかない」
そんな経験はありませんか?もしあなたが「マクロの記録」から一歩踏み出し、大規模なパーツ生成を自動化しようとしているなら、避けて通れないのが「処理のブラックボックス化」という壁です。
今日は、伝説的なアーキテクトが現場で必ず仕込む、「ミリ秒単位の計測ログ基盤」の作り方を伝授します。これさえあれば、コードのどこがボトルネックなのかが一目瞭然になります。
—
1. なぜ「計測」が必要なのか?
SolidWorksのAPIは強力ですが、フィーチャの再構築(Rebuild)は非常に重い処理です。特に複雑なスイープや複雑なスケッチ計算が絡むと、コードの1行が数秒のラグを生むこともあります。
闇雲に高速化しようとするのは、暗闇で針を探すようなもの。まずは「どこで何ミリ秒溶けているのか」をデータ化しましょう。
—
2. 準備:FileSystemObject(FSO)でログを刻む
VBA標準の `Debug.Print` はイミディエイトウィンドウに出力されますが、実行後に消えてしまうのが難点です。そこで、FileSystemObject (FSO) を使い、ローカルフォルダにテキスト形式でログを吐き出させます。
実装コード:計測用クラスの雛形
まずは、モジュールに以下のコードを貼り付けてみてください。
‘ 必要なライブラリ:Microsoft Scripting Runtime (参照設定で追加してください)
Option Explicit
Dim fso As New FileSystemObject
Dim logFile As TextStream
Dim startTime As Double
‘ ログファイルのパス(デスクトップなどに適宜変更してください)
Const LOG_PATH As String = “C:\Temp\SolidWorks_Log.txt”
‘ — 処理開始 —
Public Sub StartMeasurement()
Set logFile = fso.OpenTextFile(LOG_PATH, ForAppending, True)
logFile.WriteLine “— 処理開始: ” & Now & ” —”
startTime = Timer
End Sub
‘ — 経過時間計測 —
Public Sub MarkPoint(stepName As String)
Dim currentTime As Double
currentTime = Timer
‘ 経過時間をミリ秒単位で計算
Dim elapsed As Double
elapsed = (currentTime – startTime) 1000
logFile.WriteLine “[” & stepName & “] 経過: ” & Format(elapsed, “0.00”) & ” ms”
‘ 次の計測のためにリセットしない(累積時間を追うため)
End Sub
‘ — 処理終了 —
Public Sub EndMeasurement()
logFile.WriteLine “— 終了: ” & Now & ” —” & vbCrLf
logFile.Close
End Sub
—
3. 実践:ボトルネックを見つけるデバッグ術
では、実際のフィーチャ生成処理にこの計測器を組み込んでみましょう。
Sub CreateComplexPart()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
StartMeasurement ‘ 計測開始
‘ 1. パーツ作成
swApp.NewDocument “Part”, “”, 0, 0
MarkPoint “パーツ新規作成完了”
‘ 2. 重いスケッチ処理
‘ ここにスケッチ生成コードが入るとします
MarkPoint “スケッチ生成完了”
‘ 3. フィーチャ(ボス押し出しなど)の構築
‘ ここが一番時間がかかるはず!
MarkPoint “ボス押し出し実行完了”
EndMeasurement ‘ 計測終了
MsgBox “計測完了!ログを確認してください。”
End Sub
この手法がなぜ最強なのか?
- 視覚化: ログをExcelで開けば、どのステップが飛び抜けて遅いかグラフ化できます。
- 非破壊: イミディエイトウィンドウを汚さず、永続的な記録として残せます。
- 心理的安全性: 「どこが悪いか分かっている」という状態は、エンジニアにとって最高の精神安定剤です。
—
4. 陥りやすい罠:ここだけは注意!
初学者がよくやるミスは、「計測コード自体が重くなる」ことと「無駄な再構築」です。
1. `ModelDoc2.ForceRebuild3` の連打:
ループ内で何度も再構築を呼んでいませんか?計測ログを見れば、再構築のたびに時間が跳ね上がっているのが分かるはずです。`AutoSolve` を一時的にオフにするなどの最適化が必要なサインです。
2. `Timer` 関数の精度:
`Timer` 関数は1秒未満の精度が環境に依存するため、厳密なミリ秒計測には `GetTickCount` API関数を使うのがプロの流儀です。
—
最後に:先輩からのアドバイス
「コードが遅い」と感じたとき、あなたはどこを直そうとしますか?勘に頼ってリファクタリングを繰り返すのは、もう終わりにしましょう。
「計測できないものは改善できない」
これがエンジニアリングの鉄則です。この計測基盤をあなたのマクロに組み込み、ログを眺めてみてください。きっと、これまで見えなかった「処理の呼吸」が聞こえてくるはずです。
ここをクリアすれば、あなたはもうただの「マクロを書く人」ではありません。「SolidWorksを意のままに操る自動化アーキテクト」への第一歩を踏み出したのです。
何か詰まったら、いつでも聞いてくださいね。応援しています!
