• ベストアンサー

【Excel】条件を満たすデータを全て取り出す

Excel2003を使用しています。 ある書類を作成するための下準備として、条件を満たすデータを全て取り出したいのですが、うまくいかないので、教えてください。 例えば、G7に入力されているデータがC列に入力されているデータと一致したら(必ず1個以上あります)、一致するD列とE列のデータをそれぞれ別セルに全て取り出したいのですが、どのようにすればいいでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.6

お約束のコードです。 実際にはもっと汎用性に富んだコードを書くべきなのですが 時間がないので今回こっきりコードということで。。。 が、セル位置などの変更はちょこっと修正すればできますね。 '---------------------------------------------------------  Sub Test()   Dim LastRow As Long  '検査範囲(C列)最終行   Dim myRange As Range  '検査範囲(C列)      Dim R As Long    '検査値(S列)行カウンター   Dim Clm As Integer  '抽出先の列   Dim PutRow As Long  '抽出先の行      Dim FindCell As Range  '検査範囲(C列)でヒットしたセル   Dim FirstAdrs As String '最初にヒットしたセルアドレス    '検査範囲(C列)の確定   LastRow = Range("C65536").End(xlUp).Row   Set myRange = Range(Cells(6, "C"), Cells(LastRow, "C"))    'ぐるぐる開始   For R = 7 To 30        PutRow = 6     Clm = Clm + 1          Set FindCell = myRange.Find(Cells(R, "S"), , xlValues, xlWhole)          If Not (FindCell Is Nothing) Then       FirstAdrs = FindCell.Address          Do       PutRow = PutRow + 1       Cells(PutRow, Clm + 19).Value = Cells(FindCell.Row, "E").Value       Cells(PutRow, Clm + 49).Value = Cells(FindCell.Row, "F").Value              Set FindCell = myRange.FindNext(FindCell)     Loop While Not (FindCell Is Nothing) And FindCell.Address <> FirstAdrs   End If      Next R    End Sub '------------------------------------------------------ 動作確認してありますので、意図しない動作をする場合は 質問者の提示したセル番地などが違うものと考えられます。  

rx-z5815
質問者

お礼

onlyrom さん、こんにちは。 お忙しいところ、回答ありがとうございます。 早速、教えていただいたコードで、マクロを実行してみたところ、うまくいきました! 今回抽出したデータを元に、さらにマクロを使用して、書類を作成することを考えていて、これが解決しないと先に進めなかったので、大変助かりました。 また、機会がありましたら、よろしくお願いします。

その他の回答 (5)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.5

onlyromです。 くどいようですが、も少し補足願います。 実際の表(テーブル)について (1)見出しは、何行目? (2)データの始まり、何行目から? (3)先の質問では、検索値は、G7ひとつでしたが実際は、S7~S30で      先ず、S7でC列を検索      次に、S8でC列を検索      以下、S30まで繰り返す ということですね? (4)S7でヒットしたものが3つ、S8でヒットしたものが2つあった場合      T,Uの2~4行目、続けて5~6行へ抽出と、連続で抽出していいのですね?     (T,Uの一行目は見出しと仮定) 後、これだけ補足いただければ、必ず今日中にコードアップします。   今からちょとお仕事。。。(^^;;;  

rx-z5815
質問者

補足

onlyrom さん、おはようございます。 何度も恐れ入ります。説明不足でスミマセン…。 早速、補足要求の件ですが  (1) 見出しは6行目です。  (2) データの始まりは7行目からです。  (3) おっしゃるとおり、検索値はS7~S30で、S7でC列を検索後、S8、S9…S30まで繰り返します。  (4) データを抽出する場所については、どうしたらいいのか迷っていました。いろいろ考えてみて、この分だけは、前回補足させていただいた内容から下記のように変更させていただきたいのですが…  S7でC列を検索してヒットしたE列のデータは、T7セル以下に抽出  S8でC列を検索してヒットしたE列のデータは、U7セル以下に抽出     :     :  S30でC列を検索してヒットしたE列のデータは、AW7セル以下に抽出 同じく  S7でC列を検索してヒットしたF列のデータは、AX7セル以下に抽出  S8でC列を検索してヒットしたF列のデータは、AY7セル以下に抽出     :     :  S30でC列を検索してヒットしたF列のデータは、CA7セル以下に抽出 というふうに、したいのですが。。。 よろしくお願いします。  

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

ANO,2 onlyromです >VBAでの処理でも、もちろん構いません で、あれば実際に沿ったシートレイアウトアップして 扱うセルも、例えば、ではなくて具体的に。 特に重要なのは、質問でいうと、G7とC列の関係。 表に、G7(G列)は含まれているのかいないのか? >C列に入力されているかどうか検索するデータも複数あるので これから判断すると、G7は表に含まれていなくて(いてもいいが) G7の値を変更しながら、質問の件を実行するということですね? 要するに、G列を頭から検索値として、C列を検査範囲とするわけではなく、 検査値は、あくまでも、G7のみということですね。 それから、ヒットしたら、D,E列をどこに取り出すのか。 等々、具体的に補足願います。   これらが分かると的確な回答が直ぐ寄せられるでしょう。 もちろん、当方もそうする積もりですが。。。  

rx-z5815
質問者

補足

再度の書き込みありがとうございます。 質問文の例えばで書いたものと実際のものは、セルの列が違うだけで、ほぼ同じように書いていました。 実際のセルの位置は、下記のようになっています。  ・検索するデータは、 S7:S30 に入力されています。  ・検索する範囲は、これは質問文と同じくC列です。  ・ヒットしたら、E列、F列をそれぞれT列、U列に取り出せたらと思っています。 よろしくお願いします。

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

次の方法は如何でしょうか。 一例ですが、検索範囲をC1:C200として次の方法は数式は如何でしょうか。 数式は、配列数式の為、入力完了時にshift+ctrl+enterキーを同時押下して、そのセルを下方向にコピーして下さい。 D列抽出:=IF(ROW(A1)-1<COUNTIF($C$1:$C$200,$G$7),INDEX($D$1:$D$200,SMALL(IF($C$1:$C$200=$G$7,ROW($C$1:$C$200),99999),ROW(A1))),"") E列抽出:=IF(ROW(A1)-1<COUNTIF($C$1:$C$200,$G$7),INDEX($E$1:$E$200,SMALL(IF($C$1:$C$200=$G$7,ROW($C$1:$C$200),99999),ROW(A1))),"")

rx-z5815
質問者

お礼

回答ありがとうございます。 教えていただいた配列数式で試してみたところ、うまくいきました。 配列数式は以前、別の質問でも回答をいただいたことがあるのですが、なかなか手を出せずにいます。 時間を見つけて勉強したいと思っているのですが。。。 ありがとうございました。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

>必ず1個以上あります フィルターオプションで、G7に該当する値のデータを全て抽出して DE列をどこかのセル(これ書いてないので分からない)にコピペ。 では拙いのですか? 質問者はVBAも少々弄れますよね。 VBAでの処理は考えていませんか。

rx-z5815
質問者

お礼

回答ありがとうございます。 フィルタオプションも考えたのですが、C列に入力されているかどうか検索するデータも複数あるので、回答者様のお言葉を借りて言うならば、ちょっと拙いのです。 VBAでの処理でも、もちろん構いません。何か良い方法があれば、教えていただけると助かります。

  • suekun
  • ベストアンサー率25% (369/1454)
回答No.1

VLOOKUPの事を考えてよいでしょうか? 対応表があってその右端を(質問の場合はC列)検索して G7セルと同じ値を見つけた場合は、C列の該当セルの右隣の D列E列の値を拾ってくる。 C D E F G H 1 あ a た 2 い b ち 3 う c つ 4 え d て 5 お e と 6 か f な う 7 き g に 8 く h ぬ 9 け i ね とあったとして、 値の欲しいセルに =IF(ISERROR(VLOOKUP($G$7,$C$1:$E$9,COLUMN(B1),0)),"",VLOOKUP($G$7,$C$1:$E$9,COLUMN(B1),0)) と入力して右方向にフィルコピーして下さい。

rx-z5815
質問者

補足

回答ありがとうございます。 VLOOKUPだと、一致するデータがひとつのときはいいのですが、一致するデータは必ず1個以上で、複数のときもあるというより、複数のときがほとんどなのです。 全ての一致するデータを拾う、何か良い方法はないでしょうか?

関連するQ&A

専門家に質問してみよう