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

スポンサーリンク

SolidWorks自動化の「ブラックボックス」を解明せよ:堅牢なログ出力で挑む大規模パーツ生成の極意

こんにちは。現場で泥臭い自動化を積み重ね、SolidWorksのAPIと対峙し続けてきたエンジニアです。

「マクロの記録」でコードを生成し、なんとなく動かして、たまに止まっては頭を抱える……そんな日々を過ごしていませんか?特に数千ものフィーチャを扱う大規模パーツや、ループ処理で何時間もかかるバッチ処理において、「どこで止まったか分からない」という状態はエンジニアにとって最大の悪夢です。

イミディエイトウィンドウは揮発性です。マクロがクラッシュすれば、その履歴は消え去ります。プロの現場では、「実行ログ」こそが正義。今回は、FileSystemObject(FSO)を使い倒し、あなたのマクロに「確かな足跡」を残させるための極意を伝授します。

1. なぜ「ログ出力」が自動化の必須要件なのか

SolidWorksのAPIは強力ですが、リソースの解放漏れや、特定のジオメトリ計算による例外エラーは避けられません。

  • 再現性の確保: エラーが起きた日時と、その瞬間にどのフィーチャを生成していたか。これが分かれば修正は一瞬です。
  • ボトルネックの特定: 処理のどこに時間がかかっているか、タイムスタンプを記録すれば「重い処理」が可視化されます。

今回は、このログ出力を「クラスモジュール」として設計します。なぜクラスなのか? それは、メインの処理コードを汚さず、「呼び出すだけで勝手に記録してくれる」という、メンテナンス性の高い構造を作るためです。

2. ログ管理クラス(Logger)の実装

VBAエディタで「クラスモジュール」を新規作成し、名前を `CLogger` としてください。以下のコードは、まさに現場の基盤となるテンプレートです。

‘ CLoggerクラスモジュール
Option Explicit

Private fso As Object
Private logFile As Object
Private filePath As String

‘ クラス初期化時にログパスを設定
Public Sub Initialize(ByVal logPath As String)
Set fso = CreateObject(“Scripting.FileSystemObject”)
filePath = logPath

‘ ファイルが存在しなければ作成し、存在すれば追記モードで開く
If Not fso.FileExists(filePath) Then
Set logFile = fso.CreateTextFile(filePath, True)
Else
Set logFile = fso.OpenTextFile(filePath, 8, True) ‘ 8 = ForAppending
End If
End Sub

‘ ログ書き込みメソッド
Public Sub WriteLog(ByVal message As String)
If logFile Is Nothing Then Exit Sub
‘ 日時 + メッセージを出力
logFile.WriteLine “[” & Now & “] ” & message
End Sub

‘ 終了処理
Private Sub Class_Terminate()
If Not logFile Is Nothing Then
logFile.Close
Set logFile = Nothing
End If
Set fso = Nothing
End Sub

3. 実践:パーツ生成マクロへの組み込み

さて、この `CLogger` を使って、実際に大規模なパーツを生成するメイン処理を書いてみましょう。

Sub CreateComplexPart()
Dim swApp As SldWorks.SldWorks
Dim logger As New CLogger

‘ ログファイルのパスを指定(デスクトップ等)
logger.Initialize Environ(“USERPROFILE”) & “\Desktop\MacroLog.txt”
logger.WriteLog “処理を開始しました。”

On Error GoTo ErrorHandler ‘ エラーハンドリングは必須!

‘ パーツ作成のメインループ(擬似コード)
Dim i As Integer
For i = 1 To 100
logger.WriteLog “フィーチャ生成開始: ステップ ” & i

‘ ここにSolidWorksのAPI処理が入る
‘ 例: swPart.FeatureManager.InsertExtrusion…

‘ 意図的な遅延や計算負荷を記録
Next i

logger.WriteLog “処理が正常終了しました。”
Exit Sub

ErrorHandler:
logger.WriteLog “重大なエラー発生: ” & Err.Description
MsgBox “エラーが発生しました。ログを確認してください。”
End Sub

4. 初学者が陥りやすい「罠」と解決策

① ログファイルが開けない!

`OpenTextFile` は、別のアプリ(Excelやメモ帳)でログファイルを開いていると、排他制御でエラーになります。ログは「記録専用」と割り切り、確認する時以外は閉じる癖をつけましょう。

② SolidWorksがフリーズした!

処理が重すぎてSolidWorksが応答なしになる場合、ログに「処理開始」はあっても「終了」がないはずです。ログの末尾を見るだけで、「あ、ここでフリーズしたんだな」と一目瞭然になります。

③ なぜクラスを使うの?

`Sub` や `Function` の中で毎回 `Open “…” For Append` を書くと、途中でファイルポインタを閉じ忘れる危険があります。クラスの `Class_Terminate` イベントに `Close` を記述しておくことで、マクロが終了すれば自動的にファイルも閉じられるという安全装置が働くのです。

最後に:エンジニアとしての「誇り」をコードに

「マクロの記録」から一歩踏み出し、このように設計を意識し始めると、SolidWorks VBAはただの「作業効率化ツール」から、「製造プロセスを制御するエンジニアリング・システム」へと進化します。

ログファイルという「自分の思考の軌跡」を残すことは、将来の自分、そしてあなたのチームに対する最大のギフトです。ぜひ、今日からあなたのマクロに「ログ」という命を吹き込んでみてください。

もし、さらに深いAPI操作や、パフォーマンスチューニングについて興味があれば、いつでも聞いてください。壁を越えようとするエンジニアを、私は全力でサポートしますよ。

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