| 
    
     |  | こんなのでは 
 ListはSheet1のA1から始まり、結果はSheet2に出力されます
 Sheet1には、列見出しが有る物とします
 
 Option Explicit
 
 Public Sub Sample()
 
 '元々のデータ列数(A列〜C列)
 Const clngColumns As Long = 3
 '「コード」の有る列(A列のA列からの列Offset)
 Const clngGroup1 As Long = 1
 '「日付」の有る列(B列のA列からの列Offset)
 Const clngGroup2 As Long = 0
 
 Dim i As Long
 Dim lngRows As Long
 Dim lngTop As Long
 Dim lngWright As Long
 Dim rngList As Range
 Dim rngResult As Range
 Dim vntGroup As Variant
 Dim strProm As String
 
 'Listの先頭セル位置を基準とする(A列の列見出しのセル位置)
 Set rngList = Worksheets("Sheet1").Cells(1, "A")
 
 '結果出力の位置を設定
 Set rngResult = Worksheets("Sheet2").Cells(1, "A")
 
 '画面更新を停止
 Application.ScreenUpdating = False
 
 With rngList
 '行数の取得
 lngRows = .Offset(Rows.Count - .Row, clngGroup1).End(xlUp).Row - .Row
 If lngRows <= 0 Then
 strProm = "データが有りません"
 GoTo Wayout
 End If
 'データに連番を付与(最終列の後ろに)
 .Offset(, clngColumns).EntireColumn.Insert
 With .Offset(1, clngColumns)
 .Value = 1
 .Resize(lngRows).DataSeries _
 Rowcol:=xlColumns, Type:=xlLinear, _
 Date:=xlDay, Step:=1, Trend:=False
 End With
 'データを「コード」、「日付」列をKeyとして整列
 .Offset(1).Resize(lngRows, clngColumns + 1).Sort _
 Key1:=.Offset(, clngGroup1), Order1:=xlAscending, _
 Key2:=.Offset(, clngGroup2), Order2:=xlDescending, _
 Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
 Orientation:=xlTopToBottom, SortMethod:=xlStroke
 '「コード」列データを配列に取得
 vntGroup = .Offset(1, clngGroup1).Resize(lngRows + 1).Value
 End With
 
 '注目値の位置を記録
 lngTop = 1
 '先頭データを出力
 For i = 2 To lngRows + 1
 '注目値と現在値が違った場合
 If vntGroup(lngTop, 1) <> vntGroup(i, 1) Then
 'データを転記
 lngWright = lngWright + 1
 rngList.Offset(lngTop).Resize(, clngColumns).Copy _
 Destination:=rngResult.Offset(lngWright)
 '注目値の位置を記録
 lngTop = i
 End If
 Next i
 
 'データ位置の復帰
 With rngList
 'データを「コード」、「日付」列をKeyとして整列
 .Offset(1).Resize(lngRows, clngColumns + 1).Sort _
 Key1:=.Offset(, clngColumns), Order1:=xlAscending, _
 Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
 Orientation:=xlTopToBottom, SortMethod:=xlStroke
 '連番削除
 .Offset(, clngColumns).EntireColumn.Delete
 End With
 
 strProm = "処理が完了しました"
 
 Wayout:
 
 '画面更新を再開
 Application.ScreenUpdating = True
 
 Set rngList = Nothing
 Set rngResult = Nothing
 
 MsgBox strProm, vbInformation
 
 End Sub
 
 |  |