• 締切済み

VBAを使用したデータの抽出について

sheet1に下記のような(例)データベースがありA~N列までデータが入力されています。 A B  C  D  E   F  G  H I J  N 1 ○○様 ○○  2名  車   可 東京 *** *** *** 2015/7/1 2 ○○様 ××  3名  車  不可 埼玉 2015/8/1 3 ○○様 ×□  2名  電車 不可 愛知 2015/8/12 4 ○○様 □□  4名  バス  可  新潟 2015/7/13 5 ○○様 ○×  3名  バス  可  宮城 2015/6/1 6 ○○様 ○□  4名  車  不可 大阪 2015/8/21 7 ○○様 □○  2名  バス  可  山梨 2015/8/7 「sheet1」B列のデータを元にして、別シート(sheet2)のA2列に抽出したいもの(例:バス)を入力し、 フォームボタン(例:抽出)で検索し、抽出された結果のsheet1のA列~G列、N列のみ(H列~J列は不要)をSheet2のA11以下へ表示したいと考えています。 A  B  C  D  E   F  G   N 4 ○○様 □□  4名  バス  可  新潟 2015/7/13 5 ○○様 ○×  3名  バス  可  宮城 2015/6/1 7 ○○様 □○  2名  バス  可  山梨 2015/8/7 どのようなVBAのコードを使用すれば良いでしょうか。 宜しくお願いします。

みんなの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 御質問文の例では、Sheet1にはいきなり1行目からデータが入力されている様に書かれていますが、実際にはA列に1と入力されているセルはA1セルなどではなく、そのA列に1と入力されている行の上には何らかの項目名が入力されている行があるのではないでしょうか?  御質問の件の様なVBAのマクロを作るためには、何行目からデータが入力されているのかという事に関する情報も必要になる場合が多いので、実際のデータが何行目から入力されているのかという事も忘れずに説明しておく様にして下さい。  尚、いきなり1行目からデータが入力されている場合には処理が面倒になりますので、いきなり1行目からデータを入力する事はなるべく避けた方が宜しいかと思います。  それで、実際のデータが何行目から入力されているのかという事が不明なため、取り敢えず仮の話として、Sheet1において項目名が入力されている行は2行目であり、実際のデータは3行目以下に入力されているものとします。  その場合、色々なやり方がありますが、一例としてオートフィルターを利用した方法では次の様なVBAマクロとなります。 Sub QNo9008324_VBAを使用したデータの抽出について() Dim CopySheet As Worksheet, PasteSheet As Worksheet, _ ItemRow As Long, LastRow As Long, PasteCell As Range, _ CopyColumn As String, UnwantedColumn As String, _ ReferenceColumn As String, myCriteria As Variant, _ CriteriaCell As Range Set CopySheet = Sheets("Sheet1") '元データが入力されているシート Set PasteSheet = Sheets("Sheet2") '貼付け先のシート CopyColumn = "A:N" 'コピーする元データが入力されている列の範囲 UnwantedColumn = "H:J" 'コピーする必要のない列の範囲 ReferenceColumn = "E" '抽出したいものが入力されている列 ItemRow = 2 ' 元データの表の項目欄の行番号 Set PasteCell = PasteSheet.Range("A11") '貼付け先のセル範囲の中で最も左上にあるセル Set CriteriaCell = PasteSheet.Range("A2") '抽出したいものが入力されているセル myCriteria = CriteriaCell.Value If myCriteria = "" Then MsgBox "抽出すべき項目が指定されていないため処理を行う事が出来ません。" & _ "マクロを一旦、終了しますので、抽出すべき項目を" _ & PasteCell.Parent.Name & "!" & PasteCell.Address(False, False) & _ "セルに入力してから本マクロによる処理をやり直して下さい。", _ vbExclamation, "抽出項目未設定" Exit Sub End If LastRow = CopySheet.Range(ReferenceColumn & Rows.Count).End(xlUp).Row If LastRow <= ItemRow Or WorksheetFunction.CountIf(CopySheet. _ Range(ReferenceColumn & ItemRow & ":" & ReferenceColumn & LastRow), _ myCriteria) = 0 Then MsgBox "抽出すべきデータがありません。", vbInformation, "データ無し" Exit Sub End If Application.ScreenUpdating = False PasteCell.Resize(PasteSheet.Cells.SpecialCells(xlCellTypeLastCell).Row - PasteCell.Row + 1, _ Columns(CopyColumn).Columns.Count - Columns(UnwantedColumn).Columns.Count).ClearContents With CopySheet If .AutoFilterMode Then CopySheet.Cells.AutoFilter .Columns(UnwantedColumn).EntireColumn.Hidden = True .Range(ReferenceColumn & ItemRow & ":" & ReferenceColumn & LastRow). _ AutoFilter Field:=1, Criteria1:=myCriteria Intersect(.Columns(CopyColumn), .Rows(ItemRow & ":" & LastRow)).SpecialCells(xlCellTypeVisible).Copy PasteCell.PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False .Cells.AutoFilter .Columns(UnwantedColumn).EntireColumn.Hidden = False End With Application.ScreenUpdating = True End Sub  尚、もしSheet1において項目名が入力されている行が2行目ではなかった場合には、上記のVBAの構文中の ItemRow = 2 という箇所の2という数値の部分を、実際の項目名が入力されている行の行番号に合わせて修正して下さい。

関連するQ&A

  • VBA 複数条件でデータを抽出する場合

    sheet1に下記のような(例)データベースがありA~BS列までデータが入力されています。 A  B C  D  E   F  G  H I J  BS 1 ○○様 ○○  2名  車   可 埼玉 *** *** *** 2015/7/1 2 ○○様 ××  3名  車  不可 東京 2015/8/1 3 ○○様 ■■  2名  電車 不可 愛知 2015/8/12 4 ○○様 □□  4名  バス  可  新潟 2015/7/13 5 ○○様 ○×  3名  バス  可  宮城 2015/6/1 6 ○○様 ■□  4名  車  不可 東京 2015/8/21 7 ○○様 □○  2名  バス  可  山梨 2015/8/7 「sheet1」のデータでBS列の期間(YYYY/MM/DD~YYYY/MM/DD)とG列の地域名(例:東京)を抽出条件とし、 抽出された結果のsheet1のA列~G列、BS列のみ(H列~BT列は不要)をSheet2のA11以下へ表示するマクロを組みたいと考えています。 A  B  C  D  E   F  G   BS 2 ○○様 ××  3名  車  不可 東京 2015/8/1 6 ○○様 ■□  4名  車  不可 東京 2015/8/21 複数条件下の抽出の場合、どのようなVBAのコードを使用すれば良いでしょうか。 宜しくお願いします。

  • VBA 期間を指定してデータを別シートに抽出

    sheet1に下記のような(例)データベースがありA~N列までデータが入力されています。 A  B  C  D  E  F  G  H I J K L M  N 1 りんご ○○ BA 2526  ○  あお *** *** *** *** *** *** 2015/7/1 2 みかん ××  BC  2526 ○  あお 2015/8/1 3 すいか ●●  BB  2429  ●  あか 2015/8/12 4 メロン □□  DC  2355 □  あか 2015/7/13 5 バナナ ○×  FE  2526  ○  あお 2015/6/1 6 いちご ●□  LA  2429  ●  あお 2015/8/21 7 ぶどう □○  HK  2526  □  あか 2015/8/7 「sheet1」N列の日付を元にして、別シート(sheet2)のA2列に「開始日付(yyyy/mm/dd」、B2列に「終了日付(yyyy/mm/dd」(例:2015/8/1~2015/8/31)を入力し、フォームボタン(例:抽出)で検索を開始し、抽出された結果のsheet1のA列~G列、N列のみ(H列~M列は不要)をSheet2のA7以下へ表示したいと考えています。 A  B   C  D  E  F  G   N 2 みかん ××  BC  2526 ○   あお 2015/8/1 3 すいか ●●  BB  2429  ●  あか 2015/8/12 6 いちご ●□  LA  2429  ●  あお 2015/8/21 7 ぶどう □○  HK  2526  □  あか 2015/8/7 期間を指定し検索した結果を別のシートへ表示するにはどのようなVBAのコードを使用すれば良いでしょうか。 宜しくお願いします。

  • VBAにて、複数シートからデータを抽出

    エクセルVBAです。複数のシートからの集計、抽出の書き方について教えてください。 1つのファイルに50ほどのシートがあります。 各シートの列数やフォーマットは、同じですが行数は、異なります。 例 sheet1(シート名:集計):集計用   A    B    C       D     1 ※検索キーワードを入れるセルや 2   マクロを登録するボタン用として2行開けてある。 3 番号 氏名  郵便番号  住所  sheet2(シート名:STU)   A    B    C       D      1 番号 氏名  郵便番号  住所  2  1  AB   345    YZ 3  1  CD   678    QS sheet3(シート名:XYZ)   A    B    C       D      1 番号 氏名  郵便番号  住所  2  2  AB   345    YZ 3  2  CD   678    QS 4  3  CD   678    QZ 抽出前は、上記の様なファイルとなっております。 上記では、4列としてますが実際は、23列あります。 また、sheet3までですが、実際は、40~100シート位あります。 sheet1(シート名:集計):集計用   A    B    C       D     1     ※検索キーワード:氏名_CD としマクロを実行する  2       (↑例として氏名でフィルタリングしてますが他の指定項目でも実行したい、複数条件は、無)   3 番号 氏名  郵便番号  住所 4  1  CD   678    QS    (←sheet2(シート名:STU)の3列目) 5  2  CD   678    QS  (←sheet3(シート名:XYZ)の3列目) 6  3  CD   678    QZ  (←sheet3(シート名:XYZ)の4列目) ・  ・  CD    ・      ・ (←sheet4(シート名:・・・)の・列目) ・  ・  CD    ・      ・ (←sheet10(シート名:・・・)の・列目) ・ ・  CD    ・      ・ (←sheet27(シート名:・・・)の・列目) ・  ・  CD    ・      ・ (←sheet27(シート名:・・・)の・列目) ・ ・  CD    ・      ・ (←sheet30(シート名:・・・)の・列目) 上記の様にすべてのシートから氏名:CDでフィルタリングし集計シートに抽出したい。 よろしくお願いいたします。

  • Sheet1のデータを条件で行ごと抽出するVBA

    ExcelのVBAについて質問です。 Sheet1  | A | B |  C  |  D | E 1| 5/12|青森|出荷済|11個|りんご 2| 5/12|静岡|準備中|10缶|お茶 3| 5/12|愛媛|未出荷|21個|みかん 4| 5/12|新潟|未出荷|99粒|おこめ 5| 5/12|栃木|出荷済|15個|巨峰 こんなシートがあります。 これを、シート状のボタンをクリックしたときに、 「C列が"出荷済"または"準備中"の行だけ抽出して、列を入れ替えながらSheet2に並べる」 というVBAを組みたいです。 ボタンを押した後Sheet2がこんな感じになるようにしたいです。 Sheet2  | A  | B | C |  D | E 1|りんご|11個|5/12|青森|出荷済 2|お茶 |10缶|5/12|静岡|準備中 5|巨峰 |15個|5/12|栃木|出荷済 列の入れ替えはこのような感じです (Sheet1⇒Sheet2) E列⇒A列 D列⇒B列 A列⇒C列 B列⇒D列 C列⇒E列 行はSheer1の順番をSheet2でも抽出されない行を詰める形で維持したいです。 また、ボタンを押されるたびSheet2が全て上書きされる形で構いません。 抽出と入れ替えのヒントだけでもお教え頂ければ自分でやってみたいと思います。 よろしくお願いいたします。

  • エクセルVBAで、検索・抽出の仕方を教えてください

    VBAを殆ど使ったことがないのですが、 仕事でどうしても必要なため、以下のやり方を教えてください。 Aというシートにあるデータを貼り付けた後、 自動的にあるキーワードで検索してヒットした行と、 必要な項目が飛び飛びになっている列(複数)を 抽出してBというシートに貼り付けたいと思っています。 イメージとしては、Aというシートから商品名iで抽出して 商品名   |D(不要な列) |容量|E(不要な列)|製造会社| F(商品名)|D’(不要)  |G |E’(不要) |H   | i(商品名)|D’(不要)  |J |E’(不要) |K   | L(商品名)|D’(不要)  |J |E’(不要) |K   | i(商品名)|D’(不要)  |M |E’(不要) |N   | ________________________________ ↓不要な列を省いた状態にしてBというシートに この様な状態で貼り付けたいと思っています。 商品名   |容量|製造会社| i(商品名)|J |K   | i(商品名)|M |N   |     説明がわかりにくくてすみません。 よろしくお願い致します。

  • VBAのデータ抽出について

     列  A   B   C 行1 番号  色   形  2  1   白   丸  3  2   赤   三角  4  1   赤   丸  5  3   黄   四角 (1)Excel Sheet1にコマンドボタン1があり、それをクリックするとUserForm1が表示されます。 (2)UserForm1には「番号」「色」「形」の各コンボボックス1,2,3が配置されています。 (3)各コンボボックス1,2,3に表示されるのは、Sheet1の各列のデータです。 (4)コンボボックス1,2,3のうち1つ選択→その条件に合うデータを抽出。  コンボボックス1,2,3のうち2つ選択→その2つの条件に合うデータを抽出。  コンボボックス1,2,3のうち3つ選択→その3つの条件にあるデータを抽出。 (5)Sheet1のコマンドボタン2をクリックすると、Sheet1は元のデータ一覧に戻る。 というようなプログラムを組みたいと思っています。 (4)のデータ抽出、(5)の戻し方がよくわかりません。 どなたかご教授下さい。

  • VBA チェックボックスをチェックした項目のみ抽出

    1.シート1のA列にフォームのチェックボックスを配置 2.B列に名前を並べる 3.チェックボックスでクリックし、チェックマークが出る 4.マクロでシート2のA列から抽出された名前を並べる 以上のことをしたいと思い、検索しましたところ、似たようなものが見つかりました。 https://okwave.jp/qa/q5065347.html ただ、このVBAは抽出先がG列です。抽出先はシート2のA列にしたいのです。 .Cells(i, "G").Value = cb.TopLeftCell.Offset(, 1).Value これをどうしたら良いでしょうか? 宜しくお願いします。

  • VBAを使った、Excelでのシート間データ抽出

    はじめまして。みなさまどうか教えてください。 Sheet1にはA列に250行程、コードが存在します。 Sheet2にはA列(コード)からI列まで、そして1000行程データが存在します。 Sheet1にあるコードは重複はなく、Sheet2のコード内に必ず同じコードがあります。 Sheet2にも重複コードはありません。 そこでSheet1のコードを使い、Sheet2を検索し、同一コードのデータ(A列からI列の行すべて)を全て(250件分)、Sheet1のコード記載順(A1、A2、A3・・・・)で、Sheet3に抽出したいのです。 どうか、よろしくお願いします。

  • ユーザーフォームを使用したデータの複数抽出

    B列にFROM、C列にTO、D列に出発、E列に到着のデータが複数行あって、 期間 FROM 2005/04/01 TO 2006/03/31 出発 □東京 □神奈川 □埼玉 □千葉 □群馬     □茨城 □栃木  □山梨 □長野 到着 □大阪 □名古屋 □宮城 □北海道 上のようなユーザーフォーム(期間はテキストボックス、出発・到着はチェックボックス)を作成して、データの抽出をしたいのですが、チェックボックスは複数選択します。 例)FROM以上TO以下で、東京・神奈川・山梨で出発して大阪と名古屋に到着したものを抽出、というような複数のパターンがあるので、マクロで別セルにチェックしたものを抜き出して、フィルタオプションの設定で抽出したのですが、条件が複雑なので、フィルタオプションの設定以外はにできないでしょうか?お願いします。

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。 という質問をさせていただき、mike gさんに下記のような回答をいただきました 1.Sheet1 の例えばセル C1 に式 =RAND() を入力して、此れを右に2列(注1参照)ドラッグ&ペースト 2.範囲 C1:E1 を下方にズズーッと(14行目まで)ドラッグ&ペースト 以下は別シート(Sheet2)における操作です。 3.セル A1 に次式を入力して、此れを右方にズズーッと(セル AA1 まで)ドラッグ&ペースト(注2参照)   =IF(MOD(COLUMN(),2)=1,INDEX(Sheet1!$A$1:$A$14,MATCH(SMALL(OFFSET(Sheet1!$C$1,,ROW()-1,14,),CEILING(COLUMN()/2,1)),OFFSET(Sheet1!$C$1,,ROW()-1,14,),0)),"") 4.1行目全体を下方にズズーッと(3行目まで)ドラッグ&ペースト 注1:「右に2列」は別シートの行数が3行の場合で、4行(5行)の場合は「右に3列(4列)」に読み替える。 注2:式中の 2 は「一列おき」の場合で、二列(三列)おきの場合は 2 を 3(4) に書き替える。 これで完璧に出来たのですが 実際にはSheet2のセルH6から15列おきに抽出したいのです。 15列おきは出来たのですが、セルH6から抽出を始めるにはどの部分を変更すれば良いのでしょうか? どなたか教えて頂ける方がおりましたらよろしくお願いします。

専門家に質問してみよう