【Excel VBA】開発を効率化!ログ管理を行うクラスモジュール
こんにちは、おくやんです。
Excel VBAの開発効率を大幅に向上させる、自作のライブラリクラスをご紹介しています。
今回はログ管理を行うライブラリクラスのご紹介です。
LibWorkSheetクラスとLibWorkBookクラスと合わせてご利用ください
LibWorkSheetクラス
LibWorkBookクラス
今回紹介するクラスモジュールは、VBAでは用意されていないログの管理を簡単に行えるようにしたクラスとなります。
皆さんも、ぜひ活用してみて下さい。
名称
Loggerクラス
概要
Logシートの作成を行い、出力レベルに応じたログを記録する
ログの出力項目は「時刻」、「レベル」、「内容」となる
ログレベルはDebug、Info、Alert、Errorの4種類から選択可能
関連クラス
LibWorkSheetクラスのインストールが必要
LibWorkBookクラスのインストールが必要
簡単な使い方
新規ログシートの作成
Logシートを新規に作成し、ログ情報を書き込む。
' 新規ログシートを作成
Dim log As Logger: Set log = New Logger
log.Init
log.DebugMsg "デバッグログを出力" ' デフォルトではフィルターで非表示となる
log.InfoMsg "情報ログを出力"
log.AlertMsg "警告ログを出力"
log.ErrMsg "エラーログを出力"
既存のログシートへ追記
既存のLogシートにログ情報を追記する。
' init関数を実行しない場合は既存のlogシートに追記
Dim log As Logger: Set log = New Logger
log.DebugMsg "デバッグログを出力"
log.InfoMsg "情報ログを出力"
log.AlertMsg "警告ログを出力"
log.ErrMsg "エラーログを出力"
関数定義
Init()
ログシートの新規作成を行う
すでにシートが作成されている場合は、一度削除して新規作成を行う
DebugMsg()
Debugレベルのログを出力する
InfoMsg()
Infoレベルのログを出力する
AlertMsg()
Alertレベルのログを出力する
ErrMsg()
Errorレベルのログを出力する
ソースコード
Visual Basic Editorからクラスモジュール Loggerを追加して、下記コードを張り付けてください。
Option Explicit
' 定数定義
' シート名
Private Const SHEET_LOG As String = "log"
' ログヘッダ
Private Const LOG_HEADER_TIME As String = "時刻"
Private Const LOG_HEADER_LEVEL As String = "レベル"
Private Const LOG_HEADER_MSG As String = "内容"
' ログレベル
Private Const LOG_LEVEL_DEBUG As String = "Debug"
Private Const LOG_LEVEL_INFO As String = "Info"
Private Const LOG_LEVEL_ALERT As String = "Alert"
Private Const LOG_LEVEL_ERROR As String = "Error"
' メンバー定義
Private ws_ As LibWorkSheet
' Property定義
Private Property Get Ws() As LibWorkSheet
Set Ws = ws_
End Property
Private Property Set Ws(lib_ws As LibWorkSheet)
Set ws_ = lib_ws
End Property
' Initialize定義
Private Sub class_initialize()
Dim libWb As LibWorkBook: Set libWb = New LibWorkBook
If libWb.HasSheet(SHEET_LOG) Then
Set Ws = New LibWorkSheet
Call Ws.Init(SHEET_LOG)
Else
Call CreateLogSheet
End If
End Sub
' Private Function定義
Public Function Init()
' logシートがある場合は削除し、新規作成
Dim libWb As LibWorkBook: Set libWb = New LibWorkBook
If libWb.HasSheet(SHEET_LOG) Then
Dim alertFlg As Boolean: alertFlg = Application.DisplayAlerts
Application.DisplayAlerts = False
ThisWorkbook.Worksheets(SHEET_LOG).Delete
Application.DisplayAlerts = alertFlg
End If
Call CreateLogSheet
End Function
Public Function DebugMsg(output_msg As String)
Call WriteLog(output_msg, 0)
End Function
Public Function InfoMsg(output_msg As String)
Call WriteLog(output_msg, 1)
End Function
Public Function AlertMsg(output_msg As String)
Call WriteLog(output_msg, 2)
End Function
Public Function ErrMsg(output_msg As String)
Call WriteLog(output_msg, 3)
End Function
' Private Function定義
' logシート作成
Private Function CreateLogSheet()
Dim targetWS As Worksheet
Set targetWS = ThisWorkbook.Worksheets.Add(after:=Worksheets(ThisWorkbook.Worksheets.Count))
targetWS.name = SHEET_LOG
' ヘッダー設定
Dim i As Long
Dim headerSettings As Variant
headerSettings = Array( _
Array(LOG_HEADER_TIME, 20), _
Array(LOG_HEADER_LEVEL, 20), _
Array(LOG_HEADER_MSG, 100))
For i = LBound(headerSettings) To UBound(headerSettings)
targetWS.Cells(1, i + 1) = headerSettings(i)(0)
targetWS.Cells(1, i + 1).Font.Bold = True
targetWS.Cells(1, i + 1).HorizontalAlignment = xlCenter
targetWS.Cells(1, i + 1).Interior.ColorIndex = 27
targetWS.Cells(1, i + 1).ColumnWidth = headerSettings(i)(1)
Next
' シート設定
ThisWorkbook.Activate
ActiveWindow.WindowState = xlMaximized
targetWS.Range("A2").Select
ActiveWindow.FreezePanes = True
targetWS.Range("A1").AutoFilter _
Field:=2, _
Operator:=xlFilterValues, _
Criteria1:=Array(LOG_LEVEL_INFO, LOG_LEVEL_ALERT, LOG_LEVEL_ERROR)
Set Ws = New LibWorkSheet
Call Ws.Init(SHEET_LOG)
End Function
' ログ出力
Private Function WriteLog(output_msg As String, output_level As Long)
Ws.WriteRow = Ws.MaxRow + 1
Dim levelStr As String
Select Case output_level
Case 0
levelStr = LOG_LEVEL_DEBUG
Case 1
levelStr = LOG_LEVEL_INFO
Case 2
levelStr = LOG_LEVEL_ALERT
Case 3
levelStr = LOG_LEVEL_ERROR
End Select
' ログ出力
Ws.Val(LOG_HEADER_TIME) = Now
Ws.Val(LOG_HEADER_LEVEL) = levelStr
Ws.Val(LOG_HEADER_MSG) = output_msg
' フィルター再適用
Ws.Ws.AutoFilter.ApplyFilter
End Function
この記事が気に入ったらサポートをしてみませんか?