【テクニカル・上級編】【デバッグ技術】FileSystemObject(FSO)とログファイル出力クラスを用いた、大規模パーツ生成マクロの完全実行トレーシング – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks API自動化の「闇」を照らす:堅牢なトレーシング基盤の設計思想

SolidWorksのAPIを用いた大規模な自動生成処理において、イミディエイトウィンドウに頼り切ったデバッグは、もはや「素人の遊び」に過ぎない。数千回に及ぶフィーチャ生成、コンフィギュレーションの切り替え、アセンブリへの統合。これらが連鎖するプロセスで発生する「稀な例外」を、我々アーキテクトは決して看過してはならない。

本稿では、レガシーなVBA環境下で、極限までメモリ消費を抑えつつ、システムの「鼓動」を可視化するロギング基盤の設計手法を伝授する。

なぜ、標準のデバッグ機能では不十分なのか

SolidWorks APIの呼び出しは、COM経由のプロセス間通信であり、非常に重い。特に`ModelDoc2`オブジェクトのメモリリークや、`Dispatch`ポインタの解放漏れは、処理時間が長引くほど致命的なスタックオーバーフローやメモリ不足を招く。

イミディエイトウィンドウは揮発性であり、SolidWorksがクラッシュすれば情報は消滅する。我々に必要なのは、「何が起きたか」だけでなく「どのステップでメモリが飽和し、どのAPIが死のトリガーを引いたか」を追跡できる、永続的な実行ログである。

究極のログ出力クラス:`Logger`の実装

FileSystemObject (FSO) を活用し、クラスモジュールとして設計する。ここで重要なのは、「ログ出力自体がシステムのボトルネックにならないこと」である。

クラスモジュール:`clsLogger`

‘ 必要な参照設定: Microsoft Scripting Runtime
Option Explicit

Private fso As FileSystemObject
Private logFile As TextStream
Private filePath As String

Private Sub Class_Initialize()
Set fso = New FileSystemObject
‘ ログファイルは日付単位で自動生成させる
filePath = ThisWorkbook.Path & “\Log_” & Format(Date, “yyyyMMdd”) & “.log”
End Sub

‘ ログ書き込みメソッド:バッファリングを意識した設計
Public Sub WriteLog(ByVal message As String)
On Error Resume Next ‘ ログ書き込みでメイン処理を止めない
Set logFile = fso.OpenTextFile(filePath, ForAppending, True)
logFile.WriteLine “[” & Now & “] ” & message
logFile.Close
Set logFile = Nothing
End Sub

Private Sub Class_Terminate()
Set fso = Nothing
End Sub

大規模生成における「ライフサイクル管理」の極意

単にログを出すだけでは片手落ちだ。SolidWorks APIの真髄は、オブジェクトの生存期間(ライフサイクル)を、明示的なスコープで制御することにある。

以下のコードは、フィーチャ生成時に発生しがちな「メモリの澱(おり)」を排除するための構造だ。

Sub GenerateComplexPart()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim logger As New clsLogger

Set swApp = Application.SldWorks
logger.WriteLog “処理開始: パーツ生成シークエンス”

On Error GoTo ErrorHandler

‘ 処理単位でスコープを区切り、明示的に解放する
Call ProcessGeometry(swApp, logger)

logger.WriteLog “処理正常終了”
Exit Sub

ErrorHandler:
logger.WriteLog “CRITICAL ERROR: ” & Err.Description
‘ SolidWorksオブジェクトの再構築やクリーンアップ処理をここに記述
End Sub

Private Sub ProcessGeometry(swApp As SldWorks.SldWorks, logger As clsLogger)
‘ 複雑なフィーチャ生成処理
‘ …
logger.WriteLog “フィーチャ生成完了: ID-001”

‘ 重要: ループ内では必ずオブジェクトをNothingにして解放する
‘ これを怠ると、SolidWorksプロセスは数時間で沈黙する
End Sub

シニアエンジニアが押さえるべき「3つの鉄則」

1. FSOのオーバーヘッドを最小化する

ログ出力の頻度が極端に高い場合は、毎回 `OpenTextFile` を行うのではなく、モジュールレベルで `TextStream` を開いたまま保持し、`Write` メソッドのみを呼ぶ設計に変更せよ。ただし、エラー時にファイルがロックされたままになるリスクがあるため、`Class_Terminate`での確実な `Close` が必須だ。

2. Windows APIによる「生存確認」

SolidWorksがハングアップしているのか、処理が進行中なのか。これを判別するために、`kernel32` の `Sleep` 関数や、プロセスIDからハンドルを取得するAPIを組み合わせることで、フリーズ検知機能を持たせることが可能だ。

3. メモリの最適化:`DoEvents`の罠

多くのプログラマーが安易に `DoEvents` をループ内に挿入するが、これはSolidWorksの再描画負荷を高め、処理を著しく遅延させる。ログ出力のタイミングで「最小限」に抑えるのがプロの流儀である。

結びに代えて

SolidWorks VBAによる自動化は、単なるスクリプトではない。それは「CADという巨大なブラックボックス」を制御するエンジニアリングである。

ログファイルは、あなたの書いたコードが戦場(実行環境)でどのように振る舞ったかを記録する、唯一の「証人」だ。この基盤を構築した瞬間から、あなたは「コードを書く人間」から「システムを支配するアーキテクト」へと脱皮する。

さあ、イミディエイトウィンドウの砂遊びは卒業し、堅牢なトレースログと共に、真の自動化へ足を踏み入れるがいい。

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