【VBA】CommonUtil

Option Explicit

'v2
'****************************************************
'共通処理
'----------------------------------------------------
'CommonUtil
'****************************************************
'StartLogging     -ロギング開始
'EndLogging       -ロギング終了
'AddLog           -ログ追加
'StartTimer       -処理時間計測開始
'EndTimer         -処理時間計測終了
'GetProcTime      -処理時間取得
'ChangeDir        -カレントディレクトリ変更
'ArrayToCol       -変換(配列→Collection)
'ColToArray       -変換(Collection→配列)
'PasteArray       -セルに張り付け(配列)
'PasteCol         -セルに張り付け(Collection)
'ShowStatusBar    -ステータスバーに文字を表示
'SleepF           -スリープ
'GetYMD           -年月日を取得
'GetTime          -時刻を取得
'GetNow           -日時を取得
'****************************************************

'共通変数
Public logging As Boolean
Public logs As Collection

'内部用
Private startTime As Variant
Private endTime As Variant
Private procTime As Variant

#If Win64 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

'----------------------------------------------------
'■ロギング開始
'----------------------------------------------------
Public Function StartLogging()
    logging = True
    Set logs = New Collection
End Function

'----------------------------------------------------
'■ロギング終了
'----------------------------------------------------
Public Function EndLogging()
    logging = False
    Set logs = Nothing
End Function

'----------------------------------------------------
'■ログ追加
'----------------------------------------------------
'引数1:プロシージャ名
'引数2:ログの種類
'引数3:(Optional)ログの内容
'----------------------------------------------------
Public Function AddLog(aName As String, aType As String, Optional aDescription As String)
    logs.Add "[" & aType & "][" & Format(Now, "yyyy/mm/dd hh:mm:ss") & "][" & aName & "]" & Replace(aDescription, vbLf, "")
End Function

'----------------------------------------------------
'■処理時間計測開始
'----------------------------------------------------
Public Function StartTimer()
    startTime = Time
End Function

'----------------------------------------------------
'■処理時間計測終了
'----------------------------------------------------
Public Function EndTimer()
    endTime = Time
End Function

'----------------------------------------------------
'■処理時間取得
'----------------------------------------------------
'戻り値:処理時間
'----------------------------------------------------
Public Function GetProcTime() As String
    GetProcTime = "処理時間:"
    If Hour(endTime - startTime) <> 0 Then GetProcTime = GetProcTime & Hour(endTime - startTime) & "時間"
    If Minute(endTime - startTime) <> 0 Then GetProcTime = GetProcTime & Minute(endTime - startTime) & "分"
    If Second(endTime - startTime) <> 0 Then GetProcTime = GetProcTime & Second(endTime - startTime) & "秒"
End Function

'----------------------------------------------------
'■カレントディレクトリ変更
'----------------------------------------------------
'引数:変更先のパス
'----------------------------------------------------
'戻り値:実行結果 ※エラーがなければTrue
'----------------------------------------------------
Public Function ChangeDir(aPath As String) As Boolean
On Error GoTo Err
    With CreateObject("WScript.Shell")
        .CurrentDirectory = aPath
    End With
    ChangeDir = True
    If logging Then AddLog "CommonUtil.ChangeDir", "INFO ", "パス:" & CurDir
    Exit Function
Err:
    If logging Then AddLog "CommonUtil.ChangeDir", "ERROR", "パス:" & aPath & " / エラー内容:" & Err.Description
End Function

'----------------------------------------------------
'■変換(配列→Collection)
'----------------------------------------------------
'備考:ユーザー定義型の配列は不可
'----------------------------------------------------
'引数:変換する配列
'----------------------------------------------------
'戻り値:変換後のコレクション
'----------------------------------------------------
Public Function ArrayToCol(aArray As Variant) As Collection
    Set ArrayToCol = New Collection
    Dim v As Variant
    '配列の場合
    If IsArray(aArray) Then
        For Each v In aArray
            ArrayToCol.Add v
        Next
    '配列でない場合
    Else
        ArrayToCol.Add aArray
    End If
End Function

'----------------------------------------------------
'■変換(Collection→配列)
'----------------------------------------------------
'引数:変換するコレクション
'----------------------------------------------------
'戻り値:変換後の配列
'----------------------------------------------------
Public Function ColToArray(aCollection As Collection) As Variant
    Dim arr As Variant: ReDim arr(aCollection.Count - 1)
    Dim i As Long
    Dim v As Variant
    For Each v In aCollection
        arr(i) = v
        i = i + 1
    Next
    ColToArray = arr
End Function

'----------------------------------------------------
'■セルに張り付け(配列)
'----------------------------------------------------
'備考:ユーザー定義型の配列は不可
'----------------------------------------------------
'引数1:張り付ける配列
'引数2:張り付け開始位置
'引数3:逆指定 ※(1次元の場合)Trueで横に張り付け デフォルトは縦
'----------------------------------------------------
Public Function PasteArray(aArray As Variant, ByVal aRange As Range, Optional aIsReverse As Boolean)
On Error GoTo Err_Array2
'2次元配列の場合
    aRange.Resize(UBound(aArray, 1), UBound(aArray, 2)) = aArray
    Exit Function
'1次元配列の場合
Array1:
On Error GoTo Err_Array1
    '横に張り付け
    If aIsReverse Then
        aRange.Resize(1, UBound(aArray, 1) + 1).Value = aArray
    '縦に張り付け
    Else
        aRange.Resize(UBound(aArray, 1) + 1).Value = WorksheetFunction.Transpose(aArray)
    End If
    Exit Function
    
Err_Array2:
    '2次元でなければ1次元の処理を行う
    Resume Array1
Err_Array1:
    '1次元,2次元でない場合、セルに張り付ける
    aRange = aArray
End Function

'----------------------------------------------------
'■セルに張り付け(Collection)
'----------------------------------------------------
'引数1:張り付けるコレクション
'引数2:張り付け開始位置
'引数3:逆指定 ※Trueで横に張り付け デフォルトは縦
'----------------------------------------------------
Public Function PasteCol(aCollection As Collection, ByVal aRange As Range, Optional aIsReverse As Boolean)
    '配列に変換
    Dim tmpArray As Variant: tmpArray = ColToArray(aCollection)
    '横に張り付け
    If aIsReverse Then
        aRange.Resize(1, UBound(tmpArray, 1) + 1).Value = tmpArray
    '縦に張り付け
    Else
        aRange.Resize(UBound(tmpArray, 1) + 1).Value = WorksheetFunction.Transpose(tmpArray)
    End If
End Function

'----------------------------------------------------
'■ステータスバーに文字を表示
'----------------------------------------------------
'戻り値:(Optional)表示内容 ※省略で元に戻す
'----------------------------------------------------
Public Function ShowStatusBar(Optional aText As String)
    Application.StatusBar = IIf(aText = "", False, aText)
End Function

'----------------------------------------------------
'■スリープ
'----------------------------------------------------
'引数:スリープする秒数
'----------------------------------------------------
Public Function SleepF(ByVal aTime As Long)
    aTime = aTime * 1000
    Sleep aTime
End Function

'----------------------------------------------------
'■年月日を取得
'----------------------------------------------------
'戻り値:現在年月日
'----------------------------------------------------
Public Function GetYMD() As String
    GetYMD = Format(Date, "yyyymmdd")
End Function

'----------------------------------------------------
'■時刻を取得
'----------------------------------------------------
'戻り値:現在時刻
'----------------------------------------------------
Public Function GetTime() As String
    GetTime = Format(Time, "hhmmss")
End Function

'----------------------------------------------------
'■日時を取得
'----------------------------------------------------
'戻り値:現在日時
'----------------------------------------------------
Public Function GetNow() As String
    GetNow = Format(Now, "yyyymmdd_hhmmss")
End Function