エクセルのマクロを作ってて困るのは、
「出力結果が見えねぇ・・・」
って事。適当なセルに書き出したり、デバッカでブレークポイントを設定したり、めんどくさいのなんのって。
って事で、デバッグ用のエラーログを吐き出すマクロ Ver.0.90(1.00 って、ゼッタイ書けない ^^) を紹介。
これに、アクティブでないシートのセルに値を書く方法を使ってるので、それを知りたい人もチェキ。
以下、ソース。
'以下は、メインモジュールのトップ、プロシジャーの外に書くこと。
Public Const LOG_SW = True 'ログ出力の有効・無効
Public Const LOG_SHEET = "Sheet2" 'ログの出力先シート名
Public Const MAX_LOG = 2 'ログの本数(何本でも)
Public Const LOG_START_ROW = 2 'ログ出力開始行
Public Const INIT_LOG = "INIT" '初期化指定
Public Const ERROR_LOG = 1 'ERROR 用ログ
Public Const OUTPUT_LOG = 2 'データ吐き出しログ
'以下は、ログ吐き出しまくりマクロ本体。(どのモジュールに書いても可。)
Public Sub debugLOG( log As String, opt As Integer )
Static last_line(MAX_LOG) As Integer '次にログを書く行
If Not LOG_SW Then Exit Sub
If log = "INIT" Then
For n = 1 To MAX_LOG
last_line(n) = LOG_START_ROW
'ログ領域のクリア
With ThisWorkbook.Worksheets(
"Sheet2" LOG_SHEET )
.Range( .Cells(LOG_START_ROW, n), _
.Cells(Rows.Count, n)).Value = ""
End With
Next
Exit Sub
End If
Worksheets(LOG_SHEET).Cells(last_line(opt), opt).Value = log
last_line(opt) = last_line(opt) + 1
End Sub
使い方は、こんな感じ。
'LOG 領域の初期化。マクロ開始直後、必ず一度は実行。
Call debugLOG(INIT_LOG, 0)
'実際のログの吐き出し。→ エラーログへ
Call debugLOG("ダメだこりゃ!", ERROR_LOG)
'実際のログの吐き出し。→ 出力結果ログへ
Call debugLOG("答えは:" + CStr(n) + "だす", OUTPUT_LOG)
LOG_START_ROW = 2 の設定だと、LOG_SHEET の2行目から書き始めるので、1行目に、ログ名を書いとくのがいいある。
MAX_LOG の値を増やせば、区別して保存できるログ本数が増える。本数を増やしたら、ERROR_LOG = 1, OUTPUT_LOG = 2, 3, 4, ・・・って感じで、定義を増やしていくだけで、OK ある。
マクロを別モジュールに書いてもいい。LOG_SW を False にすれば、ログは出力されない。マクロのあるワークブックと、参照・処理するワークブックが別になってても、OK どす。
課題項目は、
・範囲クリアに "" を代入してるのがかっこわるい。
かなり調べたんだけど、ClearContents を使うと、どうしてもエラーになってしまう。
このマクロの中に、重要なチップスが隠れてる。それは、
「アクティブでないワークシートに値を書く方法。」
これ、WEB 上で調べても、なかなかうまく行かなかった。ポイントは、With ではなく、
.Range( .Cells(2, n), .Cells(Rows.Count, n)).Value
の所。Cells の前に「 .」が必要なんて、わかんねぇって・・・
あと、Rows.Count は最大行数(≒最終行の行番号)を返してくれる。
※
改訂版もあるよ。