回答No.1です。
添付画像のような表を作って、試してみましたが、一応、出来ていると思います。
ただし、各「日目」のデータの中で、「D」列に空白セルがあってはいけません。
それだけは、気をつけてください。
添付画像では、邪魔くさかったので、すべてに「abc」を入れていますが、「D」列以外は、空白セルがあっても、問題ありません。
Option Explicit
Sub Test()
Const d = 19
Dim c, i, j, k, l, p, r As Integer
Dim s As Worksheet
c = Worksheets.Count
Worksheets.Add After:=Worksheets(Worksheets.Count)
l = 2
For i = 1 To d
For j = 1 To c
Set s = Worksheets(j)
For k = 1 To s.Range("B" & s.Rows.Count).End(xlUp).Row
If s.Cells(k, 2).Value = i Then
p = s.Range("D" & k - 1).End(xlDown).Row
s.Range(s.Cells(k, 2), s.Cells(p, 10)).Copy Worksheets(c + 1).Range("B" & l)
l = l + p - k + 1
Exit For
End If
Next k
Set s = Nothing
Next j
Next i
End Sub
簡単なプログラムの説明です。
Const d = 19
「Const」は「定数」ですので、「d」の値は「19」固定です。
(「変数」ではないので、プログラムの途中で「d」の値を変えることは出来ません)
ここで「何日目」まであるのか、決めています。
もし、「20」日あるのでしたら、ここを「20」にすれば、「20」まで処理をします。
c = Worksheets.Count
シートの数を調べています。
Worksheets.Add After:=Worksheets(Worksheets.Count)
右端のシートの後ろに新たにシートを作成しています。
For i = 1 To d
「日目」を「1」から「d」まで行います。
For j = 1 To c
増やす前のシートを左端から順番に調べます。
Set s = Worksheets(j)
何番目のシートかを「s」に「Set」しています。
これで、イチイチ、「Worksheets(j).Cells(~」などとしなくても「s.Cells(~」で済みます。
For k = 1 To s.Range("B" & s.Rows.Count).End(xlUp).Row
「B」列の最終行を調べています。
If s.Cells(k, 2).Value = i Then
「i」すなわち、「日目」と一致する「B」列のセルを調べています。
p = s.Range("D" & k - 1).End(xlDown).Row
「日目」のデータの範囲を取得しています(何行目まで「何日目」のデータが入っているか)
ここで、「D」列に空白があってはいけません。
空白の手前のセルを「最終行」としています。
s.Range(s.Cells(k, 2), s.Cells(p, 10)).Copy Worksheets(c + 1).Range("B" & l)
「日目」の範囲を「コピー(記憶)」し、追加したシートに「ペースト(貼り付け)」しています。
l = l + p - k + 1
次に貼り付ける、最初の行を計算しています。
Exit For
「For」から抜け出しています。
以上です。
お礼
回答ありがとうございました、説明もついていてとても勉強になります。 今回の場合はD列の空白セルがNGということですね。D列だとそれが無理そうなので、他の列で空白がない列が作れるように考えて見ます。一回目のご回答に返信をしてしまいしたが、No.9232269 に再度表を添付いたしました。もし何かあればよろしくお願いします。。。