見出し画像

【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


この記事が気に入ったらサポートをしてみませんか?