【入門編】【デバッグ技術】FileSystemObject(FSO)とイミディエイトウィンドウを駆使した、大規模パーツ生成マクロの実行時間計測ログ基盤 – SolidWorks VBA解析バイブル

スポンサーリンク

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を意のままに操る自動化アーキテクト」への第一歩を踏み出したのです。

何か詰まったら、いつでも聞いてくださいね。応援しています!

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