Excel VBAでオートフィルタで抽出したデータの一部だけ貼り付ける方法

このQ&Aのポイント
  • Excel VBAを使用して、オートフィルタで抽出したデータの一部だけを別の場所に貼り付ける方法を教えてください。
  • 具体的には、Sheet2のデータに複数の条件でソートをかけ、指定した数字に基づいてE列のデータを選択し、Sheet1の特定のセルに貼り付けるという作業です。
  • マクロの実行の流れやコードの記述方法を詳しく教えていただけると助かります。
回答を見る
  • ベストアンサー

Excel VBAでオートフィルタで抽出したデータの一部だけ貼り付けるには

いつもこのコーナーでは皆様にお世話になっております。以下のVBAマクロが組める方ご教示ください。 Sheet2にあるデータに複数条件でソートをかけ、ある数字(1から18まで)を入れたら、オートフィルタでE列のデータの選択部をSheet1のある部分に1行貼り付けるという作業です。以下のInputBoxに数字を入れるところからです。 (ソート後、どの数字を入れるか判断) ↓ InputBoxにある数字"○"(1から18まで)を入れる ↓ オートフィルタE列「"○-"で始まる」or「"-○"で終わる」 ↓ 抽出されたデータのE列(1列だけ)のデータ(上から17個分)を選択 ↓ 選択部をコピー ↓ Sheet1を選択。Sheet1の"K5"セルに行列を入れ替えて貼り付け という流れなのですが・・・ わかる方教えてください。よろしくお願いします。

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

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

#3 は、また、ミスです。(集中力が落ちてきました。) # 訂正後: Dim Cr1 As Variant Dim i As Long, c As Range

okkouta
質問者

お礼

難題に対し、何度も(集中力がなくなりつつも)回答くださり頭の下がる思いでいっぱいです。今マクロを実行する時間がないのでまだ試していませんが、明日までには必ず動作確認いたします。 結果についてはまた「お礼」の欄に記載する予定です。

okkouta
質問者

補足

動作確認しました。するとF1セルにある▼が青色になっており(抽出データはなし)、それをクリックして(オプション)をクリックすると 「○-」で始まる OR 「○-」で始まる となっていました。だからデータが抽出されないんですね! ちなみに、▼クリック後(すべて)をクリックすると全データが表示されます。(元に戻ります) おそらくマクロの Criteria1:="=" & Cr1 & "-*", _ Operator:=xlOr, _ Criteria2:="=" & Cr1 & "-*" 部分がおかしいのではないかと考えられますが、いかがでしょうか? (私にもっと力があればこの部分を修正して手直しすればいいのですが、やってみても改善できませんでした。情けない・・・) 修正できますか?おねがい致します。

その他の回答 (3)

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

すみません。変数の宣言の訂正があります。製作段階では、置いていた変数を省略しましたので、以下のように張り替えてください。 × Dim AFilterRng As Range, Cr1 As Variant × Dim myPickUp, i As Long, c As Range      ↓ 訂正後: Dim As Range, Cr1 As Variant Dim i As Long, c As Range 以上のとおりです。

okkouta
質問者

お礼

#4のあと修正しました。#2のお礼をご覧ください。

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

こんにちは。 >データが仮にB列からJ列までしかなくても、上のマクロの「With Range("A1").CurrentRegion」という記述でOKですか? たぶん、A1に隣り合っているデータがあれば、範囲は取れますが、固定した範囲でしたら、 例: With Range("B1:J50") このようにした方がより良いです。 しかし、データが可変の場合は、このようにしてください。 With Range("B1", Range("B65536").End(xlUp).Offset(, 8)) この意味は、B1 とB列の最後から上に上っていって、データのあるところの範囲を、右に、J列まで拡大する、ということです。 >右隣のF列(数値)でした。申し訳ありません。 前: For Each c In .Range(Cells(2, 5), Cells(2, 5).End(xlDown)). _            ↓  For Each c In .Range(Cells(2, 6), Cells(2, 6).End(xlDown)). _ ということになりますね。 これ以外の部分は、よろしいのですか?

okkouta
質問者

お礼

回答者Wendy02さんへ #4のあとチャレンジして修正してみました。 するとなんとできたではありませんか!! 該当部分を Criteria1:="=" & Cr1 & "-*", _ Operator:=xlOr, _ Criteria2:="=" & "*-" & Cr1 で行けました。ただ不思議なことにE列なのに Field:=4で 貼り付けたい列はF列なのに 前: For Each c In .Range(Cells(2, 5), Cells(2, 5).End(xlDown)). _ のほうで正解でした。A列に何もデータがなくB列からK列までに入っているのが原因ですかね~ 何はともあれうまく行きました。ありがとうございました。とてもうれしいです。

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

こんにちは。 ちょっと確認しますが、 >抽出されたデータのE列(1列だけ)のデータ(上から17個分)を選択 のデータは、文字列ですね。そうでないと今の方法は無理だと思います。 当然、フィールド名(1行目のタイトル名)はありますね。つまり、データの上からと言っても、E1 は、貼り付けデータとしないということです。そのように作られています。 >Sheet1を選択。Sheet1の"K5"セルに行列を入れ替えて貼り付け 行列を入れ替えというよりは、縦のデータを横に入れ替えて貼り付けするということですね。 '--------------------------------------------------- '<なるべく標準モジュールに設定してください> Sub PickUpSort()  Dim AFilterRng As Range, Cr1 As Variant  Dim myPickUp, i As Long, c As Range  '  Worksheets("Sheet2").Select '--ソート後---  'エラーチェック(この部分は必要なければ、取り除いてください)  With Range("A1").CurrentRegion  If .Count = 1 Then   MsgBox "オートフィルタは作れません.", vbCritical   Exit Sub  End If  '  Do  Cr1 = Application.InputBox("1~18までの数字を入れてください", Type:=2)  If VarType(Cr1) = vbBoolean Or Cr1 = "" Then   Exit Sub  ElseIf CLng(Cr1) < 1 Or CLng(Cr1) > 18 Then   MsgBox "1~18までの数を入れてください", vbInformation  End If  Loop Until CLng(Cr1) > 0 And CLng(Cr1) < 19  .AutoFilter _  Field:=5, _  Criteria1:="=" & Cr1 & "-*", _  Operator:=xlOr, _  Criteria2:="=" & Cr1 & "-*"  For Each c In .Range(Cells(2, 5), Cells(2, 5).End(xlDown)). _   SpecialCells(xlCellTypeVisible)   Worksheets("Sheet1").Range("K12").Offset(, i).Value = c.Value   If i = 17 Then Exit For   i = i + 1  Next  End With  Beep '終了の合図 End Sub '---------------------------------------------------

okkouta
質問者

補足

すみません。ひとつ当方のミスがございました。 オートフィルタで抽出するデータはE列で「文字列」で間違いないのですが、上から17個分選択するのはその右隣のF列(数値)でした。申し訳ありません。 あとは確認事項のとおりで、 フィールド名(1行目のタイトル名)はあります。 E1 は、貼り付けデータとしないということです-でOKです。 行列を入れ替えというよりは、縦のデータを横に入れ替えて貼り付けするということです。相違ございません。 データが仮にB列からJ列までしかなくても、上のマクロの「With Range("A1").CurrentRegion」という記述でOKですか?

関連するQ&A

  • Excel VBAでオートフィルタで抽出したデータの一部だけ貼り付けるには(第2弾)

    今週質問タイトルの件で回答いただき解決したのですが、更なる操作を希望したく質問させていただきました。内容は Sheet2にあるデータに複数条件でソートをかけ、ある数字(1から18まで)を入れたら、オートフィルタでE列のデータの選択部をSheet1のある部分に1行貼り付けるという作業です。以下のInputBoxに数字を入れるところからです。 (ソート後、どの数字を入れるか判断) ↓ InputBoxにある数字"○"(1から18まで)を入れる ↓ オートフィルタE列「"○-"で始まる」or「"-○"で終わる」 ↓ 抽出されたデータの右隣のF列(1列だけ)のデータ(上から17個分)を選択 ↓ 選択部をコピー ↓ Sheet1を選択。Sheet1の"K5"セルに行列を入れ替えて貼り付け というものでしたが、これはできました。ここから先です。 Sheet1のU5セルに先ほどインプットした数字"○"(1から18までのどれか)を入れる ↓ Sheet2にてオートフィルタE列「"○-"で始まる」or「"-○"で終わる」によって抽出されたデータの一番上の文字列から「"○-"」もしくは「"-○"」を除いて残った数字(○を除く1から18までの数字)をSheet1のW5セルに(先ほどのセルとは1個飛ばして)入れる ↓ 以下抽出されたデータの上から2番目の文字列を同様に操作し、1個飛ばしのセルY5に入れる。これがBC5セルまで続く というものです。難しいとは存じますが、どなたか教えていただけませんか? よろしくお願いいたします。

  • エクセルのオートフィルタ機能について

    スミマセン。初心者ですのでかなり低レベルな質問かと思いますがよろしくお願いします。 エクセルで作られた表があります。 D列に年齢、E列に性別が入力されていて、 オートフィルタ機能を使って、30代、女性を抽出しなくてはなりません。 そこでD列とE列すべてを選択し、データ→フィルタ→オートフィルタを選択しました。 それぞれの列の先頭に矢印が出てきました。 そこでD列の矢印をクリックし、オプションを選択。 出てきたオートフィルタオブションに 30歳 以上 AND 39歳 以下 と選択してみたのですが、何も抽出されません。 30歳 より大きい AND 39歳 より小さい でもダメでした。 性別の方は「女性」を選択したら出てきたので問題はないのですが。 私は何を間違えているのでしょうか? 是非教えてください。 ちなみに一度だけいじっていた時にちゃんと抽出されました(^-^; ただ、次にやったらまた抽出されなくなり、 正しく抽出された時と、そうでない時との違いが自分ではわかりません(><”) よろしくお願いします。

  • エクセルのオートフィルタでのデータ抽出&カウント

    エクセルのローデータでのオートフィルタでのデータ抽出&カウントで困っています。 A列にNo.、B列にデータB、C列にデータC、D列にデータDがあるとします。 それぞれの列に1~9までの数字があり、 それぞれの列、 データの一番下(正確には1行開けて)にはSUMやCOUNTIFなどの関数(計算式)が入っています。 で、これをフィルターにかけ抽出した際、この抽出したデータのみで計算の値を表示したいのですが、 やってみると 全データの計算の値で表示されてしまいます。 どうすればよいのでしょうか? 大変困っています。 よろしくお願いいたします。

  • 「~以上、~以下」のオートフィルタのVBAについて

    こんばんは、オートフィルタについて2つ質問させてください! 1つ目は、10列目に入っている値で、20170901以上かつ20170931以下の値をオートフィルタで抽出しようと以下のVBAを入力しましたが、該当するデータがあるにも関わらず抽出ができませんでした(T_T)何か間違っているのでしょうか…?! Range("A1:K" & Cells(1).CurrentRegion.Rows.Count).AutoFilter Field:=10, Criteria1:=">=20170901" _ , Operator:=xlAnd, Criteria2:="<=20170931" 2つ目は、同様のデータでInputBoxを利用し、入力した数字をそのままオートフィルタの条件に反映しようとする以下のVBAを入力してみました。しかし、やはり記述の方法が違うのか該当するデータがあるにも関わらず抽出は成功しませんでした・・・。 Dim 日付 As Date 日付 = InputBox("処理月を入力して下さい(例:201709)") Range("A1:K" & Cells(1).CurrentRegion.Rows.Count).AutoFilter Field:=10, Criteria1:=">= 日付 & 01" _ , Operator:=xlAnd, Criteria2:="<= 日付 & 31 " どなたかご助力いただけるととても助かります、どうぞよろしくお願いいたします!m(_ _)m

  • マクロでオートフィルターの抽出が出来ない

    下記のデーターをマクロで作成しましたが、2010/03/01は抽出するが、2010/03/02以降は デバッグが発生して上手くいきません。 どの様にすれば解決できるのか、ご教授お願いします。 現状) AファイルのA列のオートフィルタオプションで、抽出条件の指定にBファイルの C6をコピーして、「Ctrl」+「V」で貼り付け抽出すると2010/03/01の24時間分の データーが抽出されます。2010/03/02を抽出するとデバッグが発生する。 データーの詳細) Aファイルに「元データー Sheet」があり、A6~A44647に、 1ヶ月分の日付が記載されてます。 (B6~B44647には、24時間を1分間隔でのデーターがあります) A列の日付は、2010/03/01~2010/03/31のデーターがあり、 「セルの書式設定」を確認すると、「標準」設定で表記されてます。 オートフィルタによりA列の、各1日分のデーターを抽出させます。 Bファイルの「作成日指定 Sheet」のB3に2010/3/1を入力すると C6には「=$B$3」で「2010/03/01」と表示する様に「セルの書式設定」 「ユーザー定義」で「yyyy/mm/dd」を選択してます。(C36まで設定) 以下C7に「=$B$3+1」で、C8には「=$B$3+2」で、C36までで「2010/03/31」 と表示させてます。

  • エクセルのオートフィルターの活用を教えて下さい

    1.エクセルでオートフィルターを使って抽出したデータをコピーし   新規ファイルに形式を選択し貼り付け「値」OKをチェック。 2.新規修正されたデータを元のオートフィルター状態のデータに簡単  にコピー貼り付けでしょうか?

  • オートフィルタ抽出データのみ

    エクセルで オートフィルタで 抽出するさいに その列に打ち込まれている内容が選択できますが その打ち込まれているものだけ 別シートにほしいのですが 方法はありますか? 下記のエクセルシートで フィルタした場合 Aの抽出データの「青 赤 黄」を別シートに  A  B  C  D 1 青 10 済 A社 2 赤 50 未 B社 3 黄 10 済 A社 4 赤 10 未 B社 5 青 11 済 F社 6 ↓  A  B  C  D 1 青 2 赤 3 黄 4 5 上記のようにしたい場合どうしたらいいかお願いします。

  • エクセルのオートフィルタについて

    エクセルのオートフィルタについて以下の2つの作業が可能であれば教えて下さい。 (1)1桁目の数字が1、2、3、4の四つの場合の行を抽出することは可能でしょうか?オートフィルタオプションでは「or」条件で例えば1、2の二つの場合の行の抽出はできるのですが。 (2)6桁の数字があるとして5桁目が5の数字の行を抽出することは可能でしょうか?オートフィルタオプションでは「~で始まる」や「~で終わる」行の抽出はできるのですが。

  • オートフィルタで「・・で始まる」数値の抽出方法

    VBAでオートフィルタを使用して「95」から始まるデータを抽出して、そのデータを1行目の項目行を省いて別シートの最終行に貼り付けするマクロを作成していますが、上手くいかない部分があり困っています。 オートフィルタはセルに入っている値が数値データの場合は「○○で始まる」検索オプションが使えない仕様とのことです。 https://support.microsoft.com/ja-jp/kb/170230 数字をテキスト形式に変換すれば文字列として扱われるので、上記の検索オプションが使えるとのことで数値が入った列を全て文字列にしようとしましたが、上手くいきません。 下記のコードが一部抜粋のコードで、A列にオートフィルタで抽出したい5桁の数値が入っているとします。 元シート(移動先シートも同じような構成でデータが入っている) A    B   C   D    E ID   品名  単価  数量  金額 92153 りんご 100   10   1000 95235 ばなな 150   15   2250 95589 みかん 50   20   1000 87896 ぶどう 200   7   1400 Dim LastRow As Long, mySt(1) As Worksheet ActiveWorkbook.Worksheets("元シート").Activate Set mySt(0) = Worksheets("元シート") Set mySt(1) = Worksheets("移動先シート") Columns("A:A").Select Selection.NumberFormatLocal = "@" '←選択列を文字列にしようとしたが上手くいかず With mySt(0) LastRow = .Cells(Rows.Count, 1).End(xlUp).Row With .Range(.Rows(1), .Rows(LastRow)) .AutoFilter Field:=1, Criteria1:="95*", Operator:=xlAnd With .SpecialCells(xlCellTypeVisible) .Copy mySt(1).Rows(1) End With End With End With また、オートフィルタで抽出したデータをコピーして、既にデータが入っている移動先シートの最終行に貼り付けたいのですが、上手くいかず、2行目に貼り付けられてしまいます。 移動先シートの最終行の取得と貼付け方法が検索してもよく分からず困っています。 2点につきまして、分かる方がいましたら教えて頂けますと助かります。 よろしくお願いいたします。

  • EXCELのオートフィルタのコピーについて

    EXCEL2000を使用しています。 オートフィルターにて抽出し一部をコピーし同じシートの別の列に貼り付けすると 隠れている行にもコピーされ表示されたところだけにコピーされません。 よい方法はありますか?

専門家に質問してみよう