> 行数は固定ではなく、バラバラです。
バラバラのパターンです。ただし、各シートのB列の最後の番号の入った行より下で一行データのない行があると、その上の行までしかその行程と認識しません。
たとえば、17行目から25行目までが一行程だけど20行目のB20からJ20までまるまるデータのない場合19行目までがその行程となります。20行目のBからJまでのどこかのセルにデータがあれば大丈夫です。
Sub Example()
Dim buf As Variant
Dim OrigLastRow As Long, MatchRow As Long, LastRow As Long, RangeLastRow As Integer
Dim i As Integer, j As Integer
Dim OrderAry() As Integer
Dim ws(3) As Worksheet, NewSh As Worksheet
Set NewSh = Sheets("新しいシート")
'実際の並んだデータを作成するシート名に変更してください。
'自動では作成されません毎回同じシートを利用します。
Set ws(0) = Sheets("Sheet1")
Set ws(1) = Sheets("Sheet2")
Set ws(2) = Sheets("Sheet3")
Set ws(3) = Sheets("Sheet4")
'実際の4つのシート名を記載してください。
Application.ScreenUpdating = False
With NewSh
.Range(.Cells(1, "A"), .Cells(.Cells.SpecialCells(xlCellTypeLastCell).Row, "J")).Clear
End With
With ws(0)
LastRow = .Cells(Rows.Count, "B").End(xlUp).Row
OrigLastRow = .Cells(LastRow, "B").CurrentRegion.Item(.Cells(LastRow, "B").CurrentRegion.Count).Row
End With
For i = 1 To 3
With ws(i)
LastRow = .Cells(Rows.Count, "B").End(xlUp).Row
.Range(.Cells(2, "B"), .Cells(.Cells(LastRow, "B").CurrentRegion.Item(.Cells(LastRow, "B").CurrentRegion.Count).Row, "J")).Copy
LastRow = ws(0).Cells(Rows.Count, "B").End(xlUp).Row
ws(0).Cells(ws(0).Cells(LastRow, "B").CurrentRegion.Item(ws(0).Cells(LastRow, "B").CurrentRegion.Count).Row + 1, "B").PasteSpecial
End With
Next i
j = 0
With ws(0)
For i = 2 To .Cells(Rows.Count, "B").End(xlUp).Row
If .Cells(i, "B") <> "" Then
ReDim Preserve OrderAry(j)
OrderAry(j) = .Cells(i, "B").Value
j = j + 1
End If
Next i
End With
For i = LBound(OrderAry) To UBound(OrderAry)
For j = UBound(OrderAry) To i Step -1
If OrderAry(i) > OrderAry(j) Then
buf = OrderAry(i)
OrderAry(i) = OrderAry(j)
OrderAry(j) = buf
End If
Next j
Next i
With ws(0)
For i = LBound(OrderAry) To UBound(OrderAry)
MatchRow = WorksheetFunction.Match(OrderAry(i), .Range("B:B"), 0)
LastRow = .Cells(Rows.Count, "B").End(xlUp).Row
LastRow = .Cells(LastRow, "B").CurrentRegion.Item(.Cells(LastRow, "B").CurrentRegion.Count).Row
If .Cells(MatchRow, "B").End(xlDown).Row <= LastRow Then
RangeLastRow = .Cells(MatchRow, "B").End(xlDown).Row - 1
Else
RangeLastRow = LastRow
End If
If NewSh.Cells(1, "B").Value = "" Then
.Range(.Cells(MatchRow, "B"), .Cells(RangeLastRow, "J")).Copy _
NewSh.Cells(1, "B")
Else
.Range(.Cells(MatchRow, "B"), .Cells(RangeLastRow, "J")).Copy
With NewSh
LastRow = .Cells(Rows.Count, "B").End(xlUp).Row
.Cells(.Cells(LastRow, "B").CurrentRegion.Item(.Cells(LastRow, "B").CurrentRegion.Count).Row + 1, "B").PasteSpecial
End With
End If
Next i
.Activate
LastRow = .Cells(Rows.Count, "B").End(xlUp).Row
LastRow = .Cells(LastRow, "B").CurrentRegion.Item(.Cells(LastRow, "B").CurrentRegion.Count).Row
.Range(.Cells(OrigLastRow + 1, "B"), .Cells(LastRow, "J")).Clear
.Cells(1, 1).Select
End With
Application.CutCopyMode = False
NewSh.Activate
NewSh.Cells(1, 1).Select
Application.ScreenUpdating = True
End Sub
お礼
セルが結合されている場合もあると思います。添付ファイルが見づらくてすみませんでした。私には難しいプログラムなんですが、解読して理解できるように頑張ります。