• 締切済み

VBA教えてください。初心者です。

複数シートにまたがる、小さな表を順番通りにつなげて一つの表にしたいです。 旅行の1日ごとの行程表が、4シートに分かれてばらばらに書いてあります。 列数は同じです。B列に何日目の数字が入っています。行程は19日ほどあり、1日目から順番にコピペをして新しいシートにつなげた表をつくりたいです。 よろしくおねがいします。

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.5

回答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.4

回答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」から抜け出しています。 以上です。

542000
質問者

お礼

回答ありがとうございました、説明もついていてとても勉強になります。 今回の場合はD列の空白セルがNGということですね。D列だとそれが無理そうなので、他の列で空白がない列が作れるように考えて見ます。一回目のご回答に返信をしてしまいしたが、No.9232269 に再度表を添付いたしました。もし何かあればよろしくお願いします。。。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

すみません、空白では、チェックができません。 例えば、添付画像の19行目が「5日目」ですが、B列、C列は、その下、もしかしたら、ずっと、空白かも知れないので、空白では判断ができません。 できれば、添付画像にすべて「abc」でいいので、文字を入れて、再度アップロードして頂けないでしょうか? そのとき、重要なのは、空白があり得る列には、必ず空白セルも入れておき、「空白があり得る」ことを明確にし、空白があり得ない列(これが重要)は、必ずセルを埋めて頂ければ、こちらで判断します。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは 実態が把握出来ていないですけど、 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 これでうまく行くかテストブックで試して下さい。

542000
質問者

お礼

質問No.9232269 に再度表を添付いたしました。悪文の質問にも関わらずご解答ありがとうございます。ためしたのですが、私の質問文が悪いので結果は思うようにはいきませんでした。もし、再度新しい表をご覧頂いて分かれば、アドバイスをお願いします。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

質問が漠然としていて、マクロを組むには、情報が少なすぎます。 まず、B列の数字(日)のある行の1つ上の行が、必ず項目行なのですか? すなわち、必ず、B列の数字のある行が、具体的データの最初の行なのでしょうか? (例えば、添付図の例でいうと、3行目に日の数字があるので、2行目が項目行で、数字のある、3行目から、データが入っている、とか、もっと、判断する材料がないとマクロが組めません)。 次に、添付図を見ると、「H」列も何か入りそうですが、「H」列には項目名がありません。 そうすると、どこまでの列にデータが入っているのかを判断することが極めて難しくなります。 質問文のように、列が決まっているのでしたら、最終は何列か具体的に書いてください。 添付図では、「I」列以降がどうなっているのか分からないですし、項目やデータが必ず入っているかいないかで、マクロの組み方が変わります。 最後に、実際のデータ部分です。 例えば、4日目の実際のデータが3行だったとします。 ことのき、どうやって3行と判断すればいいのですか? 例えば、「D」列には必ず文字が入るので、その列のデータがなくなれば、その「何日目」は、最終行と判断できる、とかです。 (添付図で言うと、12行目に「4」とありますね。12行目から実際のデータが入り、そこから3行(14行目まで)、データが入るとします。このとき、「D」列には、必ず文字が入るのでしたら、「D」列を調べてゆき、空白セルが見つかると、「4日目」が終わったと、判断できるのですが、どの列のデータも、入ったり入らなかったりですと、判断が難しいです。) どの列も、データが入ったり入らなかったりだと、判断させるのが極めて困難ですので、この列だけは、必ず文字が入ります、というのがなければ、恐ろしく複雑なプログラムになってしまいます。 人間の目で見れば、簡単に判断できることでも、プログラムを書く場合は、目で見るようなやり方は出来ないので、もっと、詳しくどんな表か書いてください。

542000
質問者

お礼

質問No.9232269 で再度表を添付しました。もしお時間あればアドバイスをお願い致します。一番最初に回答していただき、本当にありがとうございました。

542000
質問者

補足

早速のお返事ありがとうございました。初心者のため、情報が足りないのもわかりませんでした。大変すみません。 -表の最初の一行目は項目行です。(ただ一つの表につなげるときにはその項目行は不要です。) -B列からJ列まで文字がはいります。(B,C列は行程何日目かと、日付なので1つの表に1つしかはいりません。) -行の最初、終わりを判断するのはB列かC列です。行程の1日目ならB列に1、C列に日付がかいてあり、あとはB列とC列は空白です。 -行の数はは行程の日ごとによって変わります。 他にまだわからないことありましたら、お願いします。。

関連するQ&A

  • VBA教えてください。初心者です。続きです。

    前回の質問No.9231449、補足で新しい画像を添付します。 ご覧いただけるとおわかりだと思いますが、ランダムに旅行行程がならんでいるので、それを順番通りに並び替えたいです。4つのシートにばらばらになっています。添付のシートは一枚目のシートで、B列が順番なのですが2.3.5.6.10.。。と並んでおり、二枚目のシートは3.8、三枚目のシートは1.9というように、複数のシートにちらばって順不同でならんでいるので、新しいシートに順番通りにつなげられるVBAがあれば、教えてください。

  • VBA 範囲指定してコピー&ペーストしたい

    WindowsXP SP2 Office2003 を使っています。 ExcelVBAで、 シート「Sheet1」のセル(B9:B40)を範囲選択してコピーし、 シート「Sheet2」のセル(A2:A33)に貼り付けをしたいのです。 行数は毎月増えていきます。 例えば、1月が9から40でしたら、2月は41から70、3月は71から102・・・ B列だけだったら、Range("B" & tateA & " :B" & tateB).Select で記述できますが、 列は、7個ずつ増えた列数の情報を取得したいのです。 Sheet1では、B列から始まり7個ずつ列数が増え、I列(I9:I40)、P列(P9:P40)、W列(W9:W40)・・・の値を Sheet2のB列、C列、D列に値ベースで貼り付けするマクロを考えています。 (Sheet2の列数は1個ずつ増えます。) ざっくりになりますが表のイメージとしては、 Sheet1にはカテゴリ毎に複数の項目があり、 Sheet2にはSheet1のカテゴリ毎の合計値だけを一覧にし、見やすく表示させたいのです。 1回の処理では1ヶ月分の処理を行うため、行情報は9から40で固定なのですが、 列番号は一定の数増えたものを変数にしたいのですが、表示の仕方が分かりません。 ようは『Range("B" & tateA & " :B" & tateB).Select』 の列表示のBも変数にして、 その変数を7個ずつ増やして処理をしたいのです。 説明がうまく出来なくて申し訳ないのですが、 列と行を変数にした表示の仕方を分かる方がいましたら、教えてください。 よろしくお願いします。

  • エクセルの表引き

    こんにちは いつもお世話になっています。 Sheet1に以下の表があります。 すみません、表示がうまくいかず、A列には文字列、B列には数字が入ります。 A列に数字があるように表示されていましたらB列に表示されているものとしてみてください。 Sheet1 A        B 和歌山    2 愛知    3 東京    1 大阪    2 栃木    1 石川    3 A列のデータに重複はなく、B列のデータには重複があります。 B列の数字を検索値として振り分けるような形でA列の値を表引きしたいです。 表引き先は Sheet2のB列の複数セルに1が入力済みの状態。 Sheet3のB列の複数セルに2が入力済みの状態。 Sheet4のB列の複数セルに3が入力済みの状態。 例えば Sheet2 A        B    1    1    1    1    1 Sheet3 A        B    2    2    2    2    2 Sheet4 A        B    3    3    3    3    3 以上の各シートが以下のようになるようにしたいです。 Sheet2 A     B 東京 1 栃木 1 1 1 1 Sheet3 A     B 和歌山 2 大阪 2 2 2 2 Sheet4 A     B 愛知 3 石川 3 3 3 3 Sheet2-4のA列に各B列のデータに一致する値をSheet1から表引きしたいです。例えばSheet2に関して、東京、栃木と出てしまったら後のA列は空欄になるようにしたいです。A列数字が表示されていたらB列にあるものとしてください。 フィルタとかでの手作業でなく、何とか関数で持ってこられないでしょうか。 作業列とか必要でしたら教えてください。 わかりにくい表現ですみません。 よろしくお願いします。

  • VBAについて教えてください。

    下記の手順でVBAを組みたいのですが どのようにすればよいかご教示いただけないでしょうか。 手順 (1)【A様sheet】>E9に入っている数字を<請求書sheet>E11にコピペ。 (2)【A様sheet】>J9に入っている数字を<請求書sheet>E12にコピペ。 (3)【A様sheet】>E3に入っている数字を<請求書sheet>E13にコピペ。 (4)<請求書sheet>E13に―100。  (5)【A様sheet】>A1に入っている文字列を<請求書sheet>C11以下にコピペ。 ※(2)が〈0〉だった場合には何も入力せず、(3)に進む。 ※(4)-100は固定数値です。 ※(5)は数字が入った分だけ繰り返します。 完成系は添付の画像のような結果です。 毎月数100件の処理が発生するためVBAで行いたいと思っています。 どうぞよろしくお願いいたします。

  • エクセルVBAのコードの書き方を教えてください

    エクセルVBAの初心者です。 下記①-⑲のようなコードを書きたいのですが、どなたかお分かりになる方がいましたら、 ご教示いただけますと幸いです。 ① オートフィルターでシート[list]のA列に"●"がある特定の行だけを以下作業の対象にしたい ② ①で特定した行のE列セルの値を、シート[output]のB9セルにコピペする ③ ①で特定した行のF列セルの値を、シート[output]のB12セルにコピペする ④ ①で特定した行のG列セルの値を、シート[output]のB15セルにコピペする ⑤ ①で特定した行のH列セルの値を、シート[output]のB18セルにコピペする ⑥ ①で特定した行のI列セルの値を、シート[output]のB21セルにコピペする ⑦ ①で特定した行のJ列セルの値を、シート[output]のB24セルにコピペする ⑧ ①で特定した行のK列セルの値を、シート[output]のB27セルにコピペする ⑨ ①で特定した行のL列セルの値を、シート[output]のB30セルにコピペする ⑩ ①で特定した行のM列セルの値を、シート[output]のB33セルにコピペする ⑪ ①で特定した行のN列セルの値を、シート[output]のB36セルにコピペする ⑫ ①で特定した行のO列セルの値を、シート[output]のB39セルにコピペする ⑬ ①で特定した行のP列セルの値を、シート[output]のB42セルにコピペする ⑭ ①で特定した行のQ列セルの値を、シート[output]のB45セルにコピペする ⑮ ①で特定した行のR列セルの値を、シート[output]のB48セルにコピペする ⑯ ①で特定した行のS列セルの値を、シート[output]のB51セルにコピペする ⑰ ①で特定した行のT列セルの値を、シート[output]のB54セルにコピペする ⑱ ①で特定した行のU列セルの値を、シート[output]のB57セルにコピペする ⑲ シート[output]のB3:B59をテキストファイルを呼び出してコピペする ※このとき、上記②-⑱で記述したB9からB57のセルには改行が含まれる場合が  あるため、テキストファイルへのペースト時に""が表示されてしまうが、  もし可能であれば、この""が表示されないようにしたい。

  • エクセルのVBA初心者です。教えてください。

    エクセルVBAの勉強を始めたばかりのものです。無知を自覚しながら質問させていただきます。 宜しくお願い致します。 下のようにエクセルの表があります。 B列の中から例えば5月13日が今日だとして本日の日付のものを探し、見つけたらその隣の列の A列の通番を参照しピックアップしたら、別のシートに作ってある番号ばかりのシート表の中のその通番のセルを塗りつぶすという一連の作業のVBAを作りたいのですがどうしたらいいのでしょうか? 問題の説明不足で意味が通じるかが心配なのですが、本日の日付をB列から見つけてその通番 をピックアップするVBAを教えて頂けたらとおもい、質問しました。 ちなみに日付は5/13の形式で入力しています。 A B 1 5月13日 2 3 4 5 5月13日 6 6

  • エクセルマクロ超初心者で、悩んでます。

    エクセルマクロ超初心者で、悩んでます。 どなたか助けてください。 悩みはこうです↓ データ用のワークシートのセルに数字、文字が入力してあります。 セルの数値同士の引き算で算出した数値を列数として、別の印刷用のワークシートのセル番地(列、行)に、「文字」を表示したいのです。 日本語で書いちゃうと ワークシート「印刷用」の、あるセル番地(ワークシート「データ用」から、列数はJ1‐A1、行数はのB1の数値)に ワークシート「データ表」のC1の文字 を出力せよ です。 Worksheets選択がうまくいきません CellsかRangeを使うのかと思いますが、引き算する表現がわかりません・・ 文例があれば、稚拙ながら活用できるかなと思います。 よろしくお願いします!

  • VBAを使ってカウントアップを使いたいのですが。

    VBA初心者です。 カウントアップを使いたいのですが、連続している行ではなく、行と行が離れているのです。 そして、文字と数字の混合なのですが設定することは可能でしょうか? 例)○●…数字 △…漢字 ○○△●●●●→後半の数字(●の部分)のみ増やしたい。 そして、この上記の数字はsheet2のB列に3行おきに(B2,5,8・・・)入力されるようにしたい。 そしてその数字をsheet1に下記のような順番で反映させたいのです。 D2→H2→L2→D27→H27→L27→D52→H52→L52・・・・ つまり、D列、H列、L列の順番で25行おきに反映させたいのです。 これが1500行まであります。 説明が下手ですいませんが、よろしくお願いいたします。

  • vba初心者です。どなたか教えて下さい。

      独学でエクセルVBAを勉強している熟年おじさんです。  色んな参考例を見ながらヒントになる事例を探していますが、中々、似た例が見つからず  困っています。手がかりでも掴めたらと思います。どなたかご指導下さい。   同一BOOK内の2つのシートに同じ行と列に同じ項目内容が入っています。その一枚目のシートの行と列を検索して同じ行と列に該当するデータを、二枚目のシートの同じ行列のセルにコピーするのです。   それだけのことですが、もうひとつの条件は、一枚目のシートには毎日新しいデータが入ってきて  その二枚目シートのデータを日単位で色分けしたいのです。従って、二枚目のシートには、日単位で 空いているセルにデータが蓄積されていき、空白セルが埋め尽くされていきます。   この場合、各シートのデータが同一セルにダブルことは絶対にありません。 一枚目シート                 二枚目シート     行⇒ A B C D E F G          行⇒ A B C D E F G 列 A1 2 6 1 9 23 7 90          列A1 2 6 1 9 23 7 90     B5 11 8 18 34 67 9 34          B5 11 8 18 34 67 9 34    C9                       C9   U9                        U9  ・・・翌日データ追加・・・    P5                        P5        上記はシートイメージですが、行は品名で列は工程名で、中のデータは測定値です。    2枚のシートには全く同じ品名と工程名が入っていて、毎日、入ってくる一枚目シートには    その日のデータしか入ってきません。それを、二枚目のシートの空いたセルにコピーして    いきます。データは毎日追加すのですが、同一セルにダブルことはありません。    以上よろしくお願いします。

  • VBA色を反映させる

    VBA初心者です。 初歩的な質問ですみませんが教えてください。 やりたいこと 仮に前提としてファイルの名前を 試験1 試験2とします。 試験2のファイル 1行目のA列に1、B列に2、C列に3・・・AE列に31と連続する数字があります 試験1のファイル 6行目のK列に1、L列に2、M列に3・・・AO列に31と連続する数字があります。 試験2、1行目の数字のどれかを赤い背景色で塗った場合 試験1のsheet1の6行目に反映させるといった内容です。 ですが、このままだと 試験1の6行目にそのまま反映されるため sheet1の6行目A~AEが赤い背景色がついてしまいます。 それではなく、私がしたいのは A~AEの間の中を反映させるではなく 6行目の中にある数字と試験2の数字が一緒の場合 赤い背景色を反映させたいです。 (例えば試験2、1行目のC列数字3に赤い背景色を塗った場合 試験1、sheet1の6行目、M列数字3に赤い背景色を塗る) Sub macro()' 赤色を反映させる Dim a As Variant Dim b As Variant Set b = Workbooks("試験1.xls").Worksheets("sheet1") For a = 1 To 31 If Cells(1, a).Interior.ColorIndex = 3 Then b.Cells(6, a).Interior.ColorIndex = 3 End If Next a End Sub すいませんが コードを書いてもらえるとすごく助かります。 解説があればなお助かります。 回答お願い致します。

専門家に質問してみよう