| 
    
     |  | データ的にはそんなに多く無いのでしょうから? 別なシートに集計表を作ったら?
 元のデータは、Sheet1に在るとします、先頭行は列見出しとします
 結果はSheet2に出力されます
 
 Option Explicit
 
 Public Sub Sample()
 
 Dim i As Long
 Dim j As Long
 Dim lngRows As Long
 Dim lngColumn As Long
 Dim lngColumns As Long
 Dim rngResult As Range
 Dim vntResult As Variant
 Dim vntData As Variant
 Dim lngMax As Long
 Dim lngMin As Long
 Dim dicIndex As Object
 Dim lngTop As Long
 Dim lngCount As Long
 Dim strProm As String
 
 '結果出力の先頭セル位置を基準とする(先頭列の列見出しのセル位置)
 Set rngResult = Worksheets("Sheet2").Cells(1, "A")
 
 'Dictionaryオブジェクトを取得
 Set dicIndex = CreateObject("Scripting.Dictionary")
 
 With Worksheets("Sheet1").UsedRange
 '日付の最小値、最大値を取得
 lngMin = Application.WorksheetFunction.Min(.Resize(, 1))
 lngMax = Application.WorksheetFunction.Max(.Resize(, 1))
 '行数、列数を取得
 lngRows = .Rows.Count
 lngColumns = .Columns.Count
 '結果用配列を確保
 ReDim vntResult(lngMax - lngMin + 1, 0)
 '配列の0列目に日付を記入
 For i = 1 To lngMax - lngMin + 1
 vntResult(i, 0) = i + lngMin - 1
 Next i
 'Listのデータ先頭〜最終まで繰り返し
 For i = 2 To lngRows
 'Listから1行分配列に取得
 vntData = .Cells(i, 1).Resize(, lngColumns).Value
 '配列の2列目〜最終列まで繰り返し
 For j = 2 To lngColumns
 '値がEmptyならForを脱出
 If IsEmpty(vntData(1, j)) Then
 Exit For
 End If
 'Dictionaryに登録が無い場合
 If Not dicIndex.Exists(vntData(1, j)) Then
 '登録番号を発番
 lngColumn = lngColumn + 1
 'Dictionaryにナンバーを登録
 dicIndex.Item(vntData(1, j)) = lngColumn
 '結果配列を拡張して、発番した列位置の
 '先頭行にナンバーをを書き込み
 ReDim Preserve vntResult(lngMax - lngMin + 1, lngColumn)
 vntResult(0, lngColumn) = vntData(1, j)
 End If
 '配列の日付行の該当番号位置に"*"を書き込み
 vntResult(CLng(vntData(1, 1)) - lngMin + 1, _
 dicIndex.Item(vntData(1, j))) = "*"
 Next j
 Next i
 End With
 
 '画面更新を停止
 Application.ScreenUpdating = False
 
 '結果を出力
 With rngResult
 .Parent.Cells.ClearContents
 '日付書式を設定
 .Resize(, UBound(vntResult, 1) + 1).NumberFormat = "m/d"
 '結果を出力
 .Resize(UBound(vntResult, 2) + 1, UBound(vntResult, 1) + 1).Value _
 = Application.Transpose(vntResult)
 '連続して三日以上の場合、BuckColorを変更
 For i = 1 To UBound(vntResult, 2)
 lngTop = 0
 lngCount = 0
 For j = 1 To UBound(vntResult, 1)
 If vntResult(j, i) <> "" Then
 If lngTop = 0 Then
 lngTop = j
 lngCount = 1
 Else
 lngCount = lngCount + 1
 End If
 Else
 If lngCount >= 3 Then
 .Offset(i, lngTop).Resize(, lngCount).Interior.ColorIndex = 34
 End If
 lngTop = 0
 lngCount = 1
 End If
 Next j
 If lngCount >= 3 Then
 .Offset(i, lngTop).Resize(, lngCount).Interior.ColorIndex = 34
 End If
 Next i
 .Parent.Columns.AutoFit
 End With
 
 strProm = "処理が完了しました"
 
 Wayout:
 
 '画面更新を再開
 Application.ScreenUpdating = True
 
 Set dicIndex = Nothing
 Set rngResult = Nothing
 
 MsgBox strProm, vbInformation
 
 End Sub
 
 |  |