- ベストアンサー
エクセルデータを別シートにコピーする方法
- エクセル2003を使用している際に、特定の条件に基づいてデータを抽出し、別シートにコピーする方法について教えてください。
- 現在はオートフィルタを使用してデータを抽出し、手動でコピーして貼り付けているが、日々データが追加されるため手間がかかる。
- 関数やマクロ、VBAなどを使用して、日々追加されるデータを自動的に前日までのデータの下に追加する方法があるか知りたい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
抽出したい条件は全てG列に縦に列挙してください。そして、その条件で抽出したデータをコピーしておくワークシート名をH列に入力します。 (E2のセルにはG列で列挙した抽出条件が順次入力されるセルです。)抽出結果のデータはH列で指定したワークシートにそれぞれあるはずです。
その他の回答 (3)
- dokinhime
- ベストアンサー率30% (4/13)
No.1について コピーしたものは標準モジュールに貼り付けて下さい。 (「挿入」メニューの「標準モジュール」で標準モジュールができます。) エラーメッセージが400のみであれば、それで解決すると思うのですが、400のほかにメッセージがある場合は他の解決法となります。
補足
ありがとうございます。標準モジュールに貼り付けてみました。エラーは出なくなりましたが、E2の条件を入れた値がマクロを実行するといつも「い」に変わってしまいます。 抽出も「あ」が抽出できなくなっています。 すみません・・・なぜなんでしょう。
- imogasi
- ベストアンサー率27% (4737/17069)
関数では複雑になって手におえないでしょう。関数は抜き出しが苦手です。 VBAによる解決になるでしょう。 今までのやり方からして、バッチ方式=瞬時連動でなく、人間が指示したときに実行、でよいのですね。 Sheet1に あ10 い15 あ20 のデータがあるとする。 >日々データが次の行に追加になるので はSheet1に対してでしょね。 >「あ」のデータだけ抽出して、そのデータを別シートにコピーします。 「あ」の行をコピーする「シート名」はどういう風になってますか。 規則性がありますか。A列文字列そのものがシート名だったりしますか。 結局 Sheet1のA列に出てくる文字列によって あー>Sheet2 いー>Sheet3 うー>Sheet4 ・・ のようにシートに振り分けるか。 ソートして 「あ」の塊り行ーー>Sheet2 「い」の塊り行ーー>Sheet3 ・・ にコピーすればよい。 あーいーう・・・の並びと Sheet2-Sheet3-Sheet4・・の並びと一致しているとさらにやりやすい。 Sheet2以下は毎日新規作り直しの方がやりやすそう。
補足
ご回答ありがとうございます。 理屈はわかりましたが、実際にどのようにvbaを書けばいいのかが、わからず・・・ すみません。
- dokinhime
- ベストアンサー率30% (4/13)
AdvancedFilterを使ってはどうでしょうか。 追加になったデータだけを抽出というのは 結構面倒な作業なので、毎回全データをフィルターして 貼り付ける方法を記述してみました。 1行目にフィールド名(仮にXYZとしました。)を入れています。 そして、抽出したいA列のフィールド名XをE1に記入して その下に抽出したい「あ」を仮に入れています。 またG列に抽出したいXフィールドの文字を縦に列挙しておきます。 その横のH列には、「あ」で抽出したデータを「Sheet2」ワークシートにコピーするというように、対応するコピー先ワークシートの名前を記述します。 A B C D E F G H 1 X Y Z X X シート名 2 あ 1 0 あ あ Sheet2 3 い 1 5 い Sheet3 4 あ 2 0 Sub FilterDataCopy() Dim MyRow As Long 'G列の行を入れる変数 Application.ScreenUpdating = False MyRow = 2 'まず前日の抽出データを全てクリア Do Until Sheets("Sheet1").Cells(MyRow, "g") = "" Sheets(Sheets("Sheet1").Cells(MyRow, "h").Text).Select Cells.Select Selection.ClearContents MyRow = MyRow + 1 Loop Sheets("Sheet1").Activate MyRow = 2 '抽出してコピー Do Until Cells(MyRow, "g") = "" Range("e2") = Cells(MyRow, "g") Range("a1").CurrentRegion.AdvancedFilter xlFilterCopy, Range("e1:e2"), Sheets(Cells(MyRow, "h").Text).Range("a1") MyRow = MyRow + 1 Loop Application.ScreenUpdating = True End Sub
補足
ご回答ありがとうございます。 早速、やってみましたが、エラーが出てどうしてもうまく行きません。 基本的なことがわかっていないのでどこが悪いのかがわからないのです。 ちなみに、エラーメッセージは「400」となっています。
お礼
お返事遅くなってすみません。 うまくできました。 ありがとうございました!!