• 締切済み

VBAでの他のシートにコピー

今sheet1へ、sheet2とsheet3のデータをコピーしようとしています。 sheet1は見出しが2行目にあり、3行目からsheet2をコピーしようとしています。 そのつぎに、sheet3はsheet1にsheet2のコピーした次の行からコピーします。 sheet2    A  B  C 3 鈴木 りんご 5 4 山田 バナナ 1 sheet3   A  B  C  3 大羽 メロン 2 4 鷲尾 スイカ 1     ↓2行目まで見出しがあるsheet1に sheet1   A  B  C 3 鈴木 りんご 5 4 山田 バナナ 1  5 大羽 メロン 2 6 鷲尾 スイカ 1 このとき、シート2とシート3は数は決まっていません。 そして、数が0のときもあるので「sheet2とsheet3にデータがないときはコピーしない」 をというふうにしたいのですが、どのようにすればよろしいですか? VBAで行いたいです。よろしくお願いします。

みんなの回答

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

質問の処理をするだけなら、数行で出来ますよ ちょっと長くなるけどね Sub test() Dim sh As Worksheet For Each sh In Worksheets(Array("sheet2", "sheet3")) If sh.Range("a65536").End(xlUp).Row > 2 Then sh.Range("a3", sh.Range("c65536").End(xlUp)).Copy Worksheets("sheet1").Range("a65536").End(xlUp).Offset(1) Next End Sub 難しいことはしていないので、分らない所はヘルプを参照してください

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

回答者は誰も何も言わないが、課題丸投げで、コードを回答者に書いてもらうようなのは、規約違反のはず。 コードをコピー貼り付けすれば質問者は簡単だが、そんな下請けになりたくない。 少なくても具体例でマクロの記録を取り、実際の場合はどこを変えるべき(相対化すべき)か勉強して、疑問点ぐらい絞ること。 (1)貼り付けたあとで、データ最終行を捉えるコードさえわかれば仕舞いのはなし。 (2)コピー元にデータが無ければ、コピー先で最下行が変化しないだけの話。ただし見出しが邪魔をする場合が有るので手わ打った。 (3)コピー先は左上隅セルをDestinationで指定すれは済む話。 (4)シートがSheet2,Sheet3(実際はもっと多いのを質問で簡略化したのかな)有るので、シートをコード上で区別するコードを勉強すること。 ーーー Sheet1の第1行目には見出しを入れて下記を実行 第1行があれば見出しだけと看做す。 Sub test01() Dim sh1: Dim shn Set sh1 = Worksheets("Sheet1") s = Array("Sheet2", "Sheet3") For i = 0 To UBound(s) Set shn = Worksheets(s(i)) 'MsgBox shn.Name d1 = sh1.Range("a65536").End(xlUp).Row d2 = shn.Range("a65536").End(xlUp).Row If d2 <> 1 Then shn.Range("A2:C" & d2).Copy Destination:=sh1.Range("A" & d1 + 1) Set shn = Nothing End If Next i End Sub

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

こんなのでどうでしょう? Private Const DATA_CELL_SCOL As String = "A3" Private Const DATA_CELL_ECOL As String = "C3" Public Sub copySheet() Dim srcSheet As Worksheet Dim dstSheet As Worksheet 'コピー先 Set dstSheet = Worksheets("Sheet1") 'コピー元 Set srcSheet = Worksheets("Sheet2") Call copyData(srcSheet, dstSheet) 'コピー元 Set srcSheet = Worksheets("Sheet3") Call copyData(srcSheet, dstSheet) End Sub Private Sub copyData(srcSheet As Worksheet, dstSheet As Worksheet) Dim rowEnd As Range Dim copyDstCell As String 'コピー先のセルを設定 dstSheet.Activate Set rowEnd = dstSheet.Range(DATA_CELL_SCOL).End(xlDown) If rowEnd.Value = "" Then copyDstCell = DATA_CELL_SCOL Else copyDstCell = rowEnd.Offset(1).Address(False, False) End If 'コピー元のデータ範囲を設定 srcSheet.Activate Set rowEnd = srcSheet.Range(DATA_CELL_ECOL).End(xlDown) If rowEnd.Value = "" Then Exit Sub End If 'コピー元→コピー先 srcSheet.Range(DATA_CELL_SCOL & ":" & rowEnd.Address(False, False)).Copy _ Destination:=dstSheet.Range(copyDstCell) End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8546/19426)
回答No.2

Private Sub CommandButton1_Click() Dim RowSize As Integer Dim LastRow As Integer Worksheets("Sheet1").Select ActiveSheet.Range("A3:C65535").Select Selection.ClearContents Worksheets("Sheet2").Select RowSize = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row If RowSize >= 3 Then ActiveSheet.Range(ActiveSheet.Cells(3, 1), ActiveSheet.Cells(RowSize, 3)).Select Selection.Copy Worksheets("Sheet1").Select ActiveSheet.Range("A3").Select ActiveSheet.Paste LastRow = Selection.Rows.Count + 3 Else LastRow = 3 End If Worksheets("Sheet3").Select RowSize = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row If RowSize >= 3 Then ActiveSheet.Range(ActiveSheet.Cells(3, 1), ActiveSheet.Cells(RowSize, 3)).Select Selection.Copy Worksheets("Sheet1").Select ActiveSheet.Cells(LastRow, 1).Select ActiveSheet.Paste End If Worksheets("Sheet1").Select End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

Sheet2、Sheet3のシートが2番目、3番目にあるとして。 Sub macro() Dim I As Integer For I = 2 To 3 With Worksheets(I) If .Range("A" & .Rows.Count).End(xlUp).Row >= 3 Then .Range("A3:C" & .Range("A" & .Rows.Count).End(xlUp).Row).Copy _   Worksheets(1).Range("A" & Worksheets(1).Rows.Count).End(xlUp).Offset(1) End If End With Next I End Sub

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • excellVBAで、シートからデータを移す方法

    複数のシートから、データが被らないようにコピーする方法を探しています。 ・コマンドボタンを押すと、シートA、シートB、シートCの全データをシートDにコピーする ・ただしデータが被っている行は、1度しかコピーしない 例として、以下のようなシートがあるとします。 ・シートA 品目 価格 日付 りんご 100円 4/13 バナナ 80円 4/10 スイカ 200円 5/10 メロン 300円 5/21 なし 120円 5/23 ・シートB 品目 価格 日付 メロン 300円 5/21 バナナ 80円 4/10 りんご 100円 4/22 ・シートC 品目 価格 日付 スイカ 200円 5/10 なし 150円 4/23 コマンドボタンを押すと上の3シートから、シートDに以下のデータが転記される 品目 価格 日付 りんご 100円 4/13 バナナ 80円 4/10 スイカ 200円 5/10 なし 120円 5/23 メロン 300円 5/21 りんご 100円 4/22 なし 150円 4/23 このような動作をしたいのですが、どのようにするのが効率良いでしょうか? 今のところ私は、 1、シートAのデータの入っている行を全てシートDにコピーする 2、シートBの1行目から順に、コピー済みの全行と比較して被っているかチェック 3、被っていない行はシートDにコピー。 4、シートCの1行目から順に、コピー済みの全行と比較して被っているかチェック 5、被っていない行はシートDにコピー。 という動作しか思いつかないのですが、どうも効率が悪い気がしてなりません。 何か良い方法はないでしょうか。 ちなみにデータの入っている列は全シート5列で固定(正式名、品名、価格、サイズ、日付の5列) 行はシートによって異なり、50行~20000行くらいです。 説明が分かりづらいかも知れませんが、よろしくお願い致します。

  • エクセルのシート名参照関数

    エクセル関数でいろいろ試したのですがうまくいかず困っています。 VBAは出来ないので(苦手なので)できましたら関数で教えてください。 12年1月~12年12月で別々のシートがあり、それぞれ別の『行』『列』に参照をしたい数字があります。 集計シート名『Sheet1』の『A1』に『検査値』、『B1』~『B12』に『12年1月』~『12年12月』、『C1』~『C12』に『該当する値』を表示したいと思います。 具体例 <シート名 : Sheet1> ---A-----B----C 1 リンゴ 12年1月 値 2 -----12年2月 値 3 -----12年3月 値 4 -----12年4月 値 5 -----12年5月 値 <シート名 : 12年1月> ---A----B 1 リンゴ 100 2 バナナ 50 3 メロン 10 4 スイカ 5 5 ミカン 1 <シート名 : 12年2月> ---A----D 1 パイン 10 2 バナナ 20 3 メロン 30 4 リンゴ 40 5 ミカン 50 <シート名 : 12年2月> ---A----F 1 パイン 10 2 バナナ 20 3 スイカ 30 4 リンゴ 40 5 ミカン 50 <シート名 : 12年3月> ---A----C 1 パイン 1 2 レモン 10 3 リンゴ 100 4 メロン 1000 5 イチゴ 10000 上記<シート名 : Sheet1>の『C列』に式を入れ、それぞれのシートから『A1』に該当する値を表示させたいと思います。 文書が下手ですのでわかりにくい内容で申し訳ありません。

  • C列の要素によって、3枚のシートに振り分ける

    シート1に顧客の名簿がずらっと一覧で入っているとします。 例えばA列…名前、B列…住所、C列…買った物(いちご、メロン、すいかの3種類)、D列…備考   A列      B列     C列    D列  山田太郎   山梨県   いちご   新規さん(5月)  鈴木良子   北海道   メロン     -  田中浩史   東京都   すいか   常連さん  高橋幸恵   京都府   すいか    -  本田一郎   長崎県   バナナ    -  … というような一覧が数百人分入っているとします。 これをC列の要素によって、シート2~4に自動的に振り分けたいのです。 例えば「シート2」は「いちごを買った人一覧」に、「シート3」は「メロンを買った人一覧」にしたい、 それが、C列に「いちご」などと入力した瞬間に自動的にシート2に反映されるようにしたいです。 もちろんA列やB列、D列の要素をともなったまま。 また隙間を空けずにいちごを買った人が全部で52人なら52行でぴたりと収まるようにしたいです。 そのためにはシート2(もしくは3~4)のC列に、何らかの関数を入れればいいでしょうか? またどんな関数を入れたらいいでしょうか。 よろしくお願い申し上げます。

  • EXCEL VBA 複数シート選択の方法(VBA)

    エクセルのシート選択方法について教えてください。 選択対象シート数は4つ(シート名は、「りんご」「みかん」「ばなな」「すいか」とします) シート名「表紙」のセルは A1:りんご A2:みかん A3:ばなな A4:すいか となっており、使用者はB1~B4セルに「○」「×」を入力し、 「○」となっているシートのみ選択出来るようにしたい。 シート名が「sheet1~4」のように連続するシート名である場合や、 ひとつの条件に当てはまるシートを複数選択する方法は 他サイトでも見つけることが出来たのですが、このような場合は どのようにすれば良いのでしょうか?

  • sheet1から抽出しsheet2へコピーをVBAで

    VBA初心者です。色々本など見たのですがどうして良いか判らず質問させて頂きます。 sheet2のA1にデータを入力したら、sheet1のA列に同じデータがあるかどうか探してある場合は、その行をsheet2の6行目からコピーをさせたいのですが、 (1)sheet1のデータは下に追加していきます。 (2)sheet2のデータ貼り付けは詰めて貼り付けていきたい。 sheet1  A   B    C 1 -  -   -   2 -  -   - 3 -  -   -    4 社名 商品名 入荷数 5 A社    ○    10 6 B社    △    5 7 C社    ■    20 8 A社    ×    30 9 D社    ○    10  ・ ・   ・    ・ ・ ・   ・    ・ ・ ・   ・    ・ sheet2  A   B    C    1 A社  -   -  2 -   -   -  3 -   -   -  4 -   -   -  5 社名 商品名 入荷数 6 A社    ○    10 7 A社    ×    30 ・ ・   ・    ・ ・ ・   ・    ・ ・ ・   ・    ・ -はブランクセル 色々試したのですが、sheet2にコピーはされてもブランクの行が詰まらないなど上手くいかないため教えて頂きたく質問させて頂きました。 宜しくお願いいたします。

  • excelでシートから別シートに抽出する方法

    データシートに A   B    C 佐藤 りんご  25個 木村 オレンジ 3個 伊藤 メロン  12個 伊藤 スイカ  2個 佐藤 イチゴ  40個 佐藤 マンゴー 8個 というデータがあったとします。 それを別のシートに A   B    C 佐藤 りんご  25個    イチゴ  40個    マンゴー 8個 また別のシートに A   B    C 伊藤 メロン  12個    スイカ  2個 といったようにAに佐藤とか伊藤とか入力するだけでB、Cが自動で抽出できるようにできますか? 出来れば関数の入力でやりたいのですがわかる人がいましたらご教授ください。

  • EXCEL:抽出・シートに分散させる方法

    下記の様なデータを元に、各担当者別に用意された売り上げ表の雛形に表示させたい(指定した項目を指定したセルに)のですが、 実現出来る関数はありますでしょうか? オートフィルタ>コピペではなく、毎月の処理になるので自動的に出来る様にしたいのですが。 顧客名  担当者  商品名  金額 A社   佐藤   バナナ  100 B社   鈴木   バナナ  100 C社   田中   メロン  100 A社   佐藤   バナナ  300 A社   佐藤   リンゴ  200 C社   田中   メロン  100 これを↓ Sheet 佐藤 顧客名  商品名  金額 A社   バナナ  100 A社   バナナ  300 A社   リンゴ  200 ------------------ Sheet 鈴木 顧客名  商品名  金額 B社   バナナ  100 ------------------ Sheet 田中 顧客名  商品名  金額 C社   メロン  100 C社   メロン  100 よろしくお願いします。

  • VBA 別シートにカウントした結果を表示したい

    VBA初心者です。 シート1で指定した単語をシート2にカウントした数を表示させたいです。 シート1のA列に100種類近い単語が縦に並んでいます。(重複している) 「りんご」「バナナ」「メロン」様々な単語があるとします。 シート2にはA列を横にした「りんご」「バナナ」「メロン」が並んでいます。(重複削除している) そのりんごなどの下に、リンゴがいくつか、バナナがいくつかをシート1からカウントした結果の数字を入れたいです。 今のところ、COUNTIFで単語を指定しているのですが、文言が増える可能性もあります。何かほかに案がありますでしょうか。 よろしくお願いいたします。

  • エクセルで範囲内のデータを別シートにうつしたい

    エクセルで特定の範囲内の数値にあてはまるデータを別のシートに新たな表として作成したいのですが、簡単な方法があれば教えてください。 例えば Sheet1   A   B     C  1 25  ミカン   3000 2 30  リンゴ   4500 3  5  メロン   9800 4 17  ブドウ   1800 5 50  バナナ  1000 このようなデータを次のような表にしたいのです。 A列の数値が10~30のみ行ごと抜粋する Sheet2   A   B     C  1 25  ミカン   3000 2 30  リンゴ   4500 3 17  ブドウ   1800  よろしくお願いいたします。

  • VBA 他シートを参照しているセルのコピー

    お世話になります。 以下のシートがあります。 [sheet a]    A     B        C      D     E 1 2004 2005 2006 2007 2008 2 =b!A2 =b!C2 =b!E2 =b!G2 =b!I2 3 10 15 16 4 11 4 12 30 20 9 2 5 =SUM(A3:A4) =SUM(B3:B4) =SUM(C3:C4) =SUM(D3:D4) =SUM(E3:E4) [sheet b] A B C D E  F G H I J 2004 2005 2006 2007 2008 1 あ1 い1 う1 え1 お1 か1 き1 く1 け1 こ1 2 あ2 い2 う2 え2 お2 か2 き2 く2 け2 こ2 ・・・・・・・・・ [sheet a]F列以降に入れるデータは、VBA(マクロ)を使って、別のブックから取り出しています。 (例) F1…=E1+1(E1の数式をコピー) F3,F4…任意の値(別のブックからコピー) F5…=SUM(F3:F4)(E5の数式をコピー) 1行目,5行目の場合は左のセルをコピーして数式を貼り付けると、列が自動的に列が変わりますが、2行目の場合は元のシートを1行おきに参照しているので、単純にコピーしただけでは正しい数式が入りません。 2行目の参照をVBAで作るには、どのようにしたらいいでしょうか。 よろしくお願いします。

専門家に質問してみよう