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

このQ&Aのポイント
  • excellVBAを使用して、複数のシートからデータが被らないようにしてコピーする方法を探しています。
  • 現在の方法では効率が悪く感じており、より良い方法を教えていただきたいです。
  • データの入っている列は共通で5列で固定されており、行数はシートによって異なります。
回答を見る
  • ベストアンサー

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行くらいです。 説明が分かりづらいかも知れませんが、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

シートDに全てのシートのデータを結合した表(重複を含む)を作成した後、フィルタで重複を非表示すると効率が良いように思えます。 非表示でも重複データが存在する事がNGなら表示データだけコピーして別なシートに貼り付ければ良いでしょう。 #以下のコードはサンプルですのでエラー処理を行っていません。 Sub Sample()   Dim nLast   With Sheets("SheetD")     'SheetDの項目名     .Range("A1:C1") = Sheets("SheetA").Range("A1:C1").Value        '各シートからデータをコピー     Call fCopyData("SheetA")     Call fCopyData("SheetB")     Call fCopyData("SheetC")        '重複を非表示     nLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1     .Range("A1:C" & nLast).AdvancedFilter Action:=xlFilterInPlace, Unique:=True   End With End Sub    Sub fCopyData(aSheetName As String)   Dim vData, nLast   '指定シートのデータをコピー   With Sheets(aSheetName)     If .Range("A2") = "" Then Exit Sub     .Range(.Range("A2"), .Range("C2").End(xlDown)).Copy   End With   'SheetDの最終行に貼り付け   With Sheets("SheetD")     nLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1     .Cells(nLast, 1).PasteSpecial Paste:=xlPasteValues     .Cells(nLast, 1).PasteSpecial Paste:=xlPasteFormats   End With End Sub

その他の回答 (4)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

一例です。 作業シートにすべて貼り付ける。 エクセルのフィルタオプションを利用して重複を非表示に。 可視セルのみをシートDに貼り付け。 作業シートを削除。 というコードです。 Sub test01()   Dim ws(2) As Worksheet '変数宣言   Set ws(0) = Worksheets.Add '作業シート追加   Set ws(1) = Sheets("D")   For Each ws(2) In Sheets(Array("A", "B", "C")) '各シートコピー     ws(2).Range("A1", ws(2).Cells(Rows.Count, "C").End(xlUp)).Copy ws(0).Cells(Rows.Count, 1).End(xlUp).Offset(1)   Next ws(1)   With ws(0) '作業シートに貼り付けし重複削除してシートDに貼り付け     .Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, Unique:=True     .Range("A2").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy ws(1).Range("A1")     Application.DisplayAlerts = False     .Delete '作業シート削除     Application.DisplayAlerts = True   End With End Sub

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

EXCEL2007ならデータの中に、重複の削除機能があるから、 シートAからシートCまで全部シートDへコピーして、 重複の削除1回で終わりです。 (マクロの記録しておけば、VBAの記述も分かると思います。) ただし、EXCEL2003にはこの機能がありません。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一案です。 (1)行データを連結(区切り文字あり)、それをキーに連想配列を作成(重複分を吸収) (2)連想配列からキーを取り出し、Splitで再配列してDシートにコピー

noname#159900
noname#159900
回答No.1

シートAで配列を作る、「りんご=A1」「バナナ=A2」・・・ シートBをその配列の中を巡回する、あれば捨てて、無ければ新規にA6とかつくる。 最後にシートDに入れて、終わり。

関連するQ&A

  • 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で行いたいです。よろしくお願いします。

  • 【Excel】2つのデータを照合し転記したい

    2つのデータがあります。(ファイル1と2) ファイル2に記載されている品目と同じ品目を ファイル1から割り出し記載されている数量と 価格情報をファイル2に転記したい。 ファイル1(情報元) 品目   数量  価格 林檎   1箱   1500円 梨    3箱   4200円 ファイル2(転記先) 品目   数量  価格 スイカ バナナ ブドウ 林檎 梨 完成目標 品目   数量  価格 スイカ バナナ ブドウ 林檎   1箱   1500円 梨    3箱   4200円 ※見やすいように下部の2品目に数値を入れましたが、  実際はどの行が該当するか順番もランダムです。  今回処理したいデータは400品目程度あります。 ※理論や仕組みを理解する力はありませんが、上記の  例を書式化して頂ければ自身の持っているデータへ  改良させる事はできると思います。

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

    エクセルで特定の範囲内の数値にあてはまるデータを別のシートに新たな表として作成したいのですが、簡単な方法があれば教えてください。 例えば 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  よろしくお願いいたします。

  • エクセルでヘルプ・・・・

    例えばA列に下記のような名前が並んでいたとします。 この中で同じ文字列のセルを含む行を全て削除する方法です。 下記の例では 5,6,7,8,12,13,14 の行を削除するかたちになります。 A     B     C 1 りんご 2 トマト 3 ブドウ 4 バナナ 5 サクランボ 6 サクランボ 7 メロン 8 メロン 9 みかん 10 バナナ 11 ナシ 12 スイカ 13 スイカ 14 スイカ 実際は5000~6000行データの作業になる為、手作業では大変です。 これがもしエクセルの機能で出来るならとても助かります。 宜しくお願いいたします。

  • VBA マスター機種と一致 別シート 抽出

    エクセルVBAで悩んでいます。 1枚目のシートに2000列くらいのデータがあり、 2枚目のシートに自分の抽出したいマスター機種一覧があります。 そして3枚目のシートに1枚目データと2枚目マスターとが一致したものだけを 全て抽出したいと考えております。     A   B    C    D     E     F    G 1  品目  日付  在庫数  輸送手段  注文数  賞味期限 注文納期  2  りんご  1/17  5    トラック    50     2/5    1/20 3  りんご  1/20  8    船     20     2/17   1/25 4  ぶどう  1/15  8    トラック    100    1/30    1/20 5  パイン  1/16  500   飛行機   200    2/20    2/1 6  バナナ  1/13  500   飛行機   1000   2/25    2/10 7  バナナ  1/15  10    トラック    400   3/1     2/24 仮に上記のようなデータがあったとして、マスターにりんごとバナナの品目と注文数と注文納期だけを別シートに抽出するにはどうすればよいでしょうか? 変数とif で一致したら、、というところまでできたのですが、りんごの列が2つあると 下の列のりんごしか抽出できないのです。2列あれば2列とも抽出したいのですが、 できません。 分かりずらいかと思いますが、分かる方がいらっしゃったら、ご教授願います。

  • 並べ替え方法

    A列 B列 C列 D列 E列 品目 単価 個数 (イメージ) りんご 100 50 りんご 100 60 りんご 110 りんご 90 80 りんご 80 みかん 50 30 30 みかん 50 20 みかん みかん 40 40 みかん 60 バナナ 150 30 バナナ 150 40 バナナ 70 バナナ 140 50 バナナ 90 A列 B列 C列のデータがランダムにあるとしてそれを 品目ごと単価ごとに集約して D列 E列に集計するにはどうしたら良いですか? お詳しい方がいらしたら、どうかご教授ください。

  • EXCEL セル内のデータを置き換えたい

    うまく説明できないのですが、 Sheet1のA列とB列に、1つのセルに複数のデータが以下のように入っています。(データの間に「,」があります。)     A列             B列 1行 6599A,6599B,6599C  6599A 2行 6599B,6599C      3行              6599A,6599C これは商品コードでして、Sheet2に明細があります。 A列    B列 りんご  6599A メロン   6599B みかん  6599B Sheet1のデータを、「りんご」「メロン」「みかん」に置き換えたいのです。 データの数が、たくさんあるので、コピー、ペーストでは対応できません。 よい方法をお教えください。よろしくお願いいたします。

  • 逆数の和でデータのユニーク数を出せるのはなぜ

    連続するデータがあり、データの個数を出し、その逆数を合計すると、データのユニーク数になることをうまく説明したいのですが、「逆数の和」で覚えることはできてもそれは手法の説明になってしまいます。 なぜそうなるのか、どうしてこういう計算を採用するのか、といった観点でを中学~高校くらいまでの数学でわかるように説明できるでしょうか?  品目  りんご  みかん  みかん  りんご  すいか  めろん  りんご  品目  個数 → 逆数  りんご 3個 → 1/3  りんご 3個 → 1/3  りんご 3個 → 1/3  すいか 1個 → 1/1   めろん 1個 → 1/1  みかん 2個 → 1/2  みかん 2個 → 1/2 逆数を合計すると4 データのユニーク数は4 りんご、みかん、すいか、めろん 確かに一致する。 参考 https://office-hack.com/excel/duplicate-data/

  • VBAの条件の異なるデータの取り出し

    参照元のシートの項目がリンゴ・ミカン・バナナ・スイカで一行づつ、それぞれの価格が記載されているとします。 <参照元シート>  名前 価格 リンゴ 100 ミカン 150 バナナ 200 スイカ 250 参照先のシートにはリンゴ・ミカン・バナナ・スイカの重さや大きさが複数行で記載されています。 <参照先シート> 名前  重さ 大きさ 糖度 リンゴ 50        ミカン 40 ミカン     50    バナナ     30 スイカ 200 スイカ     100 スイカ         50 別シートに下記のようにデータを取り出し、印刷後次の果実に切り替えて印刷したいのですがマクロはどのようになるのでしょうか。。 <別シート> ・名前 ・価格 ・重さ(記載の無い場合は無し) ・大きさ(記載の無い場合は無し) ・糖度(記載の無い場合は無し) ForとIFを使用して作成してみたのですが、参照先シートで複数項目がある場合に転記するマクロがわからず頓挫しております。。 (名前に対して重さや大きさが複数ある場合にデータを取り出し、次の名前を読みにいく部分がわかりません) マクロに明るい方いらっしゃればご回答いただけますでしょうか。

  • EXCEL VBAで複数のシートの中から該当値を検索する方法について

    すいません、EXCEL VBAで複数のシートの中から該当する値を検索する方法について教えていただきたいことがあります。      Sheet1              A列   B列  C列   1行  11  りんご  31  2行  12  バナナ  32  3行  13  みかん  33  4行  14  ぶどう  34   ・   ・   ・     ・        Sheet2              A列   B列  C列   1行  31  すいか  11  2行  32  レモン  12  3行  33  パイン  13  4行  34  ざくろ  14   ・   ・   ・     ・ というデータが入っているブックについて 「全部のシートを検索し、A列に11の値が入っているセルの行数及びその行のB列の値」 をSheet1のD1セルとE1セルにそれぞれ返す方法はどうしたらよろしいんでしょうか。 For Each を使うのではないかと思って色々やってみたのですが、どうも上手く作動してくれません。 よろしくお願いいたします。

専門家に質問してみよう