#include <Array.au3>
#include <File.au3>
#include <Excel.au3>
Dim $aTotal[0][4] ; Конечный массив
$iCount = 0 ; Переменная для конечного массива
$sPath = @ScriptDir ; Путь к папке с файлами Excel
$sTotalName = "Итог.xlsx" ; Название итогового файла Excel
$aList = _FileListToArray($sPath, '*.xlsx') ; Берем список xlsx файлов в папке
_ArrayDelete($aList, $sTotalName) ; Удаляем из этого списка название итогового файла, если он есть
$oExcel = _Excel_Open() ; Открываем Excel
$iTotalTime = 0
For $iFile = 1 To UBound($aList) -1 ; Для каждого файла...
$oBook = _Excel_BookOpen($oExcel, $sPath & "\" & $aList[$iFile])
$aRange = _Excel_RangeRead($oBook) ; Читаем в массив содержимое файла Excel
For $iRow = 1 To UBound($aRange) -1 ; Проходим по каждой строчке массива, первую строчку пропускаем
If $aRange[$iRow][2] = "" Then ContinueLoop ; Пропускаем пустые строки
If $aRange[$iRow][2] = "OK" Then ; Записываем в конечный массив, если статус (третья строчка) = OK
ReDim $aTotal[$iCount +1][4] ; Расширяем массив
$aTotal[$iCount][0] = _ToDate($aRange[$iRow+1][0]) ; Записываем в первую колонку дату в следующей строчке
$aTotal[$iCount][1] = _ToDate($aRange[$iRow][0]) ; Во вторую колонку - дату в текущей строчке
$aTotal[$iCount][2] = "PROBLEM" ; На место статуса (третья колонка) записываем Problem
$aTotal[$iCount][3] = $aRange[$iRow+1][4] ; В четвертую колонку записываем Duration
;ConsoleWrite($aRange[$iRow+1][4] & ' ' & _ToSecond($aRange[$iRow+1][4]) & @CRLF)
$iTotalTime = $iTotalTime + _ToSecond($aRange[$iRow+1][4])
$iCount = $iCount + 1
EndIf
Next
_Excel_BookClose($oBook) ; Закрываем книгу
Next
ReDim $aTotal[$iCount +1][4] ; Запишем общее время
$aTotal[$iCount][3] = _SecondToTime($iTotalTime)
$aTotal[$iCount][2] = "Всего: "
$oBook = _Excel_BookOpen($oExcel, $sPath & "\" & $sTotalName) ; Открываем итоговый файл
If @error Then $oBook = _Excel_BookNew($oExcel) ; Или создаем новый
_Excel_RangeWrite($oBook, $oBook.Activesheet, $aTotal, "A1") ; Записать массив в книгу
_Excel_BookSaveAs($oBook, $sPath & "\" & $sTotalName) ; Сохранить книгу под именем итогового файла
Func _ToSecond($sTime) ; Переводит строку с временем в секунды. Например, из строки 3m 49s вернет 229
$aTime = StringSplit($sTime, ' ', 2)
$iValue = 0
For $iTime = 0 To UBound($aTime) -1
$sTmp = StringRight($aTime[$iTime], 1)
$aTime[$iTime] = StringTrimRight($aTime[$iTime], 1)
Switch $sTmp
Case 'd'
$iValue = $iValue + $aTime[$iTime] * 86400
Case 'h'
$iValue = $iValue + $aTime[$iTime] * 3600
Case 'm'
$iValue = $iValue + $aTime[$iTime] * 60
Case 's'
$iValue = $iValue + $aTime[$iTime]
EndSwitch
Next
Return $iValue
EndFunc
Func _ToDate($sStr) ; У меня Excel читает даты примерно как 20180418235301 , эта функция меняет формат даты обратно
Return StringLeft($sStr, 4) & '-' & StringMid($sStr, 5, 2) & '-' & StringMid($sStr, 7, 2) _
& ' ' & StringMid($sStr, 9, 2) & ':' & StringMid($sStr, 11, 2) & ':' & StringRight($sStr, 2)
EndFunc
Func _SecondToTime($iSecond) ; Формирует время из секунд, из 123 вернет 0.00:02:03 . Костыльно, конечно, но все же
If $iSecond >= 86400 Then
$iTmp = Floor($iSecond / 86400)
$iValue = $iTmp & '.'
$iSecond = $iSecond - $iTmp * 86400
Else
$iValue = '0.'
EndIf
If $iSecond >= 3600 Then
$iTmp = Floor($iSecond / 3600)
If $iTmp < 10 Then
$iValue = $iValue & '0' & $iTmp & ':'
EndIf
$iValue = $iValue & $iTmp & ':'
$iSecond = $iSecond - $iTmp * 3600
Else
$iValue = $iValue & '00:'
EndIf
If $iSecond >= 60 Then
$iTmp = Floor($iSecond / 60)
If $iTmp < 10 Then
$iValue = $iValue & '0'
EndIf
$iValue = $iValue & $iTmp & ':'
$iSecond = $iSecond - $iTmp * 60
Else
$iValue = $iValue & '00:'
EndIf
If $iSecond > 10 Then
Return $iValue & $iSecond
Else
Return $iValue & '0' & $iSecond
EndIf
EndFunc