【入門編】【デバッグ技術】VBAイミディエイトウィンドウとFileSystemObject(FSO)を駆使した高度な実行ログ出力システム – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksマクロの開発、日々の業務お疲れ様です。
「記録ボタンを押して自動生成されたコードをいじってみたけれど、複雑なパーツを作ろうとした途端にエラーが起きて止まってしまう……どこで何が起きたのか分からない!」
そんな壁にぶつかっていませんか?

マクロの規模が大きくなると、VBA標準のメッセージボックス(`MsgBox`)をポチポチ押してデバッグするのは限界を迎えます。特に、何百回もループする処理や、ジオメトリ(形状)生成のどのステップで破綻したのかを突き止めるには、「実行ログの自動記録」が最強の武器になります。

今回は、VBAの「イミディエイトウィンドウ」へのリアルタイム出力と、OSのファイルシステムを操作する「FileSystemObject(FSO)」を組み合わせ、あなたのマクロを「自己診断する賢いプログラム」へと生まれ変わらせる極意を伝授します。

ここをクリアすれば、もうデバッグに怯える必要はありません。一緒にプロのエンジニアへの階段を登っていきましょう!

なぜ、大規模マクロには「ログ出力システム」が必要なのか?

SolidWorks VBAで複雑なパーツ(例えば、数百の穴あけやコンフィギュレーションを持つモデル)を自動生成する際、エラーは突然やってきます。

  • 「あれ? どのフィーチャの生成時に寸法参照が切れたんだっけ?」
  • 「ループの何回目の処理で変数の値がおかしくなった?」

こうした疑問を解決するため、コンソール画面(イミディエイトウィンドウ)とテキストファイル(`.log`や`.txt`)の両方に、「いつ(Timestamp)、どこで(Function/Sub)、何が起きたか(Message)」を自動で書き残す仕組みを作ります。

これが整備されていると、エラー発生時に「ログファイルを開いてエラーの1行上を見るだけ」で原因が特定できるようになり、開発スピードが劇的に向上します。

基礎知識:2つの強力なツール

今回のシステムで主役となる2つの要素について、優しく整理しておきましょう。

1. イミディエイトウィンドウ(`Debug.Print`)
VBAのVBE(編集画面)の下部によくあるアレです。プログラムを止めずに「今の変数の値」を文字として流し込むことができ、実行中の挙動確認に最適です。
2. FileSystemObject(FSO)
Windows標準のファイル操作ライブラリです。「VBAからテキストファイルを作って、文字を書き込んで、保存して閉じる」という一連の面倒なファイルI/Oを、驚くほどスマートに実現してくれます。

実践!高度な実行ログ出力システムの実装

それでは、実際のVBAコードを見ていきましょう。
このコードは、デスクトップに自動でログフォルダとファイルを作り、そこにタイムスタンプ付きのログを書き込みながら、SolidWorksのパーツ生成処理を進めるテンプレート構造になっています。

VBEの標準モジュールに、そのままコピペして貼り付けてみてください。

Option Explicit

‘ ==============================================================================
‘ 【テーマ】FSOとDebug.Printを駆使した高度な実行ログ出力システム
‘ ==============================================================================

‘ メイン処理:パーツ生成とログ記録のデモ
Sub Main_CreatePartWithLog()
Dim swApp As Object
Dim swModel As Object
Dim fso As Object
Dim logFilePath As String
Dim startTime As Double

startTime = Timer ‘ 処理時間計測用

‘ 1. FileSystemObjectの初期化
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ログファイルの保存先パスを決定(デスクトップに「SW_Macro_Logs」フォルダを作成)
Dim desktopPath As String
desktopPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)
Dim logFolder As String
logFolder = desktopPath & “\SW_Macro_Logs”

If Not fso.FolderExists(logFolder) Then
fso.CreateFolder logFolder
End If

‘ ファイル名に日時を付与して一意にする(例: Log_20231025_123456.txt)
logFilePath = logFolder & “\Log_” & Format(Now, “yyyymmdd_HHMMSS”) & “.txt”

‘ 2. ログシステムの開始を記録
Call WriteLog(fso, logFilePath, “INFO”, “=== SolidWorks マクロ実行開始 ===”)
Call WriteLog(fso, logFilePath, “INFO”, “出力先: ” & logFilePath)

‘ 3. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
Call WriteLog(fso, logFilePath, “ERROR”, “SolidWorksの接続に失敗しました。”)
Exit Sub
End If

‘ 新規パーツ作成のシミュレーション
Call WriteLog(fso, logFilePath, “INFO”, “新規パーツ(PartDoc)を作成しています…”)
‘ Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\SOLIDWORKS 2023\templates\parte.prt”, 0, 0, 0)
‘ ※環境にあわせてテンプレートパスは調整してください。ここではダミーとして進めます。

‘ 擬似的なループ処理(パーツのフィーチャ生成を想定)
Dim i As Long
For i = 1 To 3
‘ わざと変数の状態をログに残す
Call WriteLog(fso, logFilePath, “DEBUG”, “フィーチャ生成ループ: ” & i & “回目の処理を実行中”)

‘ ── ここに実際のSolidWorks API操作(押し出し、カットなど)が入ります ──

‘ 擬似的なエラーハンドリングのテスト(例としてi=2のときに警告を出すなど)
If i = 2 Then
Call WriteLog(fso, logFilePath, “WARN”, “警告: 参照面2のオフセット値がデフォルト値にフォールバックしました。”)
End If
Next i

‘ 4. 正常終了の記録
Dim elapsedTime As Double
elapsedTime = Timer – startTime
Call WriteLog(fso, logFilePath, “INFO”, “=== マクロが正常終了しました。処理時間: ” & Format(elapsedTime, “0.00”) & “秒 ===”)

‘ ユーザーへの通知
MsgBox “処理が完了しました。\nログファイルを確認してください:\n” & logFilePath, vbInformation, “完了”

‘ クリーンアップ
Set fso = Nothing
Set swApp = Nothing
End Sub

‘ ==============================================================================
‘ 汎用ログ書き込みプロシージャ
‘ 引数:
‘ fso – FileSystemObject
‘ filePath – ログファイルのフルパス
‘ logLevel – ログレベル (“INFO”, “DEBUG”, “WARN”, “ERROR”)
‘ message – 記録したいメッセージ
‘ ==============================================================================
Private Sub WriteLog(ByVal fso As Object, ByVal filePath As String, ByVal logLevel As String, ByVal message As String)
Dim formattedMessage As String
Dim ts As Object

‘ タイムスタンプとレベルを含んだフォーマット文字列を作成
formattedMessage = “[” & Format(Now, “yyyy-mm-dd HH:nn:ss”) & “] [” & UCase(logLevel) & “] ” & message

‘ ① イミディエイトウィンドウに出力(開発中のリアルタイム確認用)
Debug.Print formattedMessage

‘ ② テキストファイルに追記 (ForAppending = 8, Create = True)
On Error GoTo ErrorHandler
Set ts = fso.OpenTextFile(filePath, 8, True)
ts.WriteLine formattedMessage
ts.Close
Set ts = Nothing
Exit Sub

ErrorHandler:
‘ ファイル書き込みエラーなどでマクロ全体を止めないためのフェイルセーフ
Debug.Print “[CRITICAL] ログの書き込みに失敗しました: ” & Err.Description
If Not ts Is Nothing Then ts.Close
End Sub

コードの解説:ここがプロの技!

1. 共通化された `WriteLog` プロシージャ

ログを書き残すたびに `OpenTextFile` 書いて……とやっていると、コードが汚くなります。そのため、ログ出力の処理を一つのサブルーチン(`WriteLog`)にまとめました。
メッセージを渡すだけで、自動的に「イミディエイトウィンドウへの出力」と「テキストファイルへの追記」を同時に行ってくれます。

2. ログレベル(INFO, DEBUG, WARN, ERROR)の概念

エンジニアの世界では常識ですが、ログに「重要度」を持たせると後から見返すときに天と地ほどの差が出ます。

  • INFO: 処理の開始・終了など、大まかな流れ。
  • DEBUG: ループのカウンタや変数の値など、詳細な内部状態。
  • WARN: 処理は続行できるけれど、少し怪しい挙動(フォールバックなど)。
  • ERROR: 処理が継続不可能な致命的エラー。

これらを文字の頭に付けることで、テキストエディタで開いたときに `[ERROR]` や `[WARN]` で文字検索(Ctrl + F)をかければ、一瞬でトラブル箇所にジャンプできます。

3. フェイルセーフ(エラーハンドリング)の組込み

ログ出力システム自体がエラーを起こしてマクロを止めてしまっては本末転倒です。`WriteLog` の中にはあえて `On Error GoTo ErrorHandler` を仕込み、万が一ファイルが他のアプリでロックされていて書き込めなくても、マクロ本体の動作を邪魔しないように堅牢(ロバスト)に設計してあります。

陥りやすいエラーと回避のコツ

1. 「ファイルにアクセスできません(エラー 70)」と言われる

  • 原因: 生成しようとしたログファイルを、すでにExcelやメモ帳で開いたままマクロを実行してしまっているケースです。
  • 対策: マクロ実行中はログファイルを閉じおくか、上記コードのようにエラーハンドリングで落とさない設計にしておきましょう。

2. 日本語が文字化けする

  • 原因: `FileSystemObject` の `OpenTextFile` メソッドは、デフォルトではシステム固有のエンコード(ANSIなど)で開くため、環境によっては文字化けすることがあります。
  • 対策: 必要に応じて文字コード指定の引数(`TristateTrue` など)を渡すか、基本的には日本語のファイル名やパスを避け、ASCII文字ベースのパス設計にすると安全です。

まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!

お疲れ様でした!今回は少し高度な、しかし実務では絶対に欠かせない「ログ出力によるデバッグシステム」について解説しました。

  • イミディエイトウィンドウで今の動きを目で追い、
  • FileSystemObjectで全記録をテキストとして残す。

この2つを自分のマクロに組み込めるようになったあなたは、単なる「マクロの記録の延長」から、「プロの業務自動化エンジニア」へと確実にステップアップしています。

大規模なパーツ生成や図面自動化に挑むときは、必ずこのログシステムを最初に仕込んでみてください。トラブルシューティングの時間が嘘のように消え去り、開発そのものが楽しくなるはずです。

あなたのSolidWorks自動化ライフが、より快適で素晴らしいものになりますように。それでは、また次の極限知見でお会いしましょう!

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