- 締切済み
VBA教えてください。初心者です。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Prome_Lin
- ベストアンサー率42% (201/470)
回答No.1です。 もし、「E」列が空白がないのであれば、 p = s.Range("D" & k - 1).End(xlDown).Row の「s.Range("E" & k - 1)」と、「p」のところの「D」を「E」に変えるだけです。 実際のデータは、質問者の使いやすいように作ってください。 対応は、プログラムの方で、対応します。 「No.9232269」拝見しました。 勉強、がんばってください。
- Prome_Lin
- ベストアンサー率42% (201/470)
回答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」から抜け出しています。 以上です。
- Prome_Lin
- ベストアンサー率42% (201/470)
すみません、空白では、チェックができません。 例えば、添付画像の19行目が「5日目」ですが、B列、C列は、その下、もしかしたら、ずっと、空白かも知れないので、空白では判断ができません。 できれば、添付画像にすべて「abc」でいいので、文字を入れて、再度アップロードして頂けないでしょうか? そのとき、重要なのは、空白があり得る列には、必ず空白セルも入れておき、「空白があり得る」ことを明確にし、空白があり得ない列(これが重要)は、必ずセルを埋めて頂ければ、こちらで判断します。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは 実態が把握出来ていないですけど、 Sub test() Dim sh As Worksheet Dim tsh As Worksheet Dim r As Range Dim i As Long Application.ScreenUpdating = False Set tsh = Worksheets.Add i = 1 '括弧内は実際のシート名に変更する For Each sh In Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")) For Each r In sh.Range("B:B").SpecialCells(xlCellTypeConstants) If IsNumeric(r) Then With r.CurrentRegion.Offset(1) .Copy tsh.Cells(i, 1) i = i + .Rows.Count End With End If Next Next Application.ScreenUpdating = True End Sub これでうまく行くかテストブックで試して下さい。
お礼
質問No.9232269 に再度表を添付いたしました。悪文の質問にも関わらずご解答ありがとうございます。ためしたのですが、私の質問文が悪いので結果は思うようにはいきませんでした。もし、再度新しい表をご覧頂いて分かれば、アドバイスをお願いします。
- Prome_Lin
- ベストアンサー率42% (201/470)
質問が漠然としていて、マクロを組むには、情報が少なすぎます。 まず、B列の数字(日)のある行の1つ上の行が、必ず項目行なのですか? すなわち、必ず、B列の数字のある行が、具体的データの最初の行なのでしょうか? (例えば、添付図の例でいうと、3行目に日の数字があるので、2行目が項目行で、数字のある、3行目から、データが入っている、とか、もっと、判断する材料がないとマクロが組めません)。 次に、添付図を見ると、「H」列も何か入りそうですが、「H」列には項目名がありません。 そうすると、どこまでの列にデータが入っているのかを判断することが極めて難しくなります。 質問文のように、列が決まっているのでしたら、最終は何列か具体的に書いてください。 添付図では、「I」列以降がどうなっているのか分からないですし、項目やデータが必ず入っているかいないかで、マクロの組み方が変わります。 最後に、実際のデータ部分です。 例えば、4日目の実際のデータが3行だったとします。 ことのき、どうやって3行と判断すればいいのですか? 例えば、「D」列には必ず文字が入るので、その列のデータがなくなれば、その「何日目」は、最終行と判断できる、とかです。 (添付図で言うと、12行目に「4」とありますね。12行目から実際のデータが入り、そこから3行(14行目まで)、データが入るとします。このとき、「D」列には、必ず文字が入るのでしたら、「D」列を調べてゆき、空白セルが見つかると、「4日目」が終わったと、判断できるのですが、どの列のデータも、入ったり入らなかったりですと、判断が難しいです。) どの列も、データが入ったり入らなかったりだと、判断させるのが極めて困難ですので、この列だけは、必ず文字が入ります、というのがなければ、恐ろしく複雑なプログラムになってしまいます。 人間の目で見れば、簡単に判断できることでも、プログラムを書く場合は、目で見るようなやり方は出来ないので、もっと、詳しくどんな表か書いてください。
お礼
質問No.9232269 で再度表を添付しました。もしお時間あればアドバイスをお願い致します。一番最初に回答していただき、本当にありがとうございました。
補足
早速のお返事ありがとうございました。初心者のため、情報が足りないのもわかりませんでした。大変すみません。 -表の最初の一行目は項目行です。(ただ一つの表につなげるときにはその項目行は不要です。) -B列からJ列まで文字がはいります。(B,C列は行程何日目かと、日付なので1つの表に1つしかはいりません。) -行の最初、終わりを判断するのはB列かC列です。行程の1日目ならB列に1、C列に日付がかいてあり、あとはB列とC列は空白です。 -行の数はは行程の日ごとによって変わります。 他にまだわからないことありましたら、お願いします。。
お礼
回答ありがとうございました、説明もついていてとても勉強になります。 今回の場合はD列の空白セルがNGということですね。D列だとそれが無理そうなので、他の列で空白がない列が作れるように考えて見ます。一回目のご回答に返信をしてしまいしたが、No.9232269 に再度表を添付いたしました。もし何かあればよろしくお願いします。。。