Logging パターン: OutputDebugString , DebugView 活用
この記事では、Excel VBAでWindows API OutputDebugStringとDebugViewユーティリティを活用した効果的なLogging方法について説明します。
1. 基本的なロギングパターン
Excel VBAコース(9):Excel VBA How-To
上記の 4.3。ダイレクトランウィンドウツールの活用方法 目次から「3。 「出力メッセージの確認」に関する内容を扱いました。
Debug.Print で出力される内容を直接実行ウィンドウで確認できる方法だ。この方法は非常に簡単であるという利点がありますが、次の欠点があります。
- VBE(Visual Basic Editor)は、Excelプロセスが停止状態にある場合に出力されるlogの内容を確認できません。
- 上記の活用方法のうち「2。実行時に変数値確認」と混用する場合、logと変数値が中間中間に混ざり合い、log確認に干渉することがある。
- 200行を超えるメッセージは消去されます。つまり、最後の200行だけが維持されます。
Debug.Printを置き換えながら、より良い方法としてWindows APIであるOutputDebugStringとユーティリティであるDebugViewを使用する方法があります。
2. OutputDebugString 使用パターン
2.1。 OutputDebugStringを使用するVBAコード
以下の記事では、Windows APIであるOutputDebugStringを使用する方法について紹介しました。
1次元Bin Packingアルゴリズムを活用した作業配分の最適化_4。
5.1.4。 modUtilモジュールのソースコード で紹介したコードを少し変形し、必要な内容全体を次のように作成した。
Option Explicit Public Const LOG_PREFIX As String = "[VBA] " 'DebugView에서 로그 메시지를 필터링하기 위한 Prefix 지정 Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String) 'OutputDebugString API를 이용한 Debug Message 출력 'DebugView등을 이용하여 메시지 View 가능함 Public Sub DoLog(aMsg As String) OutputDebugString LOG_PREFIX + aMsg End Sub 'Log 예시 프로시져 Public Sub TestLog() Dim lIdx As Long For lIdx = 1 To 1000 DoLog "Log[" + CStr(lIdx) + "]" Next End Sub
- 行2:DebugViewでログメッセージをフィルタリングするためのPrefixを指定します。フィルタリング方法については後述する。
- 行4:Windows APIであるOutputDebugStringをインポートして関数として宣言します。
- 行9:LOG_PREFIXとログメッセージを組み合わせて、行4でインポートした関数にパラメータとして渡して実行します。このプロセスをDoLog関数にします。
- 行16:ログメッセージの出力が必要な場所でDoLog関数を呼び出します。
ここまですればVBAコードで必要な作業はすべて終わった。次に、DebugViewユーティリティを見てみましょう。
2.2. DebugViewユーティリティの紹介と活用
2.2.1. DebugViewユーティリティの紹介
DebugViewは Sysinternals suiteに含まれているユーティリティツールです。
DebugView - Windows Sysinternals | Microsoft Docs
DebugView v 4.90
Mark Russinovich
公開日: 4 月 23 日, 2019
DebugView(1.3 MB) ダウンロードはじめに
Debugviewは、ローカルシステムまたはtcp / ipを介して接続できるネットワーク上のすべてのコンピュータでデバッグ出力を監視できるアプリケーションです。カーネルモードとWin32デバッグ出力の両方を表示できるため、アプリケーションまたはデバイスドライバが生成するデバッグ出力をキャッチするデバッガは必要なく、非標準デバッグ出力Apiを使用するようにアプリケーションまたはドライバを変更する必要はありません。DebugView キャプチャ
Windows 2000 では、XP、Server 2003、および Vista debugview は以下をキャプチャします。
– Win32 OutputDebugString
– カーネルモード DbgPrint
– Windows XPおよびServer 2003に実装されたDbgPrintのすべてのカーネルモードのバリエーション
簡単にまとめると、「DebugViewは、Windows APIであるOutputDebugStringの呼び出し時に渡される文字列をキャプチャして画面に表示するユーティリティツール」です。
DebugViewの例画面は次のとおりです。
*ソース: https://docs.microsoft.com/ko-kr/sysinternals/downloads/debugview#installation-and-use
2.2.2。 DebugViewユーティリティの活用
DebugViewをダウンロードして実行し、Filter / Highlightメニューを実行します。
上記メニューを実行すると、次の画面が表示されます。
- Include:出力するメッセージに含まれる文字列を入力します。ワイルドカード文字として*を使用する(例:[VBA] *)空の場合は、すべてのメッセージを出力します。複数の文字列を入力する場合は semicolon(;) で区切ります。
- Exclude:出力しないメッセージに含まれる文字列を入力します。複数の文字列を入力する場合は semicolon(;) で区切ります。
- Highlight:Filter 1〜20を選択し、強調する文字列と色を選択します。色は前景色、背景色指定可能
1つの注意は、Includeにフィルタリングする文字列を入力しないと、さまざまなプロセスによって出力されるメッセージがキャプチャされて混乱することです。フィルタリングする文字列は必須として指定することをお勧めします。
「2.1。 VBAコード」目次で作成した例VBAコードの結果をキャプチャするために、Includeに「[VBA] *」と入力してOKボタンを押します。
VBAコードを実行すると、次のようにDebugViewにキャプチャされたメッセージを確認できます。
![](https://prodskill.com/wp-content/uploads/2022/09/image-201.png)
![](https://prodskill.com/wp-content/uploads/2022/09/image-202.png)
ちなみに、Highlight機能を利用すれば次のように出力することができる。
特定の文字列が含まれているときに背景色、前景色を変えると、ログの現在の進行状況を確認するのに視覚的に非常に良い。
ここまで、Excel VBAでWindows API OutputDebugStringとDebugViewユーティリティを活用した効果的なLogging方法を見てきました。
DebugViewはHighlight機能、Remote Logging機能など魅力的な機能がたくさんある。これらの機能は後で別々の記事として扱います。
DA# Macro機能デモ映像(YouTube) 投稿では、DebugViewユーティリティでメッセージがキャプチャされる状況を一緒に記録しておきました。
下の画像で右上がDebugViewです。機能が動作しているプロセスのログを記録し、後で再び見ることができます。
参考までに、 DA# Macro(1): DA#, DA# API, DA# Macro (マクロ)の概要 で紹介したDA# MacroはLOG_PREFIXを「[DA#]」として使用している。