• 締切済み

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のコードを使用すれば良いでしょうか。 宜しくお願いします。

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

鈍くさいプログラムです。 変数「p(lace)」に場所を設定し、変数「x」に最初の日付、「y」に最後の日付を設定します。 すると、条件に適合したものを「シート2」に出力します。 ご質問の複数条件での抽出は、この場合 If (z >= x And z <= y) And p = Worksheets(1).Cells(i, 7).Value Then の部分ですが、最初の2つを()でくくることによって、一つのまとまりにしています。 「And」は、もちろん「かつ」ですから、{「z >= かつ z<=y」かつ「p = ~」}です。 最初の「」の部分が1つの条件として認識されています。 今回の場合は、すべて「かつ」ですので、()がなくても、正常に動くかも知れませんが、意味を考えると()をつけるべきでしょう。 これが「z = 1 or z = 9」and「p = 0」のような場合ですと、必ず If (z = 1 Or z = 9) And p = 0 Then というように、前の部分を()でくくっておかなければなりません。 Sub CalDay() Dim c, i, j As Integer Dim p As String Dim x, y, z As Date p = "東京" x = #8/1/2015# y = #8/31/2015# c = 10 For i = 1 To Range("A1").End(xlDown).Row z = Worksheets(1).Cells(i, 8).Value If (z >= x And z <= y) And p = Worksheets(1).Cells(i, 7).Value Then c = c + 1 For j = 1 To 7 Worksheets(2).Cells(c, j).Value = Worksheets(1).Cells(i, j).Value Next j Worksheets(2).Cells(c, 8).Value = Worksheets(1).Cells(i, 8).Value End If Next i End Sub

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

 まず前提条件として、Sheet1において2行目の所に「氏名」や「人数」、「地域」、「日付」等々の各列の項目名が入力されていて、実際のデータは3行目以下に入力されているものとします。(下の添付画像を参照の事)  その場合、下記の様なVBAは如何でしょうか。 Sub QNo9092443_VBA_複数条件でデータを抽出する場合() Const OrigSheetName = "Sheet1" '元データシートのシート名 Const PasteSheetName = "Sheet2" '抽出結果の出力先シートのシート名 Const ItemRow = 2 '元データシートにおいて項目名欄と使用している行 Const FirstColumn = "A" '元データの抽出対象範囲の中で最も左端の列 Const LastColumn = "BS" '元データの抽出対象範囲の中で最も右端の列 Const UnnecessaryColumns = "H:BR" '元データシートの中で抽出しない列 Const SearchColumn1 = "G" '地域(都道府県)が入力されている列 Const SearchColumn2 = "BS" '日付が入力されている列 Const PasteCell = "A2" '抽出結果の出力先シートにおいて表の左上の隅となるセル Dim OrigSheet As Worksheet, PasteSheet As Worksheet, _ LastRow As Long, Region As Variant, Period(1, 1) As Variant, _ temp As Variant, i As Long, c As Range Period(0, 0) = "1905/1/1" Period(1, 0) = "9999/12/31" Period(0, 1) = "以降" Period(1, 1) = "以前" If IsError(Evaluate("ROW('" & OrigSheetName & "'!A1)")) Then MsgBox "元データが入力されているシートとして設定されている" _ & vbCrLf & vbCrLf & OrigSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set OrigSheet = Sheets(OrigSheetName) If IsError(Evaluate("ROW('" & PasteSheetName & "'!A1)")) Then MsgBox "データの転記先のシートとして設定されている" _ & vbCrLf & vbCrLf & PasteSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set PasteSheet = Sheets(PasteSheetName) With OrigSheet LastRow = .Range(LastColumn & Rows.Count).End(xlUp).row With .Range(LastColumn & Rows.Count).End(xlUp) If LastRow > .row Then LastRow = .row End With If LastRow <= ItemRow Then GoTo label9 label1: Region = Application.InputBox("地域指定", SearchColumn2 & _ "列に入力されている地域の中で、抽出条件とする地域を入力して下さい", _ , Type:=6) If Region = vbNullString Or Region = False Then temp = MsgBox("地域が入力されていません。" & vbCrLf _ & "地域の入力をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:地域の入力をやり直します" & vbCrLf _ & "[いいえ]:処理を中止してマクロを終了します", _ vbYesNo + vbExclamation, "地域未入力") If temp = vbNo Then Exit Sub Else GoTo label1 End If End If For i = 0 To 1 label2: Period(i, 0) = Application.InputBox("期間指定" & i + 1, SearchColumn1 & _ "列に入力されている日付が西暦何年何月何日! & Period(i, 1)" _ & "のデーターを抽出すれば良いのかを指定して下さい。", _ Period(i, 0), Type:=2) If Period(i, 0) = vbNullString Or Period(i, 0) = False Then temp = MsgBox("日付が入力されていません。" & vbCrLf _ & "日付の入力をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:日付の入力をやり直します" & vbCrLf _ & "[いいえ]:処理を中止してマクロを終了します", _ vbYesNo + vbExclamation, "日付未入力") If temp = vbNo Then Exit Sub Else GoTo label2 End If End If If IsDate(Period(i, 0)) Then If Format(Period(i, 0), "yyyy/mm/dd") = DateValue(Period(i, 0)) & "" _ Then GoTo label3 End If temp = MsgBox("入力された値は日付として扱う事が出来ません。" _ & vbCrLf & "日付の入力をやり直して下さい。", _ vbOKOnly + vbExclamation, "入力値不適切") GoTo label2 label3: Period(i, 0) = DateValue(Period(i, 0)) Next i End With With Application .ScreenUpdating = False .Calculation = xlManual End With With OrigSheet .Columns(UnnecessaryColumns).Hidden = True With .Range(SearchColumn1 & ItemRow & ":" & SearchColumn2 & LastRow) .AutoFilter Field:=1, Criteria1:=Region .AutoFilter Field:=Columns(SearchColumn1 & ":" & SearchColumn2).Columns.Count, _ Criteria1:=">=" & Period(0, 0), Operator:=xlAnd, Criteria2:="<=" & Period(1, 0) End With Set c = .Range(FirstColumn & ItemRow & ":" & LastColumn & LastRow) i = c.Resize(, 1).SpecialCells(xlCellTypeVisible).Cells.Count End With If i > 1 Then With PasteSheet .Range(PasteCell & ":" & .Cells.SpecialCells(xlCellTypeLastCell).Address).Clear c.SpecialCells(xlCellTypeVisible).Copy With .Range(PasteCell) .PasteSpecial Paste:=xlPasteValuesAndNumberFormats .PasteSpecial Paste:=xlPasteFormats End With End With End If With c.EntireColumn .AutoFilter .Hidden = False End With If i > 1 Then GoTo labelE label9: MsgBox DateCell & "該当するデータが見つかりません。" & vbCrLf _ & "マクロの実行を中止します。", vbExclamation, "データ無し" & vbCrLf & i labelE: With Application .CutCopyMode = False .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.2

> どのようなVBAのコードを使用すれば良いでしょうか。 VBAの知識はあるのでしょうか。どのようなと書いてますが マクロは自分 で作るものです。どっかに用意されている訳じゃありません。知識がない ならマクロは止めておいた方がいいと思います。 フィルタの詳細設定を使えば 条件を指定してデータを抽出することはでき ますから それを記録マクロにすることから始めてみたらどうでしょう。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 1行目に項目行は無いのですか? 項目行が有れば、抽出条件をシート上に設定して、フィルタオプションで抽出 する作業をマクロに記録するだけでコードが出来上がると思います。

関連するQ&A

  • 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のコードを使用すれば良いでしょうか。 宜しくお願いします。

  • 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のコードを使用すれば良いでしょうか。 宜しくお願いします。

  • Excel VBAで教えてください。

    Excel VBAで教えてください。 テキストデータをExcelで読み込んだ後、Sheet1に以下のデータが入っており、 A列 B列   C列 氏名 開始日(yyyy/mm/dd) 終了(yyyy/mm/dd) テキストボックスに開始日(yyyy/mm/dd)、終了日(yyyy/mm/dd)、を入力し、入力した開始日から終了日のデータ検索し、A列からのデータをコピーし、Sheet2に貼り付けしたい。 テキストデータをExcelで読み込むコードはできたのですが、その後の処理ができずに困っています。 ユーザーフォームに入力するコードも教えてください。

  • (VBAにて)日付でデータを抽出するやり方

    一度質問をしたのですが言葉足らずで説明不足でしたので、再質問させて頂きます。 (一度見た方も、もう一度お付き合い願います。) 全くマクロを知らないのですが、上司にマクロ作成を依頼され困っています。(無茶な...。) 下記に内容を記しますので、教えて下さい。 お願いします。 (概要) Excelで「元データシート」にて管理している障害管理表のデータを、 「まくろシート」を作成して「元データシート・D列:発生日時」をキーにして 任意の「開始月:yyyy/mm」と「終了月:yyyy/mm」をそれぞれ指定したセルに入力して、コマンドボタンを押したら、「sheet3」シートにその指定した範囲内のみのデータを表示するようにして欲しい。 ・sheet1について →・「元データ」にシート名を変更しています。  ・「元データ」には障害を管理しているデータが入力されています。    (管理表はこんな感じです)→項目名:3行目・データ:4行目~  ・セルA3~Y3が項目名(セルD3の項目名→発生日時)     ・セルA4~Y303がデータ(セルD4~D303→yyyy/mm/dd hh:mm:ss) ・sheet2について →・「まくろ」にシート名を変更しています。  ・ セルA2(開始月)とセルB2(終了月)に任意の年月(yyyy/mm)を入力してセルA5にある「コマンドボタン」を押す  ・ キーは「元データシート・D列:発生日時」のデータ部分です。      ・sheet3について →・コマンドボタンを押した結果、「sheet3」にマクロの実行結果を反映する。 (A1~Y1行目に項目名が・A2行目~Y(X)行目にデータが表示される) ・A4で印刷するのでA4用紙のサイズに設定する。 以上です。 宜しくお願いします。

  • 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でフィルタリングし集計シートに抽出したい。 よろしくお願いいたします。

  • 複数条件抽出をVBAで

    excelの複数条件抽出をVBAでやりたいので教えてください。 エクセル2003で複数条件抽出をしたいと思っています。 dateのシートに、A列:日付、B列:名前、C列:金額があります。 それを1というシートに、日付と名前の2つの条件が合致している金額を抜き出したいと思っています。 抜き出すのは0601&AさんをA5セル~A20       0601&BさんのはB5~B20へ ということは可能でしょうか? もしよろしければ教えていただければ助かります。 'date'シート 日付   名前  金額 0601 Aさん  100円 0601  Aさん  120円 0601  Bさん  150円 シート'1' 0601&Aさん   0601&Bさん 100円           150円 120円 どの人がやってもボタン1つで実行できるようにしたいために、 VBA出できればと思っております。

  • 期間指定での日付の抽出

    Excel2013です。 【Sheet1】 ID|名前|誕生日| D | E | F | G | H | I | J |・・・・ 01|田中|yyyy/mm/dd|2004/10/15|2005/10/12|2006/10/17|2007/10/13|2008/10/15|2009/10/110|2010/10/15|・・・・ 02|佐藤|yyyy/mm/dd|2008/10/15|2009/10/14|2010/08/17|2011/09/13| | | |・・・・ 03|鈴木|yyyy/mm/dd|2010/10/15|2011/10/12|2012/10/17| | | | |・・・・ 【Sheet2】 ID|名前|2004|2005|2006|2007|2008|2009|2010|2011|・・・・ 01|田中|数式A|数式B|数式|数式|数式|数式|数式|数式|・・・・ 数式AのところでSheet1にある同じIDの人の2004年の日付、 数式BのところでSheet1にある同じIDの人の2005年の日付を抽出できるようにしたいです。 同じIDの行内で同じ年が重複することはありません。 該当がない場合はIFERRORで空欄にしようと思っています。 お力添えをお願いいたします。

  • (VBAにて)日付でデータを抽出するやり方

    ド素人なのですが、上司にマクロ作成を依頼され困っています。 下記に内容を記しますので、教えて下さい。 お願いします。 ・VBAを使ってExcelで管理してある管理表(下記参照)を 「発生年月日」をキーにして 「開始月:yyyy/mm」と 「終了月:yyyy/mm」をそれぞれ入力して、コマンドボタンを押したら  その指定した範囲内のみのデータを別シートに表示するように  して欲しい。 (例) 開始月:2007/8 終了月:2007/11 →2007年8月~2007/11月分の全データが別シートに表示される) ・管理表はこんな感じです。(大体、月に4件ぐらいあります)   発生年月日      件名    内容      完了日   (yyyy/mm/dd) (障害件名)  (障害内容)  (yyyy/mm/dd) よろしくお願いします。

  • ACCESS2000でクエリを抽出条件で抽出

    VBA上でクエリの抽出データを取得してファイルに書き込むというプログラムを書いております。 抽出条件として、今日の日付のレコードを取得したいのですが型が一致しませんとエラーになります。 strSQL = "SELECT * FROM " & (クエリー名)& " where (クエリー.カラム名)='" & Format(Date, "yyyy/mm/dd") & "'" クエリーのカラム名は全角漢字です。 どこがおかしいのでしょうか? よろしくお願いいたします。

  • エクセル 年月日を入力している列から指定月を抽出

    以下のように、月日をyyyy/mm/ddで入力している列から、1月のもの、2月のものと、指定した月のものだけを抽出したいです。 オートフィルタのオプションで、どのように指定すれば抽出できるのでしょうか。 よろしくお願いします。 ---------- A ---------- 1967/10/07 1963/02/23 1978/11/22    ←これらから1月のものだけ抽出 1951/01/24 1973/06/18 1974/01/08 ----------

専門家に質問してみよう