• 締切済み

excelで複数条件での検索方法

列1  列2  列3  列4  列5  列6  列7  列8   列9   列10  列11   列12 1    0    1    0    1   1   1  名前   住所   電話  名前2  名前3 1    1    0    1    1   0   1  名前   住所   電話  名前2  名前3 1    1    1    1    0   1   0  名前   住所   電話  名前2  名前3 のような表があります。(名前2、名前3は全てに入っているわけではありません) 列1が”1”で、列2が”1”で列3が”0”の条件の時、別のシートに、 1行目の名前、住所、電話 1行目の名前2、住所、電話 1行目の名前3、住所、電話というように表示したいのです。(名前2、名前3が無い時は次の条件にあったデータを表示したい。 1行目の名前、住所、電話 1行目の名前2、住所、電話 2行目の名前、住所、電話 3行目の名前、住所、電話 3行目の名前2、住所、電話といった感じです。 マクロのCASE文で振り分けて、・・・・といろいろ試しましたがうまくいきません。 よろしくご教授願います。

みんなの回答

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

淡々と必要なモノを転記していくだけです。 手順: シート1からシート2に転記する sub macro1()  dim i, j  dim a  a = array(8, 11, 12) ’対象にする名前列  worksheets("Sheet2").cells.clearcontents  worksheets("Sheet2").range("A1:C1") = array("名前","住所","電話")  worksheets("Sheet1").select  for i = 2 to range("A65536").end(xlup).row  ’縦ループ,条件合致調査   if cells(i, 1) = 1 and cells(i, 2) = 1 and cells(i, 3) = 0 then   for j = 0 to 2  ’横ループ,名前があれば転記    if cells(i, a(j)) <> "" then    with worksheets("Sheet2").range("A65536").end(xlup).offset(1)     .value = cells(i, a(j))     .offset(0, 1).resize(1, 2).value = cells(i, 9).resize(1, 2).value    end with    end if   next j   end if  next i end sub

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

添付の図の様に、1行目に項目名が入っているとします。 Sheet2のA1:C1は、Sheet1のA:C1と同じ項目名を入れてください。 Sheet2のA2:C2は検索条件の入力欄です。 Sheet2のE2セルに↓を入れてG2までコピー =IF(ISERR(DGET(Sheet1!$A$1:$L$4,Sheet1!H1,$A$1:$C$2)),"",DGET(Sheet1!$A$1:$L$4,Sheet1!H1,$A$1:$C$2)) Sheet2のE3セルに↓ =IF(ISERR(DGET(Sheet1!$A$1:$L$4,Sheet1!K1,$A$1:$C$2)),"",DGET(Sheet1!$A$1:$L$4,Sheet1!K1,$A$1:$C$2)) Sheet2のE4セルに↓ =IF(ISERR(DGET(Sheet1!$A$1:$L$4,Sheet1!L1,$A$1:$C$2)),"",DGET(Sheet1!$A$1:$L$4,Sheet1!L1,$A$1:$C$2)) Sheet2のF3セルに↓を入れてF3:G4にコピー =IF(E3<>"",F2,"") Sheet2のA2:C2の検索条件を変えれば、それに合致した情報を表示します。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一例です。 >(名前2、名前3が無い時は次の条件にあったデータ表示  ⇒この条件が不明なので後でカスタマイズして下さい。 該当シートタブ上で右クリック→コードの表示→サンプルコード貼り付け→ショート上でAlt+F8キー押下→sample実行(因みにSheet2に抽出します) Sub sample() Dim i As Long, j As Long, cnt As Long For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(i, "A") = 1 And Cells(i, "B") = 1 And Cells(i, "C") = 0 Then With Sheets("sheet2") cnt = cnt + 1 .Cells(cnt, "A").Resize(, 3).Value = Cells(i, "H").Resize(, 3).Value For j = 11 To Cells(i, Columns.Count).End(xlToLeft).Column cnt = cnt + 1 .Cells(cnt, "A").Resize(, 3).Value = Cells(i, "H").Resize(, 3).Value .Cells(cnt, "A") = Cells(i, j) Next End With End If Next End Sub

syougai_bengaku
質問者

補足

分かりにくい説明で申し訳ありません。 1行目は条件に合わないため読み飛ばします。 2行目は条件にあっているために出力します。名前2、名前3は、家族名が入っている場合には入力されていますが、何も入っていないこともあります。その場合、名前2、名前3は出力しないようにしたいのです。(名前2だけのときもありますが、名前2がなく、名前3が入っていることはありません。 表を1行目から順に読み込み、条件に合った行を別シートに出力する。 その場合、名前2があった場合は、2行出力することになります。名前3があった場合は、3行出力することになるということです。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

補足願います。 列1,2,3の値が1,1,0に合致するのは2行目だと思いますが、合致した行の1つ上の行の値を表示するのですか?その場合、一番上の行が合致した場合、どうします? また、名前2,3が無い時の条件も良く判りません。 もう少し、具体的な例を挙げてください。

関連するQ&A

  • エクセルVBAで複数の条件を満たす検索方法

    エクセルのVBAを使ってデータ検索を行うプログラムを作っています "Sheet2"は下記のように、A列に生年月日、B列に住所、C列に電話番号、D列にメールアドレスが入力されています        【Sheet2】   生年月日  住所    電話番号  メールアドレス     A      B       C        D 1 1999/9/10 東京都○○ 11-111-1111 aa@goo.co.jp 2 2003/2/26 大阪府○○ 22-222-2222 bb@goo.co.jp 3 1985/6/22 福岡県○○ 33-333-3333 cc@goo.co.jp 4 1995/4/11 愛知県○○ 44-444-4444 dd@goo.co.jp "Sheet1"のA1に生年月日、A2に住所、A3に電話番号を入力し、"Sheet2"のデータと照合して、3つの値が合致した行のD列のメールアドレスを"Sheet1"のB1に返したいと思います 上記の表だと、"Sheet1"のA1に1985/6/22、A2に福岡県○○、A3に33-333-3333と入力されている場合、B1にcc@goo.co.jpの値を返すようにしたいのです。 findを使って生年月日、住所、電話番号を検索し、行番号を取得して、3つの行番号が同じならその行番号のD列の値を返すというような方法で考えていたのですが、エラーが回避できずに困っています。 生年月日が同じ人がいたり、夫婦や親子などは住所と電話番号が同じといった場合があり、上手く検索できません。  エラー回避の方法、もしくは他のやり方でも構いませんので どなたかご教授願えないでしょうか? よろしくお願いします。

  • EXCELでの検索マクロを作りたいのですが

    マクロの初心者です。氏名の検索マクロを作成したいのですが分かりません。 A列:名前 B列:郵便番号 C列:住所 と 名前等のデータを(ランダムに)入力したシート1を作成し、 シート2にシート1の「A列:名前」から性(たとえば青木)で検索して検索ボタン(マクロボタン)を押して該当データを表示させるようにしたいのですが。

  • エクセル:マクロの起動条件

    お世話になります。 以下の条件でのマクロを起動する方法、及びそのマクロを教えてください。 《条件》 ブックを開いた時、あるシートのC列でデータが入っている最下行の行番号とA列のデータが入って最下行の行番号の差が100以下だった場合、マクロを実行する。 (なおC列の行番号の方が必ず大きいです) ちなみに実行したいマクロは1~6の手順です。 1.ブックを開いたとき 2.「入力用」という名前のシートのC列でデータが入っている最下行の行番号とA列のデータが入っている最下行の行番号の差が100以下だった場合 3.「入力用」というシートにかかっているシートの保護をはずし 4.データが入っているC列の最下行のA~Z列を選択して、50行分 下にコピーする。  (例えば、C列の最下行が350行の場合、A350~Z350まで を選択したあと400行まで下にコピーする。) 5.再度シートの保護をかけ 6.A列でデータが入っている最下行の1つ下のセルを選択する ちなみに、2の条件に当てはまらないときはマクロを実行しません。 またC列の最下行よりA列の最下行が大きい数字になることはないはずですが、もし同じかA列の方が大きい場合、「エラー:C列よりA列が大きくなっています」と画面に表示させたい。 なお、行番号の差:100、選択するA~Z行、50行分下にコピー は変わる可能性があるので、修正する場合どの部分を修正すればよいかも教えてください。 よろしくお願いします。

  • EXCEL で検索、更新したい

    EXCEL でわからない箇所があり質問します。 前提条件 Sheet1 A列:名前 B列:年月 C列:値 データは、名前と年月で一意になるデータシートがあり マスターデータとして全データが登録されている Sheet2 A列:名前 B列:年月 C列:値 ある条件でとあるデータベースから抽出した名前と年月の一覧がある この段階で値のセルには何も入っていない やりたい事 (1)この状態でマクロを実行し、A列、B列を条件に該当する行から    C列を抽出しSheet2 にセット (2)Sheet2のC列の値を変更後、マクロの実行で    A列、B列の条件を元該当する行から、Sheet1の C列に値を更新 (3)もし、Sheet2のA列、B列の条件に該当しない行がある場合、    Sheet1に行追加しC列を格納 という事をしたいと考えています。 Sheet1 の全ての行をマクロでループさせて A列、B列をif分で比較し行を取得し、Sheet2 に張る場合、 遅くなるのであまりやりたくないと思っています Find 関数も考えたのですが、ヘルプを見る限り、条件が1つしか指定でき ないように思えるのですが、複数列の条件を指定できる Find 関数 あるいは、類似の関数とあかがあるのなら教えてください 最悪は、EXCEL ADO で、自分自身をSQLで抽出、Update、Insert を行う 事も考えていますが、 EXCELのセル内の式で、INDEX関数やDGET関数で簡単に抽出できるのに (ただ、値を変更するので式はかけないけど・・・) わざわざ、ADOでプログラムを組むのもどうなんだろうと疑問に思ってます。

  • Excelユーザーフォームでのデータ検索

    現在Excelマクロの勉強中ですが、ユーザーフォームでテキストボックスを4個とコマンドボタン1個を作成し、テキストボックス1にコードを入力してコマンドボタンを押すと、ワークシート(ワークシート名、住所録)に作成されたデータのA列からコードを検索(データは2行目から始まる)し、一致したデータのB列にある「名前」をテキストボックス2、C列の「住所」をテキストボックス3、D列の「電話番号」をテキストボックス4に表示する。 というマクロが書けず困っています。 わかる方教えてください。

  • excelのVBAを利用し検索抽出を行う方法

    検索というよりデータの抽出の方が正しいかもしれません。 現在、顧客情報を種類別でシートに分けて表で管理しています。 情報には名前などの文字列、日付、時間などが含まれます。 この表の形式を説明すると、 ・列 … B~AI まで項目があります。(A列は使用していません) ・行 … 1行で1つのデータとなります。 ・行数…シートにより行数は異なります。 この形式の表が全部で14シートあります。 このシートのB列に「未・済」のステータスがあるのですが、 すべてのシートの「未」である行のデータを"Sheet1"に抽出させたいと考えています。 さらに、抽出されたデータの"D"列の日付にソートされるようにしたいのですが、 説明がわかりづらかったら申し訳ありません。 VBA初心者のためご教授いただければと思います。 よろしくお願いします。

  • エクセルで条件に合わせて合計を出したい

    いつもお世話になります。 ある列の範囲(B1:B8)の合計を出したいのですが、 条件があり、うまくできません。 (ケース1)    A    B      1  りんご  10         2  なし   10      2  ぶどう  10 4  メロン  20 5  いちご  10 6 7 8 9  合計 0 (ケース2)   A    B   1 りんご  10       2  なし   10      2  ぶどう  10 4  メロン  20 5  いちご  10 6 7 8 9   合計   60 条件というのは、合計する範囲の中に空白(もしくは0)があったら合計しない(もしくは0とする)、 そうでなければ合計値を出す ということです。 上の表のケース1の場合はB3にデータがないので、合計しない、 ケース2は合計する、ということです。 ネックになっているのは上の表では5行目にデータがありますが、 場合によって6行目、7行目、8行目も計算範囲になり、 データがあったり、なかったりするのです。 関数の組み合わせでもマクロでも良いので知恵をお貸し下さい。 わかりにくいところは補足します。よろしくお願いします。

  • EXCELの 編集 検索キーを使わず 検索したい

    EXCELの 編集 検索キーを使わず シート上で検索文字を指定して 検索された 全ての セルを表示したい。  第1表 CODEー名前表 CODEを探す A列 B列 C列 D列 1行 CODE 名前 CODE 2行 1001 あいうえお 1001 3行 1002 ああいうえ 1002 4行 1003 おあいうえ 1003 5行 1004 えおいうえ 1004 6行 1005 うえおあい 1005 7行 1006 うえああい 1006 第1表 CODEー名前表 から”あ”の含まれる全ての 名前 CODEを 第2表みたいに 作りたいのです 第2表 CODEを探す A列 B列 C列 D列 1行 検索する 名前 *あ* 2行 3行 検索された 名前 検索された CODE 4行 あいうえお 1001 5行 ああいうえ 1002 6行 おあいうえ 1003 7行 うえおあい 1005 8行 うえああい 1006 マクロを使わない方法で お願いします。 1:検索された 文字の足し算 2:文字の足し算をするごとに 1行増やす 3:改列 4:SUMPRODUCTで 文字の足し算は出来ますか?

  • エクセルのマクロでの検索

    「編集→「検索」でやるようなことをマクロでやりたいのです。 例えば列Aのデータを検索してそのデータがある行を表示させたいのですが ・同じブック内のシートの同じ列を検索する。 ・検索する文字列を含んでいる候補をマクロボタンを押すごとに表示させていく ということはできるでしょうか。

  • Excel VBAにおける複数条件での検索方法

    以下のように、Excelシートがあって このExcelシートで以下の条件で検索、その結果を返すVBAを作りたいのですが、悩んでいます。   検索条件 果物:りんご        産地:青森         複数ある時は、購入日が一番古いものを選ぶ。        更に複数ある時は、値段の安いものを選ぶ。    ⇒行番号を返す   これで、1つの行が選択できたら、そのF列に「在庫なし」を挿入する。    A列    B列  C列  D列  E列  F列 1行 購入日   果物  産地  数量 値段  在庫 2行 2017/4/10 りんご  青森  2   110 3行 2017/4/10 みかん  愛媛  3   350 4行 2017/4/10 りんご  青森  1   100 5行 2017/4/10 りんご  長野  2   120 6行 2017/4/12 みかん  静岡  3   350 7行 2017/4/13 みかん  愛媛  2   240 8行 2017/4/14 りんご  長野  2   120 9行 2017/4/15 りんご  青森  1   100 結果としては、上から4行目のリンゴのF列に「在庫なし」が 入るようにしたいです。 すみません、いろろと調べてはいるのですが、ちょっとわからず、こちらに投稿しました。どなたか、わかる方教えていただければ幸いです。 よろしくお願いします。

専門家に質問してみよう