| 
    
     |  | こんな手順で出来ると思います 
 1、Sheets("data")を、「NAME」昇順、「BUDHO」昇順、「CODE」昇順、「TYPE」昇順で整列
 2、DataListの先頭行を取り出す
 3、DataListの2行目を取り出す
 4、1行目と2行目の「NAME,BUDHO,CODE,TYPE」を其々比較する
 5、もし、1項目でも違うなら、1行目をSheets("data編集")へ出力
 6、3行目を取り出し、2行目と3行目の比較を行う
 7、項目全てが同じなら、2行目の「TIME」に3行目の「TIME」を加算
 8、4行目を取り出し、2行目と比較、1項目でも違うなら、2行目をSheets("data編集")へ出力
 9、此れを最終行の下まで行う(最終行の下の行をダミーデータとして使う)
 
 Option Explicit
 Option Compare Text
 
 Public Sub Sample()
 
 '◆DataListのデータ列数(A列〜F列)
 Const clngColumns As Long = 6
 
 Dim i As Long
 Dim j As Long
 Dim lngRow As Long
 Dim lngRows As Long
 Dim rngList As Range
 Dim rngResult As Range
 Dim vntResult As Variant
 Dim vntData As Variant
 Dim strProm As String
 
 '◆DataListの先頭セル位置を基準とする(A列の列見出しのセル位置)
 Set rngList = Worksheets("data").Cells(1, "A")
 
 '◆出力Listの先頭セル位置を基準とする(A列の列見出しのセル位置)
 Set rngResult = Worksheets("data編集").Cells(1, "A")
 
 '画面更新を停止
 '  Application.ScreenUpdating = False
 
 '"data編集"に就いて
 With rngResult
 '行数の取得(行末位置取得)
 lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
 '結果を消去
 If lngRows >= 1 Then
 .Offset(1).Resize(lngRows, clngColumns).ClearContents
 End If
 End With
 
 '"data"に就いて
 With rngList
 '行数の取得(行末位置取得)
 lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
 If lngRows <= 0 Then
 strProm = "データが有りません"
 GoTo Wayout
 End If
 'データを「TYPE」昇順で整列
 .Offset(1).Resize(lngRows, clngColumns).Sort _
 Key1:=.Offset(1, 4), Order1:=xlAscending, _
 Header:=xlNo, OrderCustom:=1, _
 MatchCase:=False, Orientation:=xlTopToBottom, _
 SortMethod:=xlStroke
 'データを「NAME」昇順、「BUDHO」昇順、「CODE」昇順で整列
 .Offset(1).Resize(lngRows, clngColumns).Sort _
 Key1:=.Offset(1, 1), Order1:=xlAscending, _
 Key2:=.Offset(1, 2), Order2:=xlAscending, _
 Key3:=.Offset(1, 3), Order3:=xlAscending, _
 Header:=xlNo, OrderCustom:=1, _
 MatchCase:=False, Orientation:=xlTopToBottom, _
 SortMethod:=xlStroke
 End With
 
 '先頭行を配列に取得
 vntResult = rngList.Offset(1).Resize(, clngColumns).Value
 '2行目以降最終行+1まで繰り返し
 For i = 2 To lngRows + 1
 '1行分データを取得
 vntData = rngList.Offset(i).Resize(, clngColumns).Value
 '前の行と「NAME,BUDHO,CODE,TYPE」を比較
 For j = 2 To 5
 '内容が違うならForを抜ける
 If vntResult(1, j) <> vntData(1, j) Then
 Exit For
 End If
 Next j
 '内容が違う場合
 If j <= 5 Then
 '集計用配列(前の行データ)を"data編集"に出力
 lngRow = lngRow + 1
 rngResult.Offset(lngRow).Resize(, clngColumns).Value = vntResult
 '集計用配列に現在データを代入
 vntResult = vntData
 Else
 '集計用配列の「TIME」の列に現在行の「TIME」の列を加算
 vntResult(1, 6) = vntResult(1, 6) + vntData(1, 6)
 End If
 Next i
 
 strProm = "処理が完了しました"
 
 Wayout:
 
 '画面更新を再開
 Application.ScreenUpdating = True
 
 Set rngList = Nothing
 Set rngResult = Nothing
 
 MsgBox strProm, vbInformation
 
 End Sub
 
 |  |