excel_vba_KBs

'-----------------------------

' トリニティログ収集

' ver. 0.314159265358979323846

' 構成(2020/10/27)

'-----------------------------

' ■関数/Section一覧■

' 1) Global変数セクション // value

' 2) Sub 集計実行() // 集計ボタン・イベント

' 3) Sub Init() // 初期値 ()Global設定とtagシートのcopy)

' 4) Sub MainProc() // main処理

' 5) Function getCh2Name(strLogFileName) // ファイル名の先頭2文字でマスター登録タグかどうか判定

' 6) Function getTagName(strLogFileName) // ファイル名から、タグ名を(tag名またはblankを返却)

' 7) Sub setLogDataByTagName(strTag, strCh2, strFileNameSpec, TextBuff) //ログデータ処理= タグ名シートの、各フィールドへ○付け

' 8) sub newExcelBook() // 結果を新しい日付付きxlsxファイルに保存

' 9) sub addHistory() // 履歴の追記(log-fileリンクも)

'---------------------------------------------------------------------------------------------------------------------------------

'--------------

' // Global変数

'--------------

Option Explicit

'// フォルダ //

Public LogFolder

Public LogFile

Public MenuFolder

Public DeployFolder

'// テーブルデータを初期値投入用 //

Public TagName(4) As String

Public TagCh2(4) As String

Public FldMaster(4) As String

'-----------------

'// 集計ボタン //

'-----------------

Sub 集計実行()

Const FlgDebug = "no"

'// 実行リマインド(リリース時に有効化)

If FlgDebug = "no" Then

If vbYes <> MsgBox("集計を開始しますか?", vbYesNo) Then

Exit Sub

End If

End If

'// 初期処理 (マスターデータ設定値反映) //

Call Init

Call MainProc

End Sub

'--------------------------------------

'// 初期値Global設定とtagシートのcopy

'--------------------------------------

Sub Init()

Dim iCnt

'// [PathMaster]テーブル //

LogFolder = range("LogFolder").Value

LogFile = range("LogFile").Value

MenuFolder = range("MenuFolder").Value

DeployFolder = range("DeployFolder").Value

'// (1)フィールドマスター初期値

iCnt = 1

While iCnt <= 4

FldMaster(iCnt) = range("c25").ListObject.DataBodyRange(iCnt * 2 - 1)

iCnt = iCnt + 1

Wend

'// (2) タグ初期値

iCnt = 1

While iCnt <= 4

TagName(iCnt) = range("c18").ListObject.DataBodyRange(iCnt * 2)

TagCh2(iCnt) = range("c18").ListObject.DataBodyRange(iCnt * 2 - 1)

iCnt = iCnt + 1

Wend

'// (3) タグ名(template)からタグ名シートをcopy作成し、Listのレコード行を空に。

Dim tblData As ListObject

iCnt = 4

While iCnt >= 1

'□ sheetのコピー

'/debug:/ MsgBox TagName(iCnt) & "_template"

'/mod-1/ Worksheets(TagName(iCnt) & "_template").Copy After:=Worksheets("★Menu")

Worksheets("tag" & iCnt & "_template").Copy After:=Worksheets("★Menu")

ActiveSheet.Name = TagName(iCnt)

'/debug:/ MsgBox "/" & TagName(iCnt) & "/"

'□ リストテーブルの全レコード削除

Set tblData = ActiveSheet.range("A4").ListObject

If Not (tblData.DataBodyRange Is Nothing) Then

tblData.DataBodyRange.Delete

End If

iCnt = iCnt - 1

Wend

End Sub

'-----------------

'// (main) //

'-----------------

Sub MainProc()

Dim fso, pfl, strTag, allbuf, strCh2

'/---------------------

'/ ログフォルダのリストから...

'/---------------------

Set fso = New FileSystemObject

Set pfl = fso.getFolder(LogFolder)

Dim fl As Folder

For Each fl In pfl.SubFolders 'sub folder Layer

' /debug:/ MsgBox (fl.Name & " - " & fl.Path)

strTag = getTagName(fl.Name)

strCh2 = getCh2Name(fl.Name)

If strTag = "" Then '

'// スルー: タグが全部マッチしない場合、無視(by design) //

'/debug:/ MsgBox "NG:" & strTag & "," & fl.Name

Else

'/debug:/ MsgBox "OK: " & strTag & "," & fl.Name

'// Logfileのopenエラーならパス //

Dim TextBuff As String

Open fl.Path & "\" & LogFile For Input As #1

Do Until EOF(1)

Line Input #1, TextBuff

'1行処理

'/debug:/ allbuf = allbuf + TextBuff

'/----------------------------------------------------

'/ログデータ処理= タグ名シートの、各フィールドへ○付け

'/----------------------------------------------------

Call setLogDataByTagName(strTag, strCh2, fl.Name, TextBuff)

Loop

Close #1

End If

Next fl

Set fso = Nothing

ActiveWorkbook.Worksheets(1).Activate

Dim strNewFileFullName

strNewFileFullName = newExcelBook() '// 生成シートを、別ファイルの日付付きで、保存

Call addHistory(strNewFileFullName) '// 履歴の追記

'// 集計結果をすぐ開く //

Dim iCode As Integer

iCode = MsgBox("★ 集計完了 ★" & vbCrLf & "集計結果excelを開きますか?" & vbCrLf & " → [ " & strNewFileFullName & " ]", vbYesNo + vbQuestion, "確認")

If iCode = vbYes Then

Workbooks.Open strNewFileFullName

ActiveWorkbook.Worksheets(1).Activate

End If

'------------------

End Sub

'-------------------------------------------------------------------------------

'// ファイル名の先頭2文字でマスター登録タグかどうか判定(ch2名またはblankを返却)

'-------------------------------------------------------------------------------

Function getCh2Name(strLogFileName)

Dim strCh, iCnt

getCh2Name = ""

strCh = Left(strLogFileName, 2)

'/ 初期globalで確認,なければNulを返す /

iCnt = 1

While iCnt <= 4

If strCh = TagCh2(iCnt) Then

getCh2Name = strCh

Exit Function

End If

iCnt = iCnt + 1

Wend

End Function

'------------------------------------------------------

'// ファイル名から、タグ名を(tag名またはblankを返却)

'------------------------------------------------------

Function getTagName(strLogFileName)

Dim strCh, iCnt

getTagName = ""

strCh = Left(strLogFileName, 2)

'/ 初期globalで確認,なければNulを返す /

iCnt = 1

While iCnt <= 4

If strCh = TagCh2(iCnt) Then

getTagName = TagName(iCnt)

Exit Function

End If

iCnt = iCnt + 1

Wend

End Function

'-------------------------------------------------------

'// ログデータ処理= タグ名シートの、各フィールドへ○付け

'-------------------------------------------------------

Sub setLogDataByTagName(strTag, strCh2, strFileNameSpec, TextBuff)

Dim strSheetName, strHostName, strDateTime, strFldNameALL, strStat, tblData, tagetRange, fooR, iNext, iFld, iR, flgNamed, cntNew, tmpStr

strSheetName = strTag '/ シート名特定

strHostName = strFileNameSpec '/ ホスト名

strDateTime = Left(TextBuff, 22) '/ ログ日時

strFldNameALL = Mid(TextBuff, 24) '/ フィールド文字列+(開始or終了)

strStat = Right(strFldNameALL, 3) '/ 終了判定文字

Dim GF

GF = 1

If strStat = "終了 " Then

Worksheets(strSheetName).Activate '/// MsgBox "/" & ActiveSheet.Name & "/"

flgNamed = 0

With range("A4").ListObject

For iR = 1 To .ListColumns(1).range.Count '/ excel Table-Listのデータカウンタ

If .ListColumns(3).range(iR) = strHostName Then

'/ 既存=ホスト名データが既にある場合 /

flgNamed = 1

.ListColumns(1).range(iR) = iR - 1

.ListColumns(2).range(iR) = strDateTime

.ListColumns(3).range(iR) = strHostName

.ListColumns(4).range(iR) = "=IF(4=COUNTIF($E" & iR + 3 & ":$H" & iR + 3 & "," & """" & "○" & """" & ")," & """" & "○" & """" & "," & """" & "×" & """" & ")"

For iFld = 1 To 4 '/フィールド文字列の判定/

If FldMaster(iFld) & "終了 " = strFldNameALL Then

.ListColumns(3 + 1 + iFld).range(iR) = "○"

End If

Next iFld

End If

Next iR

If flgNamed = 0 Then

'/ 新規=ホスト名データの行を追加

range("A4").ListObject.ListRows.Add

cntNew = range("A4").ListObject.ListRows.Count

With range("A4").ListObject.ListRows(cntNew)

.range(1) = cntNew - 1

.range(2) = strDateTime

.range(3) = strHostName

.range(4) = "=IF(4=COUNTIF($E" & cntNew + 3 & ":$H" & cntNew + 3 & "," & """" & "○" & """" & ")," & """" & "○" & """" & "," & """" & "×" & """" & ")"

For iFld = 1 To 4

'// 終端判定 //

If FldMaster(iFld) & "終了 " = strFldNameALL Then

.range(3 + 1 + iFld) = "○"

End If

Next iFld

End With

End If

End With

Else

'// 無視 //

End If

End Sub

'---------------------------------------------------

'// 生成したデータシートを、日付付きのbookとして保存

'---------------------------------------------------

Function newExcelBook()

Dim iCnt, newBookFileName

For iCnt = 1 To 4

If iCnt = 1 Then

Workbooks.Add

End If

ThisWorkbook.Sheets(TagName(iCnt)).Move After:=ActiveWorkbook.Sheets(Sheets.Count)

Next iCnt

Application.DisplayAlerts = False

ActiveWorkbook.Sheets(1).Delete '余計なシート

Application.DisplayAlerts = True

ActiveWorkbook.Worksheets(1).Activate

newBookFileName = DeployFolder & "\" & "Trinity_ログ集計_" & Format(Now(), "yyyy-mm-dd_hh-mm-ss") & ".xlsx"

ActiveWorkbook.SaveAs newBookFileName

ActiveWorkbook.Close

newExcelBook = newBookFileName

End Function

'--------------------------------

'// 履歴の追記(HyperLinkも)

'--------------------------------

Sub addHistory(newBookFileName)

Dim cntNew

ActiveWorkbook.Worksheets(1).Activate

'// 履歴の追記 // C57 テーブル

range("C32").ListObject.ListRows.Add

cntNew = range("C32").ListObject.ListRows.Count

With range("C32").ListObject.ListRows(cntNew)

.range(1) = Format(Now(), "yyyy/mm/dd hh:mm:ss")

.range(2) = newBookFileName

.range(2).Hyperlinks.Add Anchor:=.range(2), Address:=.range(2).Value

End With

End Sub

'//EOF//