マクロでのデータの抽出&貼り付けについて

このQ&Aのポイント
  • 代理店ごとに伝票書類を作成するために、マクロを組んでいます。シート1から必要なデータを抽出して、シート2へ貼り付ける方法について教えてください。
  • 現在、オートフィルタでデータを抽出しようとしていますが、うまくいきません。初心者なので、具体的な手順や情報を教えていただけると助かります。
  • エクセルのバージョンは2003で、貼り付ける際には1行目の「注文No」や「合計」の記載は不要です。必要な項目のデータのみを指定の列に貼り付けたいです。
回答を見る
  • ベストアンサー

マクロでのデータの抽出&貼り付けについて

代理店ごとに伝票書類を作成するのに、マクロを組んでいます。 シート1のデータをオートフィルタで抽出して、シート2へ貼り付けますがうまくいかないので教えていただきたいです。 代理店は10社ほどあります。 代理店ごとの伝票(シート2以降)へはシート1の必要なデータのみ貼り付けたいです。 【シート1】 A B C D E 代理店名 合計 小計 消費税 注文No 代理店A ○○○ ・・・ ・・・ aaa 代理店B ××× ・・・ ・・・ bbb 代理店A  ●●● ・・・ ・・・ ccc 代理店C △△△ ・・・ ・・・ ddd 【シート2】「代理店A」 注文No 合計 aaa ○○○ ccc ●●● 下記のマクロが間違っているのは重々承知なのですが、一応記載します。 初心者なので必要な情報があれば、追記しますので教えていただければと思います。 ★エクセルは2003です ★貼り付けるときに1行目の「注文No」や「合計」の記載は必要なし ★オートフィルタで抽出後、必要な項目のデータのみ、シート2の各指定の列に貼り付けたい Sub 代理店A() With Worksheets("シート1").Range("A1") .AutoFilter Field:=1, Criteria1:="代理店A" .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("代理店A").Range("A1") .AutoFilter End With Worksheets("代理店A").Activate End Sub

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! オートフィルタ → コピー&ペースト ではなく、For~Nextを使った一例です。 Sub test() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("代理店A") '↑ Sheet名の「A」部が全角・半角によって違ってきます。、 '実際のデータに合わせてください。 j = ws2.Cells(Rows.Count, 1).End(xlUp).Row If j > 1 Then Range(ws2.Cells(2, 1), ws2.Cells(j, 2)).ClearContents End If Application.ScreenUpdating = False For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, 1) = ws2.Name Then With ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = ws1.Cells(i, 5) .Offset(, 1) = ws1.Cells(i, 2) End With End If Next i Application.ScreenUpdating = True End Sub ※ 上記コードはSheet2のSheet名が抽出したい代理店名になっているとしています。 ご希望の方法でなければ読み流してくださいね。m(_ _)m

sampleA248
質問者

お礼

結局オートフィルタで完成させたのですが、一部参考させて頂きました。 シート名は代理店名なので、こちらの方法でも作成してみます。 ありがとうございます。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

シート1の代理店のデータ(10社とか)はすべてこの作業で使うのでしょう。A、D、F社だけとかは、作り他の代理店は作らないということではないでしょう(たとえ3社しか作らない場合ても下記は有効でしょう) (1)オートフィルタでA社データを抽出するのでなく、代理店名列でソートしなさい(ソート方) (2)そして上の行からデータを読んで行く。 (3)たとえばA,D、F社のみ処理するなら、A,D,F社を選択するための、名前テーブルを作り、それに該当しない代理店は、データを捨てる(何も処理しない。読み飛ばす)用にすればよい。 この方法は、考えやすく、確実で、処理総時間も少なくなるはず。 昔から使われた、オフラインバッチ処理の王道です。 ーー 例データ これぐらいの、手をかけて例は作ること。質問者が楽をしないで、回答者の回答の苦労も考えること。 A1:E10 代理店名 合計 小計 消費税 注文No 代理店A 129 123 6 111 代理店B 245 234 11 112 代理店A 453 432 21 113 代理店C 117 112 5 115 代理店A 328 313 15 116 代理店C 119 114 5 117 代理店A 225 215 10 119 代理店C 436 416 20 120 代理店A 437 417 20 134 ーー A+E列でソート(私の独断だが、ここはこれで適当かどうかよく考えること) 代理店名 合計 小計 消費税 注文No 代理店A 129 123 6 111 代理店A 453 432 21 113 代理店A 328 313 15 116 代理店A 225 215 10 119 代理店A 437 417 20 134 代理店B 245 234 11 112 代理店C 117 112 5 115 代理店C 119 114 5 117 代理店C 436 416 20 120 ーーー コード Sub test01() Set sh1 = Worksheets("Sheet1") '元データシート d = sh1.Range("A65536").End(xlUp).Row '元データシート最終行 MsgBox d m = "" '1行前の代理店名=キー k = 2 '代理店シートの明細の最初行 n = 1 '代理店シートの最初のシート・インデックス Set shw = Worksheets(n) '代理店ごとシート '--- For i = 2 To d If sh1.Cells(i, "A") = m Then shw.Cells(k, "B") = sh1.Cells(i, "B") shw.Cells(k, "C") = sh1.Cells(i, "E") k = k + 1 Else n = n + 1 '新しいシートのシートインデックス Set shw = Worksheets(n) shw.Range("A1") = sh1.Cells(i, "A") k = 2 shw.Cells(k, "B") = sh1.Cells(i, "B") shw.Cells(k, "C") = sh1.Cells(i, "E") k = k + 1 m = sh1.Cells(i, "A") End If Next i End Sub ーーーー 結果 -は空白セルです(左詰め表示防止用) Sheet2 代理店A - 129 111 - 453 113 - 328 116 - 225 119 - 437 134 Sheet3 代理店B - 245 112 Sheet4 代理店C - 117 115 - 119 117 - 436 120 === 注意 2番目のシート以後のシートは代理店の数以上の白紙のシートをあらかじめ作っておいて実行のこと。 質問者の頭が、パンクしないよう、説明を複雑にしないため、自動追加のコードは略している。手動で追加をやって。

sampleA248
質問者

お礼

ありがとうございました。参考にさせていただきました。

回答No.2

直接、張り付けるのではなく、いったん抽出用シートとして貼り付け それからコピペさせても良いのでは?

sampleA248
質問者

お礼

ありがとうございます。シートを増やさずに作成できました!

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>貼り付けるときに1行目の「注文No」や「合計」の記載は必要なし この条件がどうしてついているのか不明ですので Sub macro1()  Dim a '★  a = Worksheets("代理店A").Range("A1:B1").Value '★  With Worksheets("Sheet1")   .Range("A:A").AutoFilter field:=1, Criteria1:="代理店A"   .Range("E:E").Copy Destination:=Worksheets("代理店A").Range("A1")   .Range("B:B").Copy Destination:=Worksheets("代理店A").Range("B1")   .AutoFilterMode = False  End With  Worksheets("代理店A").Range("A1:B1").Value = a '★ End Sub ★を付けた行は,無くても良いと思えます。

sampleA248
質問者

お礼

ある代理店への売り上げがない場合もあるので、うまくいきませんでした。 ありがとうございます。

関連するQ&A

  • オートフィルタ抽出データをコピーするマクロについて

    マクロについて勉強中の者です。 "Sheet1"にあるデータをオートフィルタで抽出し、 "Sheet2"に抽出データのみをコピーをしたいと思っています。 Range("A10:G59").Select Selection.ClearContents With Worksheets("Sheet1").Range("A1") .AutoFilter .AutoFilter Field:=1, Criteria1:="○" .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Worksheets("Sheet2").Range("A9") End With End Sub としてみたのですが、 これを実行すると、オートフィルタが1行目(A1)ではなく、 2行目で設定されてしまい、抽出データがずれてしまいます。    A    B    C 1 品 名  仕入先  発注数 ←タイトル行に設定したい 2 りんご  ヤマト   10  ← この行に▼が設定される 色々調べた結果のマクロなので、どこが悪いのか見当がつきません。 解りやすく教えていただける方がおられましたら、よろしくお願い致します m(__)m

  • オートフィルタで抽出したデータをVBAで貼り付けしたい

    質問させていただきます。 エクセルで仕入帳を作っています。 各取引先ごとに1枚のシートになっているのですが、 該当する月をオートフィルタで抽出して、そのデータを1枚のシートに貼り付けていき、各月ごとにデータをまとめたいと思っています。 ユーザーフォームで月を入力してオートフィルタで抽出しているのですが、データのないシートの場合不要な部分までコピー&ペーストされてしまいます。 これを回避するにはどのようにコードをかけばいいのでしょうか。 よろしくお願い致します。 現在はこのようなコードで抽出しています。 Private Sub CommandButton1_Click() Application.ScreenUpdating = False Worksheets("sheet2").Select Range("H1:H17").Select Range("H17").Activate Selection.AutoFilter Field:=8 Rows("2:2").Select Rows("2:500").Select Selection.ClearContents RowIndex = 3 '行番号の初期値設定 Do While Worksheets("目次").Cells(RowIndex, 1).Value <> "" '拾ったセルの値が空でない間ループ内の処理をする 検索値 = UserForm1.TextBox1.Text DataSheetName = Worksheets("目次").Cells(RowIndex, 1).Value Worksheets(DataSheetName).Select Range("A2").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=13, Criteria1:=検索値 & "月分" Set tbl = ActiveCell.CurrentRegion tbl.Offset(2, 0).Resize(tbl.Rows.Count - 2, tbl.Columns.Count).Select Selection.Copy Worksheets("sheet2").Select IRow = Range("A" & Rows.Count).End(xlUp).Row Range("A" & IRow + 1).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Worksheets(DataSheetName).Select Selection.AutoFilter Field:=13 RowIndex = RowIndex + 1 '行番号カウントアップ Loop Application.ScreenUpdating = True Worksheets("sheet2").Select Range("A2").Select Unload UserForm1 End Sub

  • 抽出マクロが上手くいきません教えてください!

    数値と文字が混在しているB列に、 入力されている数値データの最後のみをを違う合計シートに抽出したいのですが、 上手くいきません。。 下記のマクロなのですが。。 分かる方教えてください お願いします ThisWOrkbook1 Private SubWorkbook_Open() Dim NO As Double Dim シート名 As String For l = 70 To 130 シート名 = Worksheet("goukei").Range("B" & l).Value Debug.Print シート名 Worksheets(シート名).Select Range("B30").End(xlUp).Offset(0).Select NO = Range("B30").End(xlUp).Offset(0).Value Debug.Print NO Worksheets("goukei").Select Range("C" & l) = NO Next End Sub

  • エクセル2003 条件抽出したデータを切り取り別シートへ貼り付け

    シート1にあるデータから3個のキーワードで抽出したデータを切り取り、シート2に貼り付ける方法を教えてください。  今までは抽出する条件のキーワードが2個以下だったので、オートフィルタのオプションで抽出したデータをコピーしてシート2に貼り付け、シート1で可視セルを選択して削除という方法をとっていました。  今回、条件にするキーワードが3個になったので、フィルタオプションの設定で、シート2のA1からA4にキーワードを入れて、検索条件範囲を指定してデータを抽出したので、今までの方法が使えなくなってしまいました。 参考までに、↓こんな感じです。 Sheets("Sheet2").Select Range("A1") = "条件" Range("A2") = "キーワード1" Range("A3") = "キーワード2" Range("A4") = "キーワード3" Sheets("Sheet1").Cells.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _ Range("A1:A4"), CopyToRange:=Range("A6"), Unique:=False

  • 抽出データのコピー

    OFFICE2016 AAのシートのA列を1件ずつ参照し、BBのシートでそれぞれに対応するデータを抽出し、CCのシートへコピーするマクロを作成していますが、 抽出したデータをコピーした後に保存すると、容量がものすごく大きくなっています。 原因は、コピー後にCCのシートが最終行まで使用されている状態になっているから。 下記は作成途中のマクロです Sub TEST() ' Sheets("CC").Select Cells.Select Selection.ClearContents Dim i As Long i = 1 Dim M As String M = Worksheets("AA").Cells(i, 1).Value Sheets("BB").Select Worksheets("BB").Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=M Columns("A:C").SpecialCells(xlCellTypeVisible).copy Worksheets("CC").Range("B1").PasteSpecial Paste:=xlPasteAll Application.CutCopyMode = False ' Worksheets("BB").Range("A1").CurrentRegion.AutoFilter End Sub 何が原因なのでしょう? また、その解消法教えていただきたく、よろしくお願いします。

  • マクロでのデータ抽出

    毎月の売上データの一覧から必要なデータのみ抽出して、伝票を作成します。 伝票は明細単位で抽出します。 マクロを組もうとしているのですが、1、2行目のように1案件につき明細が2つある場合があるので、どのようなコードになるのかがわかりません。 コードの中で明細をカウントして、その分だけコピーするような手順になるのでしょうか? また伝票は「分類」ごとに作成します。 こちらは分類ごとにシートを作成し、フィルタにかけたデータをコピーしようと思っています。 マクロは初心者で説明不足な部分がありましたら申し訳ありません。 よろしくお願い致します。

  • EXCEL VBA オートフィルで別シートへコピー

    EXCEL VBA オートフィルで別シートへコピー しようとしたら、うまくいきません 別々に書くとうまくいくのですが コードを一緒にするとうまくいきません? コード *********************************************** Sub 抽出別シート() Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1" '1時間以下の8列目のをフィルター end sub sub カレントで別シートへコピー() Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")   'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** このように書くとうまくいくのですが これを一緒に書くと別シートへコピーがうまくいきません。 全てコピーされてしまいます +++++++++++++++++++++++++++++++++++++++++++++++ 一緒にしたコードです +++++++++++++++++++++++++++++++++++++++++++++++ *********************************************** Sub 抽出別シート() '1h以下をを抽出別シートへコピー Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1"    '1時間以下の8列目のをフィルター Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")    'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** 意味が分かりませんどなたかおしえていただけませんでしょうか? よろしくお願いいたします

  • VBA オートフィルタで抽出したものを連続貼り付け

    下記のように情報が100近くまで存在した場合に、オートフィルターで一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですが、どうすれば良いのでしょうか? 1 1 1 2 2 2 3 3 3 たとえばシート1に 1 1 1     シート2に 2 2 2 といったように処理したいので、教えて下さい。 vbaの参考書とサンプルを見て下記のように作成したのですが上手くいきません。 どんな本を読めば作成出来るようになるのかわからず、質問させていただきました。 ub オートフィルター() Dim myRng As Range Dim mySht As Worksheet Set myRng = _ Worksheets(1).Range("A1").CurrentRegion With Worksheets Set mySht = .Add(after:=.Item(.Count)) End With With myRng .AutoFilter field:=1, Criteria1:=8 On Error Resume Next .Resize(.Rows.Count - 1).Offset(1).Copy mySht.Range("A1") .SpecialCells(xlCellTypeVisible).Copy mySht.Range("A1").AutoFilter mySht.Range("A1").AutoFilter If Err.Number <> 0 Then Application.DisplayAlerts = False mySht.Delete Application.DisplayAlerts = True End If On Error GoTo 0 End With Set myRng = Nothing Set mySht = Nothing End Sub

  • エクセル データ抽出・印刷

    下記のような表でデータ抽出・印刷はうまくいくのですが、B2に抽出された氏名をいれたいのですが、うまくいきませんどのようにしたらよろしいでしょうか   A    B  C 1  2    _  3 4  5  6 No  氏名 金額 7 100 Aさん 1000 8 100 Aさん 1000 9 102 Bさん 1000 10 103 Cさん 1000 11 102 Bさん 1000 12 104 Dさん 1000 ※データの抽出方法は下記のとおりです。 Sub ListPrint_Test() 'リストの最終行の行番号を格納する Dim lngLastRow As Long Dim objList As Object Dim objListData As Object Dim objTempSheet As Object '何回か同じ記述が必要になるので、Tempシートをオブジェクト変数に格納 Set objTempSheet = ThisWorkbook.Worksheets("Temp") '既に作成されている抽出用リストを削除する objTempSheet.Range("A6").CurrentRegion.ClearContents '抽出条件用のリストを作成する lngLastRow = ActiveSheet.Range("A6").End(xlDown).Row ActiveSheet.Range("A6:A" & lngLastRow).AdvancedFilter xlFilterCopy, , objTempSheet.Range("A6"), True 'できあがった抽出条件リストのセル範囲を格納する lngLastRow = objTempSheet.Range("A6").End(xlDown).Row Set objList = objTempSheet.Range("A7:A" & lngLastRow) 'オートフィルターを実行し、全項目分印刷を繰り返す For Each objListData In objList Range("A6").Select Selection.AutoFilter Field:=1, Criteria1:=objListData.Value MsgBox "抽出条件:" & objListData.Value & " データの印刷をしています" ActiveWindow.SelectedSheets.PrintOut Copies:=1 Next 'オートフィルターを解除する Selection.AutoFilter End Sub

  • 必要項目(列)データに絞った抽出貼付で。。

    別ブック・シート (一覧) 日付 - 項目1 - 項目2 - 項目3 - 項目4 - 項目5 - 項目6 ↓ 上記のフォーマットで日付データ(連続)で並んでいます これを読み込み、一致する日付データ行でフィルタを掛け、 日付と必要項目(列)データに絞った印刷用シートとして 今開いているブックに作成したいのですが、 当該ブック・シート (印刷用) 日付 - 項目2 - 項目5 - 項目6 ↓ -  項目2合計 - 項目5合計 - 項目6合計 その際、抽出データ項目の各合計も行末尾に追加したい --------------------------- インプットボックス入力日付でフィルタを掛けコピーされたデータ Worksheets("一覧").AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy この場合、そのまま貼付は PasteSpecial xlPasteAll ですが、 必要項目(列)だけ貼付はどのようにすればいいのでしょうか また、平均30行ほど抽出になるので印刷シートの抽出項目合計セルは、 30行以降にSUM関数を埋め込んでおけば問題はありませんか? (毎日印刷するので上書きが心配です) 最近、行単位での抽出貼付、シート保存を覚えたばかりで、 なんとかそれまでできますが、個別列の抽出貼付で困っています。 SpecialCellsの他に方法はありますか? ご教示願います。

専門家に質問してみよう