| 
    
     |  | こんなやり方かな? ただし、「その月の出席数」が全員無い場合その列は作られません
 以下を標準モジュールに記述して下さい
 
 Option Explicit
 
 Public Sub Classification()
 
 Dim i As Long
 Dim vntData As Variant
 Dim wksWrite As Worksheet
 Dim lngWriteRow As Long
 Dim vntRowKey As Variant
 Dim wksRead As Worksheet
 Dim lngRow As Long
 Dim lngTop As Long
 Dim lngEnd As Long
 Dim lngFound As Long
 Dim lngOver As Long
 
 '読み込むシートを設定
 Set wksRead = Worksheets("Sheet1")
 
 '書き込むシートを設定
 Set wksWrite = Worksheets("Sheet2")
 '「年度・月」の見だし行を設定
 lngRow = 1
 '「年度・月」の先頭列を設定
 lngTop = 2
 '「年度・月」の最終列を設定
 lngEnd = 2
 '書き込み行を設定
 lngWriteRow = 1
 
 For i = 1 To wksRead.Cells(65536, 1).End(xlUp).Row
 '1行配列に読み込み
 With wksRead
 vntData = Range(.Cells(i, 1), .Cells(i, 3)).Value
 End With
 'シートに書き込み
 With wksWrite
 '「年度・月」列を探索
 lngFound = ColumnSearch(vntData(1, 2), _
 .Cells(lngRow, _
 lngTop).Resize(, lngEnd), lngOver)
 '「年度・月」が見つからない場合
 If lngFound = 0 Then
 '挿入位置に列を挿入
 .Columns(lngOver).Insert
 '発見位置を挿入位置に
 lngFound = lngOver
 '挿入位置に「年度・月」を書き込み
 .Cells(lngRow, lngFound).Value = vntData(1, 2)
 '「年度・月」列の最終列を更新
 lngEnd = lngEnd + 1
 End If
 'もし、前の「生徒の出席番号」と違うなら
 If vntData(1, 1) <> vntRowKey Then
 '書き込み行を更新
 lngWriteRow = lngWriteRow + 1
 '書き込み行の第1列に「生徒の出席番号」を書き込む
 .Cells(lngWriteRow, 1).Value = vntData(1, 1)
 '前の「生徒の出席番号」を更新
 vntRowKey = vntData(1, 1)
 End If
 '「生徒の出席番号」行と「年度・月」列の交差するセルに
 '「その月の出席数」を書き込み
 .Cells(lngWriteRow, lngFound).Value = vntData(1, 3)
 End With
 Next i
 'コメントを書く列を挿入
 With wksWrite
 For i = lngEnd - 1 To lngTop + 1 Step -1
 .Columns(i).Insert
 Next i
 End With
 
 '読み込むシートの参照を破棄
 Set wksRead = Nothing
 '書き込むシートの参照を破棄
 Set wksWrite = Nothing
 
 End Sub
 
 Private Function ColumnSearch(vntKey As Variant, _
 rngScope As Range, _
 Optional lngOver As Long) As Long
 
 Dim vntFind As Variant
 Dim lngDataTop As Long
 
 '範囲先頭列位置
 lngDataTop = rngScope.Column
 lngOver = lngDataTop
 'Matchによる二分探索
 vntFind = Application.Match(vntKey, rngScope, 1)
 'もし、エラーで無いなら
 If Not IsError(vntFind) Then
 'もし、Key値と探索位置の値が等しいなら
 If vntKey = rngScope(1, vntFind).Value Then
 '戻り値として、列位置を代入
 ColumnSearch = lngDataTop + vntFind - 1
 End If
 'Key値を超える最小値のある列
 lngOver = lngDataTop + vntFind
 Else
 lngOver = lngDataTop
 End If
 
 End Function
 
 |  |