VBAマクロでデータを抽出し別ファイルにコピーする方法

このQ&Aのポイント
  • VBAマクロを使用して、自動記録で抽出したデータを別のファイルにまとめる方法について質問です。データの更新時に範囲の指定をやり直さず、シンプルで応用の効くコードを作成したいと考えています。
  • 集約するシートは「テスト用 sheet1(集約)」と「sheet2(条件)」で、元のデータは「金額一覧表(01~03)」、「金額一覧表(04~06)」、「金額一覧表(07~10)」です。
  • データ転記のためのVBAマクロを作成している最中に、エラーが発生しました。エラーメッセージは「コピー領域と貼り付け領域の形が異なるため、情報を貼り付けることができません」というものです。原因や解決策について教えてください。
回答を見る
  • ベストアンサー

マクロを使って、抽出したデータを別のファイルにコピーしたい

VBA初心者です。 自動記録で、フィルターオプション設定を使い抽出したデータを、別ファイルにまとめようとしています。 自動記録ですので、実行はできるのですが、このままだとデータの更新があった時、 範囲の指定をやり直すことになりますので、少しシンプルで応用の効くコードにしたいと思っています。 集約するシート:テスト用 sheet1(集約) sheet2(条件) 元のデータ:金額一覧表(01~03) 金額一覧表(04~06) 金額一覧表(07~10) sheet1=ファイル名 <各データは2万~3万件> Sub 抽出_1() Windows("金額一覧表(01~03).xls").Activate Range("A1:R16824").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Workbooks("テスト用.xls").Sheets("条件").Range("A1:F27"), Unique:=False End Sub ------------------------------------------------ Sub データを転記_1() Windows("金額一覧表(01~03).xls").Activate Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy Windows("テスト用.xls").Activate Sheets("集約").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub ---------------------------------------------------  又、金額一覧表(01~03)のデータを貼り付けた後、 金額一覧表(04~06)も同じようにデータ抽出コピーしようとしたのですが、 Sub データを転記_() の6行目に下記のようなコードを入れたところ、 7行目がデバックしてしまいました。 (実行時エラ-:1004   コピー領域と貼り付け領域の形がちがうため情報を貼り付けることができません) とエラーが出てしまいました。 6行目  Set sakiRng = Range("A65536").End(xlUp).Offset(1) 7行目  ActiveSheet.Paste  ←ここがデバック 何か指定し忘れているものがあるのでしょうか? お知恵拝借できれば幸いです。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >Range("A1").Select  ←ここの部分を >ActiveSheet.Paste Range("A65536").End(xlUp).Offset(1).Select のように変えればよいです。 > A106:R211 ← 金額一覧表(04~06)〃 こういうように、貼り付け範囲を指定すると、コピーした範囲と大きさが違うのでエラーが出ますから、左上端を設定させればよいです。後は、範囲を自動的に指定してくれます。 >Range("A1:R16824").AdvancedFilter こういう場合、地続きになっていれば、Range("A1").AdvancedFilter だけでよいです。 その範囲を他に転用する場合は、 With Range("A1").CurrentRegion   .AdvancedFilter   ' ここに、With ステートメントの範囲を省略して書けます。 End With とします。 明示的に取りたい場合は、 >Range("A1:R16824").AdvancedFilter Range("A1",Range("R65536").End(xlUp)).AdvancedFilter となります。つまり、Rの右、S,T,.. 列にデータがある場合ですね。

nekonote19
質問者

お礼

返事が遅くなってすみません。 何回も教えて頂いて、恐縮です。 おかげさまで、なんとかうまくいきました! ありがとうございました。

nekonote19
質問者

補足

こんにちは。 丁寧な説明、ありがとうございます。 抽出の部分は、ご提示頂いたコードで上手くいきました。 ただ、コピーの時に、タイトル行まで貼り付けてしまいました。 Sub データを転記_1() Windows("金額一覧表(01~03).xls").Activate Sheets("金額一覧表(01~03)").Select Application.CutCopyMode = False Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy Windows("テスト用.xls").Activate Sheets("集約").Select Range("A65536").End(xlUp).Offset(1).Select ActiveSheet.Paste Application.CutCopyMode = False End Sub Selection.SpecialCells(xlCellTypeVisible).Select ↑  この辺りでコピー元を指定しているのだと思いますが… Range("A2",Range("R65536").End(xlUp) と入てみたのですが、「コンバイルエラー」 と出てしまいました。 すみません。自分ではどこにどのような指定すればよいのか、 よくわからないので、教えて頂ければ大変助かります。 よろしくお願いします。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 もしかして、こう書きませんでしたか?  Range("A2", Range("R65536").End(xlUp).SpecialCells(xlCellTypeVisible).Select  それは、   Range("A2", Range("R65536").End(xlUp)).SpecialCells(xlCellTypeVisible).Select   と書いてください。End(xlUp) の後の「)」が抜けていますが、これは私も良くやるミスです。他は今は分かりません。 なお、これとは直接関係ない話ですが、私は、 VBE のツール-オプション-編集 の自動構文チェックは、オフにしています。 間違いは間違いで赤い字になるので、「コンパイルエラー」のメッセージボックスの立ち上がりはうるさいのです。

nekonote19
質問者

お礼

遅くなってすみません。 投稿したつもりが、送信されていませんでした。 なんとか上手くいきました。ありがとうございます!!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 Selection.SpecialCells(xlCellTypeVisible).Select  '~~~~~~~~~ Selection.Copy Selection そのものが、コードを見る限りは、読み取れませんね。 それと、SpecialCellsで、可視セルをコピーしても、貼り付けは利きませんね。 こんな風にして、 Range("A1:R16824").Copy Windows("テスト用.xls").Activate Sheets("集約").Select Range("A1").Select ActiveSheet.Paste 通常はこのような書き方はしませんが、元のコードを使ってみました。 SpecialCells を使わなくても出来るはずです。ただし、バージョンなのか、何が原因かは分かりませんが、間の部分も全部コピーする、というトラブルを受けたことがあります。うまくいくか試してみてください。

nekonote19
質問者

補足

ご回答ありがとうございます。 え~っと、説明が悪くてすみません。 金額一覧表(01~03)のSheets("集約")への貼り付けはできています。 その後、金額一覧表(04~06)で抽出したデータを、 先に貼り付けたデータの最後行の次へコピーしたいのですが、 コードの入れ方や挿入場所がわからなのです。 Sheets("集約") A2:R105 ←金額一覧表(01~03)の抽出データ         A106:R211 ← 金額一覧表(04~06)〃         A212:R355 ← 金額一覧表(07~10)〃         ↑ コピー位置を自動取得したい それから、最初のフィルターをかける範囲ですが、 Range("A1:R16824").AdvancedFilter        ↑ データの入っている最後のセルを自動的に取得したいのです。 Range("A1:("R65536").End(xlUp).Row) のような書き方で良いのでしょうか? お手数かけますが、よろしくお願い致します。

関連するQ&A

  • 実行時エラー’438 の解消

    QNo.3040449 と同じ内容の質問です。本を見ながらコードを書いてみましたが、 実行時エラー’438 オブジェクトはこのプロパティまたは メソッドをサポートしていません。となってしまいました。 どこを変更すれば、よいのでしょうか? また、元データをそれぞれ、<条件>シートの内容で抽出し、 可視セルのみ<集約>にコピーしたのち、他の2つの ファイルのデーターも先に貼り付けたデータの最後行の 下へコピーしたいのですが、コードがよくわかりません。 教えて頂ければ幸いです。 集約するシート:テスト用.xls sheet1.(集約) sheet2.(条件) 元のデータ: 金額一覧表(01~03).xls Sheet1.(01~03)   金額一覧表(04~06).xls Sheet1.(04~06)  金額一覧表(07~10).xls Sheet1.(07~10) <各データは1.5万~3万件> Sub 抽出後コピー() Dim myTbl As Range, myQry As Range, sakiRang As Range Dim Nx As Long Dim WBK As Workbook, WB1 As Workbook Dim SH1 As Worksheet, SH2 As Worksheet Set WBK = Workbooks("テスト用.xls") Set WB1 = Workbooks("金額一覧表(01~3).xls") Set SH1 = WB1.Sheets("(01-03)") WBK.Activate WB1.Activate Nx = SH1.Range("R65536").End(xlUp).Row Set myTbl = WB1.SH1.Range("A1:Nx") ←ここでデバック Set myQry = WBK.Sheets("条件").Range("A1:F27") Set sakiRang = WBK.Sheets("集約").Range("A1") myTbl.AdvancedFilter xlFilterCopy, myQry, sakiRng End Sub

  • マクロを教えてください

    同じフォルダ内にあるXlsブックのあるSheetのデータを他のBookにコピーして貼り付けて貼り付けた側のBookで加工したいのですがうまくマクロが組めません。 Bookを共有で使っているので困っています。 Sub ワードアート1_Click ' ActiveWindow.ScrollWorkbookTabs sition:=xlLast Workbooks.Open ("販売管理表み.xls") Sheets("在庫一覧").Select Cells.Select Range("A1").Activate Selection.Copy Windows("完成在庫.xls").Activate Sheets("完成在庫一覧").Select Range("A1").Select ActiveSheet.Paste End Sub って書いてみましたが、Workbooks…のところでエラーになってしまいました。(TOT)初心者ですみません。教えてください。

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

    マクロについて勉強中の者です。 "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

  • マクロを使ったコピペがうまく動作しない。

    あるデータを転記用のブック(月毎にシートが分かれています。シートの内容は同一)に貼り付ける処理を行うため、下記のようなマクロを組んだのですが、何故か貼りつきません。処理終了時には、転記元ブック(シート)で最終処理の範囲(5番目のB287)を選択しています。一体何がいけないのでしょうか? データはA1からPまでで毎月可変しています。 また、転記用ブックが12枚あるため、月を指定してから貼り付けたいのですが、どのようにすればよいでしょうか?(下記は直接シ-トを指定しました) Sub test() Dim 最終行 As Integer '-------------------------------------------- 開始 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("1").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B1").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 1 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("2").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B83").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 2 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("3").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B157").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 3 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("4").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B227").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 4 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("5").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B287").PasteSpecial Paste:=xlPasteValues --------------------------------------------- 5 End Sub 

  • エクセルマクロ 抽出したデータを別のシートへコピーしたい

    マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 【1】シート名「データ」をA列でオートフィルタ抽出して、別シートにコピーする。 【2】別シートにコピーしたデータに外枠罫線をつける。 【3】シート名「データ」には塗りつぶしがあるので、別シートにコピーされた塗りつぶしは「なし」する。 【4】シート名「Sheet1」の1~2行目をコピーし、別シートの1~2行目に挿入し、シート名「データ」に戻る。 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、今はコピーして「あ行」の部分を書き換えています。(かなり面倒です) 最終的には、抽出されたそれぞれのシートを別々のブックにしたいとも思っています。 長々とすみませんが、どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 Sheets("データ").Select Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="あ行", Operator:=xlAnd Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy Sheets("あ行").Select Range("A1").Select ActiveSheet.Paste Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Cells.Select Selection.Interior.ColorIndex = xlNone Sheets("Sheet1").Select Rows("1:2").Select Selection.Copy Sheets("あ行").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown Range("A1").Select Sheets("データ").Select Range("A1").Select

  • マクロでコピー&ペースト処理が遅いような気がします。単純化したいです。

    Sub ***出力(file, num) Workbooks.Open (file) Cells.Clear Windows("xxx.xls").Activate Sheets("***").Select Range(num & "2:" & num & "2000").Select Selection.Copy Windows(file).Activate Range("A1").PasteSpecial Paste:=xlPasteValues End Sub 2行目から2000行目の中には計算値が入っています(結構ながい)。 その値を"file"に値のみペーストします。 しかし、処理が遅いので早くしたいです。 単純化できないでしょうか?

  • マクロ!一覧から別シートへの抽出

    商品の納期や、集金日などが一覧になっている【一覧】シートがあります。 他に集金月別にシート【4月】【5月】…と一年分12シートあります。 一覧シートは、空欄セルに店舗名や納期などを随時入力していき、データは増えていくのみです。 下記のマクロでデータの抽出・抽出結果のコピー・貼り付けを行っています。 Sub Macro4() ' ' Macro4 Macro ' 集金月で抽出 Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets("一覧").Range("B65536").End(xlUp).Row myRow2 = Sheets("4月").Range("B65536").End(xlUp).Row If myRow2 >= 3 Then ★ Sheets("4月").Range("A3:P" & myRow2).ClearContents End If Sheets("一覧").Range("A3:P" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("G1:H2"), CopyToRange:=Range("A4:P4"), Unique:=False End Sub 一覧以外のシート全てに、上記マクロを登録した【抽出】ボタンを設置し G1:H1セルには集金日と検索項目のタイトル G2セルには>=4/1、H2セルには<=4/30 抽出ボタンをクリックして一覧から取得しています。  マクロは、説明が載っているHPからの独学なのでどう応用すれば良いのかがわかりません。 一覧に追加入力し、4月シートに4月分抽出。次に5月シートに5月分抽出とすると4月シートの抽出結果が消えてしまいます。 そこで、★で指定している4月シートではなく、現在選択している”シート”としたいのですが、どのように記述すればよいかわかりません。 自分が分からない事を、どう検索してよいかも分からなくなってきたので、どうかアドバイスお願いします。

  • 別ブックからのデータ取り込み

    下記の(1)(2)のマクロを(3)のコマンドボタンで実行させています。 (1)(2)を使用せずに(3)のコマンドボタンにまとめて記載したいのですが上手く出来ません。 また、(1)の"A:\あ.CSV"部分ですが、使用PCによってドライブが異なる場合があるります。セルC2に入力したドライブ名を反映させることはできないでしょうか? よろしくお願いします。 (1) Sub I()    Workbooks.Open Filename:="A:\あ.xls"    lngR = Range("B65536").End(xlUp).Row    Range("B2:B" & lngR).Select    Selection.Copy    Windows("か.xls").Activate    Range("B3").Select    ActiveSheet.Paste    lngR = Range("B65536").End(xlUp).Row    Range("B2:F" & lngR).Select    With Selection.Font     .Size = 8    End With     End Sub (2) Sub II()    Windows("あ.xls").Activate    lngR = Range("E65536").End(xlUp).Row    Range("E2:E" & lngR).Select    Selection.Copy    Windows("か.xls").Activate    Range("G3").Select    ActiveSheet.Paste    lngR = Range("G65536").End(xlUp).Row    Range("G2:G" & lngR).Select    Selection.Style = "Comma [0]"    With Selection.Font     .Size = 9    End With    Windows("あ.xls").Activate    ActiveWindow.Close   End Sub (3) Private Sub 取込_Click()    Application.ScreenUpdating = False    Protect UserInterfaceOnly:=True    Application.Run "I"    Application.Run "II"    Selection.Locked = False    Applicaion.ScreenUpdating = True   End Sub

  • 複数のシートに 転記

    Sub べんきょう()   Worksheets(Array(1, 3)).Select   Range("3:3").Activate   ActiveCell.ClearContents  End Sub シート1,3の3行目のデータを消したい もしくは Sub べんきょう()   Worksheets(Array(1, 3)).Select   Range("3:3").Activate   ActiveCell.Interior.color = xlNone  End Sub シート1,3の3行目の色を消したい うまくいかなくて困ってます…。 どなたかどうかご指導よろしくです。

  • 抽出データのコピー

    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 何が原因なのでしょう? また、その解消法教えていただきたく、よろしくお願いします。

専門家に質問してみよう