Excel2007 複数条件での検索

このQ&Aのポイント
  • Excel2007で複数条件のデータの抽出について教えて下さい。
  • シートAにデータが入力され、シートBにデータの抽出を行いたいと思います。
  • シートBのB2にシートAから「木村の12/01の出社状況」に値するデータを自動的に抽出するような関数を入力したいのですが、どのようにすればよいのでしょうか?
回答を見る
  • ベストアンサー

Excel2007 複数条件での検索

Excel2007で複数条件のデータの抽出について教えて下さい。 現在、シートAにデータが入力され、シートBにデータの抽出を行いたいと思います。 シートAの内容は以下の通りです(アルファベットと数字はセルの場所です): 1行目: 項目欄 2行目以下: データ詳細 1行目 A1 「日付」 B1「名前」 C1「出社状況」 2行目以下 A2 12/01  B2 山田  C2 出社 A3 12/01  B3 佐藤  C3 早退 A4 12/01  B4 木村  C4 出社 A5 12/02  B5 木村  C5 早退 A6 12/02  B6 山田  C6 遅刻 A7 12/02  B7 佐藤  C7 遅刻 ・・・・・ A列の日付は昇順ですが、B列の人名はランダムに入力されています。 また、日付によっては途中入退社する人もいるので、12/01に名前がなくても、 12/10から名前が入力されている場合(あるいはその逆)もありえます。 シートBは以下の通りです: 1行目 名前 A列:日付 B1 木村 C1 山田 D1 佐藤 ・・・ A2 12/01 A3 12/02 このシートBの B2に シートAから 「木村の12/01の出社状況」(つまりC4)に値するデータを 自動的に抽出するような関数を入力したいのですが、どのようにすればよいのでしょうか? (このB2セルの式をB2:D3に入力していきたいので、絶対値を指定することになると思いますが・・・) IndexやらMatchやらLookupやらを色々試してみたのですが、どうも上手くいきません。 どなたかアドバイスをお願いいたします。

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

  • ベストアンサー
  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.2

一例を。 シートAの名前列と出社状況列の間に作業列を設ける方法です。 作業列には、 セルC2:「=A2&B2」 という式を入力し、下のセルにコピーします。 データが数行あると、その下の行のA列とB列に何かを入力した時点で、C列に自動で計算式が入力されます。 作業列が邪魔なら、非表示にしても大丈夫です。 その場合は、必ず空行が無いように入力する必要がありますが。 シートBには、 セルB2:「=VLOOKUP($A2&B$1,'シートA'!$C:$D,2,FALSE)」 と入力し、他のセルにコピーします。

karlthecat
質問者

お礼

nattocurryさん、回答ありがとうございます。 非常にシンプルな式で助かります。 作業列を使用する、というのは目から鱗です。また検査値に&条件を付けることもできるのですね。まだまだ自分の知識は浅いなぁ、と思いました。 幅広く応用できそうな式をご教授下さりありがとうございます。

その他の回答 (5)

回答No.6

#4です >最後のfalseの前の「2」はどの列番号に値するのでしょうか?(B列になりますか?) >>F2セル =IF($E2="","",VLOOKUP(F$1, INDEX($B:$B,MATCH($E2,$A:$A,0)):INDEX($C:$C,MATCH($E2,$A:$A)) ,2,FALSE)) =vlookup(A1,範囲,列番号,検索の型) VLOOKUP関数の「範囲」の部分を見ると INDEX($B:$B,MATCH($E2,$A:$A,0)) でB列のセル参照を返します。 次の INDEX($C:$C,MATCH($E2,$A:$A)) ではC列のセル参照を返しています それを「:」でつなげていますので 結果的にセル範囲、B○○:C○○となります。 だから、 >B列になりますか? は、セル範囲内で2列目なのでC列になります。 結果を見れば一目瞭然ですね。 名前の数が多いと、無駄な計算が多くなるので作業列(MATCH関数を使った2列)を 作ったほうが良いですね >抽出結果が「出社」の場合は空欄、「遅刻」の場合は別数値を入力・・・という様に) これも作業列というか作業表(中継)にすれば、INDEX,MATCH またはVLOOKUP系の関数で 作成できるかと思います。 =INDEX({"",1,2},MATCH(A1,{"出社","遅刻","早退"},0))

karlthecat
質問者

お礼

CoalTarさん、再びレスありがとうございます。 また、詳しく解説して下さり、大変参考になりました。 CoalTarさんのおっしゃる通り、作業列を使用する方が負担が少なそうです。実際に運用する表は、参照データが入力されているシート名だけでも長いので、式を一つで済ませようとすると、式の記述が数式バーからはみ出てしまう程なのです・・・。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.5

>実際の表はかなり複雑でして、実はこの条件にさらにIf関数を加えた物を使用したいので(抽出結果が「出社」の場合は空欄、「遅刻」の場合は別数値を入力・・・という様に)、そうとう長い式になり、 複雑な条件を返したい場合は、IF関数ではなく配列定数を引数とするVLOOKUP関数を使用した以下のような数式にします。 例えば出社なら空白、遅刻なら1、早退なら2を返すなら以下の式になります。 =VLOOKUP(検索値,{"出社","";"遅刻",1;"早退",2},2,0) 検索値の部分に前回回答した数式を当てはめると以下の式になります。 =IF(SUMPRODUCT((Sheet1!$A$2:$A$100=$A2)*(Sheet1!$B$2:$B$100=B$1)),VLOOKUP(INDEX(Sheet1!$C:$C,MAX(INDEX((Sheet1!$A$2:$A$100=$A2)*(Sheet1!$B$2:$B$100=B$1)*ROW($A$2:$A$100),))),{"出社","";"遅刻",1;"早退",2},2,0),"") ちなみにSUMPRODUCT関数でデータの有無を判定している部分は、Excel2007以降のバージョンのみ使用するのであれば、以下のようなCOUNTIF関数を使用するほうが計算負荷が少なくなります。 COUNTIFS(Sheet1!$A$2:$A$100,$A2,Sheet1!$B$2:$B$100,B$1)

karlthecat
質問者

お礼

MackyNo1さん、再びレスありがとうございます。 またCOUNTIFS関数の記述までして下さり、感謝です。 さて、実際に運用している表にこの式を参照して入力してみたのですが、なぜかVLOOKUP以下でエラー表示になってしまいます。今回サンプルで出した表の場合は、MackyNo1さんに教えて頂いた式で問題なく解決出来たので、当方に問題があるのは明白です。何度もトライしてみたのですがどうも上手くいかず・・・。結果をお伝えしたかったのですが申し訳ありません。 しかし式の記述方法は非常に勉強になりました。ありがとうございます。

回答No.4

日付が昇順、同じ日に名前が重複する場合は、上の行の出社状況。 F2セル =IF($E2="","",VLOOKUP(F$1, INDEX($B:$B,MATCH($E2,$A:$A,0)):INDEX($C:$C,MATCH($E2,$A:$A)) ,2,FALSE)) 右へ下へオートフィル

karlthecat
質問者

お礼

CoalTarさん、回答ありがとうございます。 画像まで添付して下さり、大変見やすいです。 初歩的な質問で大変恐縮なのですが、最後のfalseの前の「2」はどの列番号に値するのでしょうか?(B列になりますか?)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

VBAでもよければサンプルです。 シート2の B1に"12/01"、C1に"山田"と入れた場合、 シート1から該当行を見つけ出し、 シート2の A2に"12/01"、B2に"山田"、C2に"出社"、とシート1の内容を表示します。 1行目:"検索条件","12/01","山田" 2行目:"12/01","山田","出社" セル位置、範囲行、判定文を考慮すれば対応できますから、 悩むところは少なく、長い文の関数よりは保守できると思います。 必要に応じて手直ししてください。 文の「’」値の右側はコメントになります。 Sub Macro1() Dim WKGYO As Long Dim WKOUTGYO As Long Dim WKRETUA As String Dim WKRETUB As String Dim WKRETUC As String Dim WKJYOKENDATE As String Dim WKJYOKENNAME As String Sheets(2).Select WKJYOKENDATE = Cells(1, 2) 'SHEET2!B1 WKJYOKENNAME = Cells(1, 3) 'SHEET2!B2 WKOUTGYO = 2 Sheets(1).Select Range("A2").Select For WKGYO = 2 To 500 ' 2行目から順次下500行まで Cells(WKGYO, 1).Select If Len(Cells(WKGYO, 1)) = 0 Then Exit For 'A列何もないとき終わり WKRETUA = Cells(WKGYO, 1) 'SHEET1!A列 WKRETUB = Cells(WKGYO, 2) 'SHEET1!B列 WKRETUC = Cells(WKGYO, 3) 'SHEET1!C列 '判定 If WKJYOKENDATE = WKRETUA Then 'SHEET2!B1 = SHEET1!A列 判定??? If WKJYOKENNAME = WKRETUB Then 'SHEET2!C1 = SHEET1!B列 判定??? '条件にあうものを表示 Sheets(2).Select Cells(WKOUTGYO, 1) = WKRETUA 'SHEET1!A列 -> SHEET2!A列 Cells(WKOUTGYO, 2) = WKRETUB 'SHEET1!B列 -> SHEET2!B列 Cells(WKOUTGYO, 3) = WKRETUC 'SHEET1!C列 -> SHEET2!C列 WKOUTGYO = WKOUTGYO + 1 'SHEET2 表示行 Sheets(1).Select 'SHEET1 判定行へ制御戻す Else End If Else End If Next WKGYO Owari: Sheets(2).Select Range("A1").Select MsgBox ("終了") End Sub

karlthecat
質問者

お礼

layyさん、回答ありがとうございます。 今回作成しようとしている表を運用する人は私以外にも複数いるので、VBAですと使用者が誤ってセルの式を消してしまう心配が少なくて助かります。 実際に運用する表はサンプルで提示しました表よりも複雑なせいなのか、正直まだ求める値が上手く表示されていないのですが、今一度記述を見直してみます。 長い式の記述なのに工夫して下さりありがとうございました。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

元データがSheet1にあるなら、以下の式をB2セルに入力して右方向および下方向にオートフィルすれば該当データを表示できます。 =IF(SUMPRODUCT((Sheet1!$A$2:$A$100=$A2)*(Sheet1!$B$2:$B$100=B$1)),INDEX(Sheet1!$C:$C,MAX(INDEX((Sheet1!$A$2:$A$100=$A2)*(Sheet1!$B$2:$B$100=B$1)*ROW($A$2:$A$100),))),"") ただし、多数のセルに上記の数式を入力すると、再計算に時間がかかるのでシートの動きが重くなる可能性がありますので、運用上は再計算を自動にするなどの処理が必要かもしれません。

karlthecat
質問者

お礼

MackyNo1さん、回答ありがとうございます。 恥ずかしながら、Sumproductという関数は初めて知りました。こんなに便利な関数があるんですね。 教えて頂いた関数ですが、確かに入力するとかなり長い関数になってしまいました。今回サンプルで載せている例はかなりシンプルなのですが、実際の表はかなり複雑でして、実はこの条件にさらにIf関数を加えた物を使用したいので(抽出結果が「出社」の場合は空欄、「遅刻」の場合は別数値を入力・・・という様に)、そうとう長い式になり、なお且つこの式を実際に運用するのが私以外にもいるので、あまり長くなりすぎるとエラーがあった場合、修正するのが大変になってしまうかも知れないので、関数を別の場所から読み込めるような工夫をしてみます。 しかし非常に勉強になりました。ありがとうございます。

関連するQ&A

  • excelオートフィルタの検索条件をセルに入力したい

    以下のようなexcelのリストがあるとします。     A       B    C~ 1 佐藤・鈴木  Aタイプ 2 田中・山田  Bタイプ 3  佐藤     Aタイプ 4  田中     Cタイプ 5 山田・鈴木  Cタイプ A列の"田"が含まれる行を抽出したい場合 オートフィルタをかけ、オプションの抽出条件の指定で "田"を含む、で検索すれば良い、というのはわかります。 ですが、この動作をもうちょっと簡単にできないかと思っています。 具体的には、以下のようにセルに入力して検索・抽出するとはできないでしょうか。     A       B    C~ 1   田 2 3 4   A       B    C~ 6 田中・山田  Bタイプ 8  田中     Cタイプ 9 山田・鈴木  Cタイプ (1、2行目=検索用 3行目=空き 4行目以降=リスト) 過去の質問で、同じようにセルに入力して抽出する方法を 聞いていた方がいらっしゃったので参考にしようと思ったのですが 方法がVBAを使ったもので、VBAの知識がまったく無いために さっぱり理解することができませんでした。 何か良い方法がありましたら教えていただけないでしょうか。

  • シートの合計

    よろしくお願いします。 エクセルでシート1~3迄あります。各シ-トのA列は名前、B列に数字が入っています。名前はA列のどの行にあるかわかりません。 同じ名前をシート4のA1に入力したらその名前の合計を出したい。  シート1    シート2   シート3       シート4   A   B    A   B   A    B     A    B 山田 10   木村  5  佐々木 18   木村  55  鈴木 20   田中 21  伊藤  33    ↑ 木村 50   山下 70  加藤  57  (入力する) 田中 15   高橋 90  佐藤  61 高橋 60   山田 10  鈴木  12             ・   ・   ・          

  • エクセルで2つの条件を元に

    エクセル2007で名簿を作っています。 1ヶ月ごとにメンバーの順が変わります。 シート1(番号順に名簿を作りました)   A  B   C  1 1     山田 2 2     木村 3 3 副長 佐藤 4 4     鈴木 5 5 班長 田中 6 6     長田  シート2(こちらがメンバーに配る名簿です)   A   B  C   D 1 班長    1    3 2 田中    山田  鈴木 3 4 副長    2    4 5 佐藤    木村  長田 A2に田中,A5に佐藤を選んでくるのはvlookupで成功しました。 質問したいのは C列D列に上記の番号のようにシート1の名前を入れていきたいのですが,田中,佐藤の分を抜いた上で番号の若い順に選んできたいのです。 どのような関数をどのように使えば成功するでしょうか。  

  • 関数で2つの条件から抽出する表を作りたい。

    A1は手入力D4手入力、H2は=D2&C2 担当者と週で検索して抽出する式を教えて下さい。 上手く出来なくて1行しか抽出しないんです。  A   B  C      D   E   F  G   H 1担当者 沼田 週    1 2 番号 日付 週 担当 企業 名前 住所 検索用 3 1 7月1日 1 沼田 a 高橋 土浦 沼田1 4 2 7月2日 1 佐藤 a 山田 阿見 佐藤1 5 3 7月2日 1 沼田 r 沖田 水戸 沼田1 6 4 7月7日  1 沼田 c 斎藤 土浦 沼田1 7 5  7月9日 2 佐藤 h 鈴木 牛久 佐藤2 8 6 7月14日 3 佐藤 d 河合 土浦 佐藤3 9 7 7月15日 3 高橋 e 吉田 阿見 高橋3 10 8 7月20日 4 高橋 e 木田 水戸 高橋4 11 9 7月4日 1 沼田 g 飯田 牛久 沼田1 上記の表から1週目だったら、1週目の担当者のデータをシート2の表に抽出 週2だったら2週目の担当者データを抽出 A1・D1は手入力 A3は=IF(COUNTIF(Sheet1!D$2:D$1000,B$1)=0,"",MATCH($B$1&$D$1,Sheet1!$H$2:$H$1000,0)) シート2     A   B   C  D  E  F  G 1  担当 沼田 週 1 2  番号 日付  週  担当  企業  名前   住所 3  1  7月1日  1  沼田   a    会田   牛久 4  4  7月2日  1  沼田   r   沖田   水戸 5  6  7月7日  1  沼田   c   斎藤  土浦  6  9  7月4日  1  沼田   g   飯田  牛久 上記の様にシート2に表示したいんです。 細かく教えて下さい。何度やっても1行目のデータしか抽出しないんです。 A3=IF(COUNTIF(Sheet1!D$2:D$1000,B$1)=0,"",MATCH($B$1&$D$1,Sheet1!$H$2:$H$1000,0)) B3=IF($A3="","",IF(VLOOKUP($A3,Sheet1!$A$2:$H$1000,COLUMN(B1),0)="","",VLOOKUP($A3,Sheet1!$A$2:$H$1000,COLUMN(B1),0))) A4の2行目以降1になってしまって同じ物しか出ないんです。 Aの番号の抽出方法の式を教えて下さい。

  • 【Excel】同じ行で2つの各値が一致する行の参照

    エクセルで【Sheet1】のデータから 【Sheet2】【Sheet3】の表を作成したいのですが、 いろいろ試してもわかりません。 どうか教えてください。 【Sheet1】 A B C   D E 1 2001 佐賀県 1 山田 090-000-0000 2 2001 愛媛県 2 佐藤 090-111-1111 3 2001 静岡県 4 伊藤 090-222-2222 4 2001 岡山県 5 中野 090-333-3333 5 2002 三重県 1 近藤 090-444-4444 6 2002 福島県 2 田中 090-555-5555 7 2002 岐阜県 3 吉田 090-666-6666 以下600行ほど続きます。 【Sheet2】 A B C 1 2001←入力します 2 1 山田 090-000-0000 3 2 佐藤 090-111-1111 4 4 伊藤 090-222-2222 5 5 中野 090-333-3333 【Sheet3】 A B C 1 2002←入力します 2 1 近藤 090-444-4444 3 2 田中 090-555-5555 4 3 吉田 090-666-6666 【Sheet2】【Sheet3】のA1には、 【Sheet1】のA1の値を入力します。 A2,B2,C2 A3,B3,C3 ... それぞれのセルにどんな数式を入れたら 表ができあがりますででしょうか? 【Sheet2】【Sheet3】共に、VLOOKUPで =VLOOKUP(A1,Sheet1!A1:D7,3,) =VLOOKUP(A1,Sheet1!A1:D7,4,)を使うと、 2行目はうまくいきますが、 3行目から狂ってきます。 頭が沸騰してきました! わかる方に教えていただいたほうが早いですネ、 どうぞご享受よろしくお願いいたします。

  • 【EXCEL】検索機能を追加したい

    EXCELの顧客管理表に検索機能を追加したいと思っています。 概要は以下の通りです。 ・Sheet1を顧客データ一覧、Sheet2を検索用シートとし、Sheet2の上段に検索したい 単語又は日付を入れ検索ボタンを押すと、Sheet1のリストからデータを抽出しSheet2中段以降に 表示、が理想です。 ・Sheet1の顧客データは、毎日数行ずつ追加します。 項目は「日付」「顧客名」などB1~M1まで入っています。 似た質問を調べ、↓の状態までは設定できました。 ・Sheet2のB1~M1にSheet1同様の項目を作っておき、抽出したい項目の2行目に 検索対象文字を入れる。 (例 B1の項目が日付の場合、B2に”2007/01/16”) Sheet2に作った「検索ボタン」を押すと、Sheet2の4行目 以降に検索対象文字を含むデータが抽出される。 (4行目にもSheet1同様の項目を入れています。) ちなみに、検索ボタンのマクロの内容は以下の通りです。 Private Sub 検索_Click() Worksheets("顧客入力").Range("顧客データ").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("B4:M5"), CopyToRange:=Range("B8:M1063"), Unique:=False End Sub ※顧客データ・・・Sheet1の顧客リストに定義している名前 ※顧客入力・・・Sheet1の名前 これで基本的な検索はできるようになったのですが、日付指定に関して足りない部分があります。 特定の日付指定は可能なのですが、2007/01/01~2007/01/31のような範囲の指定ができません。 また、文字列の検索で「~から始まる」検索は出来るのですが「~を含む」検索が出来ません。 マクロ初心者なのでどこをどう変えればいいのかが分からず困っています。ご教授いただければ助かります。

  • エクセルのマクロで全シ-ト複数条件検索

    エクセルで全シートから複数項目で検索をかけ、条件に合う項目の行ごと 新しいシートに抽出結果として表示することは可能なのでしょうか。 初心者なりに考え、無様なコードではありますが、 検索条件が1つであれば、条件にあう行をすべて抽出することはできました。 ですが複数、または列ごと条件として指定することができず、難儀しております。 たとえば Sheet1    A    B    C    D 1      田中太郎   男   穏やか  2      鈴木次郎   女   うっかり 3      山田三郎   女   怒りっぽい 4      佐藤四郎   男   せっかち Sheet2    A    B    C    D 1      伊藤五郎   女   用心深い 2      加藤六郎   男   ずぼら 3      斎藤七郎   女   臆病 4      後藤八郎   男   陽気 Sheet3    A    B    C    D 1      【条件】 2      加藤六郎 3      鈴木次郎 4      山田三郎 5      後藤八郎 マクロ実行後↓ 新しいシート    A    B    C    D 1      加藤六郎   男   ずぼら 2      鈴木次郎   女   うっかり 3      山田三郎   女   怒りっぽい 4      後藤八郎   男   陽気 といった具合にしたいと考えております。 この場合ですと、B列全体を条件としたり、 Sheet3の条件が入力されているセルすべてを検索条件として 渡すことはできるのでしょうか。 実際のシートでは、条件が10個~100個ほどあり、 シートごとに数はばらばらになっております。 どうかわかる方、お力をお貸しください。

  • excelでシートから別シートに抽出する方法

    データシートに A   B    C 佐藤 りんご  25個 木村 オレンジ 3個 伊藤 メロン  12個 伊藤 スイカ  2個 佐藤 イチゴ  40個 佐藤 マンゴー 8個 というデータがあったとします。 それを別のシートに A   B    C 佐藤 りんご  25個    イチゴ  40個    マンゴー 8個 また別のシートに A   B    C 伊藤 メロン  12個    スイカ  2個 といったようにAに佐藤とか伊藤とか入力するだけでB、Cが自動で抽出できるようにできますか? 出来れば関数の入力でやりたいのですがわかる人がいましたらご教授ください。

  • 複数一致からの検索

    シート1のような様な表があります。シート2に日付、部屋番を入力するとシート1の日付、部屋番の一致から※C1に名前が表示されるようにしたいです。 シート2のC1にどのような関数を入力したらよろしいでしょうか? よろしくお願い致します。 シート1   A   B   C   日付  部屋  名前 1  1/1  101  太郎 2  1/1  102  花子 3  1/1  201  次郎 4  1/2  101  花子 5  1/2  102  太郎 シート2    A B C   日付  部屋  名前 1  1/1  102  ※花子

  • Excel複数シートにあるデータを1枚にまとめる

    Excelブックにある50枚ほどのシートのデータを一枚のシートにまとめたいです。 現在シート1には機材Aを使用している人の名前、シート2には機材Bを使用している人の名前、シート3には機材Cを・・・ というような感じで50枚ほどあります。 これを一枚にまとめます。 列Aに名前、列Bからを機材名としたいんです。 たとえば山田さんが機材Aと機材Cを使用していたとしたら、「山田 ○  ○」という感じで、機材A、Cの列に○が付くようにしたいです。 各シートに記載されている名前は、重複しています。(佐藤さんはシート1にも2にも40にも名前があるというようなかんじです) 列の中に何回も同じ名前が出ることを避けたいです。 出来る限り短時間で終わらせたいのですが、なんせExcelの知識が乏しく困っています。 なるべく早くするよう言われていますので、初心者でも出来るような方法をご存じでしたら教えてください。 ちなみにしようするのはExcel2010です。 大雑把な質問で申し訳ございません、よろしくお願いいたします。

専門家に質問してみよう