Public Sub Log(level As LoggerSeverityLevel, functionName As String, message As String, Optional Arguments As Variant)
Dim sh As Object
Set sh = ActiveSheet
LoggerDB.Activate
''' Find blank row for next entry
Dim firstEmptyRow As LongLong
firstEmptyRow = Range("A" & rows.count).End(xlUp).row + 1
''' Parse level into human redable format
Dim lvlMessage As String
lvlMessage = "Unknown"
If level = lslInfo Then lvlMessage = "Info"
If level = lslWarning Then lvlMessage = "Warning"
If level = lslDebug Then lvlMessage = "Debug"
If level = lslCritical Then lvlMessage = "Critical"
''' Insert data
LoggerDB.Cells(firstEmptyRow, 1) = Now()
LoggerDB.Cells(firstEmptyRow, 2) = lvlMessage
LoggerDB.Cells(firstEmptyRow, 3) = functionName
LoggerDB.Cells(firstEmptyRow, 4) = message
''' And optional arguments, one cell per argument
Dim i As Long
Dim arg As Variant
i = 5
Dim tmp As Variant
Dim coll As Collection
This part pack scalars (number, string, bool, whatever single value) into collection. So I can always assume that if any additional arguments are passed, For Each will work.
It relay on TypeName() returning string with "()" for arrays.
If Not IsMissing(Arguments) Then ' If not iterable by for each (single variable) pack into collection. If Not (InStr(TypeName(Arguments), "()") <> 0 Or TypeName(Arguments) = "Collection" Or TypeName(Arguments) = "Dictionary") Then Set coll = New Collection coll.add Arguments Set tmp = coll Else tmp = Arguments End If
For Each arg In tmp
LoggerDB.Cells(firstEmptyRow, i) = CStr(arg)
i = i + 1
Next arg
End If
sh.Activate
End Sub