エクセル関数を使って検索する方法

このQ&Aのポイント
  • エクセル関数を使って複数のシート間で検索する方法について教えてください。
  • Sheet1に入力した値と同じ値を他のシートの特定の列から探し、該当するセルの値を取得する方法を教えてください。
  • VLOOKUP関数を使用すると思いますが、入れ子の数の制限があるため、14個のシートをまたいで検索する方法についても教えてください。
回答を見る
  • ベストアンサー

エクセル関数を使って検索したいです。

やりたいことは以下の通りです。 Sheet1~Sheet15が存在します。Sheet2~Sheet15には3列で行がそれぞれ異なる表があります。例えばSheet1は5行3列、Sheet2は10行3列、Sheet4は30行3列のように。ちなみにこれらの表は行が追加されていきます。 Sheet1にも同様に3列の表があるのですが、Sheet1のB列(2行目)に、式を作りたいです。 どんな式かと言うと、Sheet1のA列(1行目)に値を入れると、それと同じ値を、Sheet2~Sheet15のA列(1行目)と同じものを探し、そのSheetのB列(2行目)の値を返すというようにしたいです。 VLOOKUPを使うといいかと思うのですが、Sheetを14個もまたいで検索したい時にIFで作るとエクセル2003なので入れ子が7個以上になってしまいうまくいきません。 ちなみに、Sheet1に入力する値はAAA1やBBB2の様にアルファベットと数字の組み合わせです。 よって、例えばSheet2のA列にはAAA1、AAA2、AAA3、AAA4の様に、Sheet2のA列にはBBB1、BBB2、BBB3、BBB4の要に入力された状態になっています。 どなたかうまく切り抜ける方法を教えてください。

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

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

作業用のシートを一つ用意して対応するのがよいでしょう。 シート2からシート15まででそれぞれのシートでのデータの数はそれほど多くないのですからそれらのすべてのデータを例えばシート16に表示させるようにして、シート16を利用してシート1に表示させるようにします。 なおそれぞれのシートは1行目は項目名で2行目から下方にデータが入力されているとします。 初めにシート16での作業を説明します。 A1セルから右横のセルに順番にSheet2,Sheet3,Sheet4・・・・・・Sheet15といったシート名を入力します。 次にA2セルには次の式を入力して右横方向にオートフィルドラッグします。 =IF(A1="","",COUNTA(INDIRECT(A1&"!A2:A1000"))) これでそれぞれのシートに入力されているデータの行の数が表示されます。 次にA3セルには次の式を入力して右横方向にオートフィルドラッグします。 =IF(A2="","",SUM($A$2:A2)/3) 5行目には各シート共通の項目名を入力します。3列までの項目名を入力します。 A6セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。 =IF(OR(ROW(A1)>MAX($3:$3),COLUMN(A1)>3),"",IF(ROW(A1)<=MIN($3:$3),INDEX(INDIRECT($A$1&"!A2:D1000"),ROW(A1),COLUMN(A1)),IF(COUNTIF($3:$3,ROW(A1)),INDEX(INDIRECT(INDEX($1:$1,MATCH(ROW(A1),$3:$3,0))&"!A2:D1000"),ROW(A1)-INDEX($3:$3,MATCH(ROW(A1),$3:$3,0)-1),COLUMN(A1)),INDEX(INDIRECT(INDEX($1:$1,MATCH(ROW(A1),$3:$3,1)+1)&"!A2:D1000"),ROW(A1)-INDEX($3:$3,MATCH(ROW(A1),$3:$3,1)),COLUMN(A1))))) これで5行目以降には各シートのデータがまとめて表示されます。勿論各シートに新たなデータが追加されることが有っても即座にデータが追加されます。 最後はシート16を元にシート1を完成させればよいわけです。 シート1のB1セルには次の式を入力して下方にオートフィルドラッグします。 =IF(OR(ROW(A1)>MAX(Sheet16!$3:$3),COUNTIF(Sheet16!$A:$A,A2)=0,COLUMN(A1)>3),"",VLOOKUP(A2,Sheet16!$A:$C,2,FALSE))

pon10000
質問者

お礼

ありがとうございました。思うようになりました。 もし良ければ少しおしえてください。 =IF(A1="","",COUNTA(INDIRECT(A1&"!A2:A1000"))) と =IF(OR(ROW(A1)>MAX($3:$3),COLUMN(A1)>3),"",IF(ROW(A1)<=MIN($3:$3),INDEX(INDIRECT($A$1&"!A2:D1000"),ROW(A1),COLUMN(A1)),IF(COUNTIF($3:$3,ROW(A1)),INDEX(INDIRECT(INDEX($1:$1,MATCH(ROW(A1),$3:$3,0))&"!A2:D1000"),ROW(A1)-INDEX($3:$3,MATCH(ROW(A1),$3:$3,0)-1),COLUMN(A1)),INDEX(INDIRECT(INDEX($1:$1,MATCH(ROW(A1),$3:$3,1)+1)&"!A2:D1000"),ROW(A1)-INDEX($3:$3,MATCH(ROW(A1),$3:$3,1)),COLUMN(A1))))) がどうしても理解できません。 少し解説をしていただけると嬉しいです。

その他の回答 (5)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

こんばんは! すでの回答は出ていますので、参考程度で・・・ VBAでの一例です。 画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストしてSheet1のA列にデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim i, k As Long If Intersect(Target, Columns(1)) Is Nothing Or Selection.Count <> 1 Then Exit Sub For i = 2 To Worksheets.Count If WorksheetFunction.CountIf(Worksheets(i).Columns(1), Target) Then k = WorksheetFunction.Match(Target, Worksheets(i).Columns(1), False) Exit For End If Next i If k > 0 Then Target.Offset(, 1) = Worksheets(i).Cells(k, 2) Else Target.Select MsgBox "該当データがありません。" & vbCrLf & "再入力してください。" Exit Sub End If End Sub 'この行まで ※ 関数でないので、ご希望の方法でなかったらごめんなさいね。m(_ _)m

pon10000
質問者

お礼

ありがとうございました。 VBAでもいいと思うのですが、関数でという指示があったもので。 ただこのすごくVBAも参考になりました。

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

シート2にはすべて「AAA」が入り,シート3には全て「BBBのなんたら」が来ると言うことですか? もしそういうお話なら,シート1に J列   K列 AAA Sheet2 BBB Sheet3 CCC Sheet4 のようにインデックスと該当するシートの名称の対応表を用意しておけば,少しは作業が楽になりますね。 ケース1:ご質問の例示が事実で「AAA」のように必ずアルファベット3文字だというなら B2: =VLOOKUP(A2,INDIRECT(VLOOKUP(LEFT(A2,3),J:K,2,FALSE)&"!A:C"),2,FALSE) ケース2:ホントのデータは「AA1」だったり「BBBB33」だったり不定なら B2: =VLOOKUP(A2,INDIRECT(INDEX($K$1:$K$15,SUMPRODUCT(LEFT(A2,LEN($J$1:$J$15))=$J$1:$J$15)*ROW($K$1:$K$15))&"!A:C"),2,FALSE)

pon10000
質問者

お礼

ありがとうございました。アルファベット3文字プラス数字の組み合わせに必ずなります。

回答No.4

>Sheet2~Sheet15のA列(1行目)と同じものを探し、そのSheetのB列(2行目)の値を返すというようにしたいです 1行ずらすのでしょうか? ずらさないと仮定し A2セルに 検索値 C2セルに =IF(A2="","",MAX((CHOOSE({1,2,3,4,5,6,7,8,9,10,11,12,13,14}, Sheet2!$A$1:$A$100,Sheet3!$A$1:$A$100,Sheet4!$A$1:$A$100,Sheet5!$A$1:$A$100,Sheet6!$A$1:$A$100,Sheet7!$A$1:$A$100, Sheet8!$A$1:$A$100,Sheet9!$A$1:$A$100,Sheet10!$A$1:$A$100,Sheet11!$A$1:$A$100,Sheet12!$A$1:$A$100,Sheet13!$A$1:$A$100, Sheet14!$A$1:$A$100,Sheet15!$A$1:$A$100)=Sheet1!A2)*ROW($A$1:$A$100)*100+{1,2,3,4,5,6,7,8,9,10,11,12,13,14})) [Ctrl]+[Shft] +[Enter] で確定、配列数式。{ }で挟まれる 3ケタ以上の値が出る B2セルに =IF(A2="","",INDEX(CHOOSE(MOD(C2,100),Sheet2!$B$1:$B$100,Sheet3!$B$1:$B$100,Sheet4!$B$1:$B$100,Sheet5!$B$1:$B$100,Sheet6!$B$1:$B$100,Sheet7!$B$1:$B$100, Sheet8!$B$1:$B$100,Sheet9!$B$1:$B$100,Sheet10!$B$1:$B$100,Sheet11!$B$1:$B$100,Sheet12!$B$1:$B$100,Sheet13!$B$1:$B$100, Sheet14!$B$1:$B$100,Sheet15!$B$1:$B$100),INT(C2/100)))

pon10000
質問者

お礼

すみません。書き方が悪かったと思います。 1行ずれたりはしません。 画像つきでわかりやすかったです。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

ごたごた文章が多く、普通のエクセルの約束と違う表現で、質問の意味が掴みにくい。 3シートぐらいの例にして実例でもあげたらどうです。 >A列(1行目 と書かず、Sheet1のA1と書くのが慣わしです。こんなことも慣れてないのかな。 検索語 Sheet1!A1 式を入れるセル Sheet1!B2 検索する範囲 Sheet2!A:AからSheet15!A:A  <--A列だけの中の検索で良いのか? ーー 検索した結果見つかったとして、どう結果を返すのか?有り無しだけ? 普通は見つかったセルの同行右列などのデータがほしい場合が多いよ。 ーー 検索結果は書くシートのA列で複数行に見つかりそうなのかどうか? 大切な点。複数ありそうな場合は関数では特に難しい。 ーーー その後データ例を挙げること Sheet1!A1 AAA1やBBB2、これは敢えて書く必要は無いと思う。 >Sheet2”A:A にはAAA1、AAA2、AAA3、AAA4の Sheet3!A:A にはSheet2のA列にはBBB1、BBB2、BBB3、BBB4 質問では>Sheet2のA列にはBBB1、BBB2、BBB3、BBB4のようになっているがSheet3の誤りだろう。 それとAAAA1が検索語の場合、「含む」場合の、AAAA12などは探すのかどうか大切な点がかかれていない。 ーー 以上の質問表現の書き方を参考にして、質問の場合の文章は良く考えて。それにはもっと色んな勉強(要所とかパターンとかの学習)が必要。 ーーーー 本件は関数では複雑で難しいものになると思う。 VBAでも勉強し無いと難しいが、それも簡単ではない。 Sub test01() x = Worksheets("Sheet1").Range("A1") For Each sh In Worksheets If sh.Name <> "Sheet1" Then Set y = sh.Range("A:A").Find(x) If y Is Nothing Then MsgBox "not found" Else MsgBox "シート名" & sh.Name & の"" & y.Row & "行"End If End If Next End Sub のようなのを標準モジュールに書いて、シートにコマンドボタンでも設けて、クリックしたとき検索 のようなのをさせることになるのかな。 Sheet1のイベントモジュールで Private Sub CommandButton1_Click() test01 End Sub ーーーー 上記はA列には1つしか無いと仮定できる場合の話。 複数行にヒットする仕組みのデータ場合は関数では難しいし、VBAでも多少コード変更が必要。

pon10000
質問者

お礼

すみませんでした。 素人なもので。 表現の仕方等もっと勉強します。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

回答1です。 シート16での入力の式が一部間違っていました。 次にA3セルには次の式を入力して右横方向にオートフィルドラッグします。 =IF(A2="","",SUM($A$2:A2)) に変更してください。

関連するQ&A

  • Excel検索関数で

    説明下手なのでわかりにくいかもしれませんがお願いします。 VBAを使わず、エクセルの関数のみを使って表のデータを抜き出し並びかえる作業をしてます。 表は複数あり、あらかじめ決められた順番に列を抜き出し、新たなシートに表を作ってます。 抜き出す時にVLOOKUPを使用しています。 抜き出す先の表にも検索値の列が存在してます。 一番最初にB列に基準となる列を抜き出し、B1を検索値、 抜き出したい列のある表を検索範囲(仮に○○!A1:C5とします) 抜き出す列は1列目(A列)なので1、 検索の型はFalseにします。 以上を式にすると、 =VLOOKUP($A1,○○!$A$1:$C$5,1,0)となってるのですが、 目的のA列が抜き出せません。 ちなみに、同じ式をオートフィルで引っ張るので絶対参照させてます。 また、抜き出す列より後の列が抜き出せないような状態です。 これでわかりますでしょうか? VLOOKUPじゃなくてもいいので何か方法はありませんでしょうか? 説明わかりにくくてすみません・・・

  • エクセル 関数を使わずにデータを取りたい

    EXCELを使ってデータ入力をしたいです。 下の図のように、シート1のA列にコードを入力すると、シート2のテーブルから値を引っ張ってくるようにしたい。 たとえば、シート1のA1に"C001"を入力したら、B1に"赤"が自動入力されるようにしたい。 シート1 A列 B列 行1 C001 シート2 A列 B列 行1 C001 赤 行2 C002 青 行3 C003 黄色 ただし、シート1のB列の値は、入力後に編集するため、ここには計算式を入れたくないのです。 なので、通常ならばB列にVLOOKUP関数を使えばすむことですが、計算式を入れずに上記を実現する方法を教えてください。

  • エクセル 関数 対象を全て抽出する

       列A  列B 行1  1   AAA 行2  2   BBB 行3  2   CCC 行4  1   DDD 行5  1   EEE 行6  2   GGG 行7  2   HHH 列Aが2であるものすべて抽出する方法? 結果が 検索値↓(手入力) 2 ↓ この表を作りたい 2 BBB 2 CCC 2 GGG 2 HHH

  • エクセル関数 ランキングを使って・・・

    みなさま宜しくお願い致します。 集計作業中に躓いてしまいました。 ランキング表を作成(Sheet1)しているのですが、別シート(Sheet2)に同数で同じ順位が数名います。 Sheet2はあくまで作業シートでその他の情報も含まれているので、Sheet1に表示用を作成しました。 A列に順位(作業列)、B列に実際の順位、C列に名前という風に表示させたいのですが、Vlookupを使用すると次点が抽出されません。Vlookupにそのほかの関数を加えるのかまたは別の関数があるのでしょうか。宜しくお願い致します。 【内容】 Sheet2: A列に1行目~10行目まで実際の順位(同数は同順位)B列に名前。 Sheet1: A列には1行目~10行目まで1~10の数字を(作業列とし、最終的には非表示にしようかと)。 B列には関数式:=SMALL(Sheet2!$A$1:$A$10,Sheet1!A1)を入力し、10行目までオートフィルすると、同数同順位の数値を表示します。 ここからです。 この順位に該当する人をSheet2からVlookupで引っ掛けようにも、次点以降の名前が出てきません。 何か良い方法はありますでしょうか? みなさまのお知恵をください。 宜しくお願い致します。

  • エクセル関数 何を使えばいいか教えてください

    初心者なもので作成中の資料に関数等を使ってスムーズに表示したいと考えています どなたかお知恵を貸して下さいますようお願いします。 出来れば本日中に頂けると有難いです。 内容     表1           表2  累計  実数   累計  実数 A   1    ?     A  3    ? B   2    ?  ⇔  B  2 ? C  3    ?     C  1 ? D  4    ?     D  1    ? 上記のようなエクセルシートがあります。 ・実数値を求めます(普通は引き算すればいいのですが…) ・行Aから行D 及び 累計と実数は固定です ・表1は行Aから下へ累計値を入力 表2は行Dから上へ累計値を入力 上下両方の入力方法に対して対応できる関数式を教えてください。 説明が下手なのですみません

  • エクセルのVLOOKUP関数について

     エクセルで、VLOOKUPを使っています。  A3に 1 と入力すると、Aの5行目11行目までから、別のシートに入力してある A1~G1の項目の情報が1列にババッと入力されています。    そのVLOOKUP関数を使おうと思うのですが、この関数は数年前に入力したもので、式の作り方がわからなくなってしまいました。 前使った式は =VLOOKUP(F2,'C:\Documents and settings\office\デスクトップ\新しいフォルダ (2)\[ガイドブック.xls]Sheet1'!1:65536,11,0) です。 この式の意味が、今見てもさっぱりわかりません。 この式がどういう命令になっていたのか・・・・(特にSheet1からわからない)、 もし出来たら教えていただけるとありがたいです。 間違っている箇所があったらそれも教えてくださるとありがたいです。

  • エクセル関数で検索能力がある関数を教えてください。

    「シート1」と「シート2」があります。 「シート1」には   1      2 A 通信費  課税仕入 B 借入金  対象外 C 支払利息 非課税仕入 のような表があります。 「シート2」には   1     2 A 通信費 B 交際費 となっていたとします。 この場合、「シート2」のセルA2に、 VLOOKUP関数で「シート1」を参照し、「課税仕入」を表示させることはできるのですが、 「シート2」のセルB2にセルA2の関数をコピーした場合、 「シート2」のセルB1にセルに表示されている「交際費」は「シート1」の表には登録していないため、セルB2にはエラー値が表示されてしまいます。 「シート1」の表に「交際費」を登録すればいいのですが、 自己都合上、「シート2」のセルB2に、 「シート2」セルB1の項目が「シート1」の「1列目」にあれば、「2列目」の項目を表示する。 「シート1」の「1列目」に該当する項目が無ければ、「シート2」のセルB2には「対象外」と表示するようにしたいのです。 言い換えますと、「シート2」の通信費は「シート1」にあるのでVLOOKUP関数で課税仕入を導くことが出来ます。 しかし、「シート2」の交際費は「シート1」に無いため、VLOOKUP関数をしようできません。 「シート1」に無い項目の場合には、「シート2」に「対象外」と表示されるような関数の式が知りたいです。 わかりにくい文章になってしまいましたが、よろしくお願いします。

  • 【Excel】一致するデータの検索

    Excel2003を使用しています。 Sheet1のB列の値がSheet2のA列に入力されている値と一致したら、Sheet1のC列とD列の値をSheet2のC列とD列に表示させたく、VLOOKUP関数を使用したところ、Sheet1のB列とSheet2のA列のデータの並び方(順序)が同じではないためか、VLOOKUP関数ではできませんでした。 こういう場合、マクロで処理することは可能でしょうか?可能であれば、どのようにコードを記述すればいいでしょうか? Sheet1のデータは4行目から、Sheet2のデータは6行目から入力されています。 よろしくお願いします。

  • SUMPRODUCT関数の使い方

    A列 aaa aaa bbb bbb ccc ccc と入力して、 「aaa」の個数と「bbb」の個数の合計を求める式を教えてください。 見た限りの答えは、「aaa」が2個、「bbb」が2個で4なのですが B1に 「=SUMPRODUCT(A:A="aaa",A:A="bbb")」 としたのですが、「0」が返ってきてしまいます。 B2に 「=SUMPRODUCT(COUNTIF(A:A,"aaa"),COUNTIF(A:A,"bbb"))」 だと、 4が返ってきますが A列を aaa aaa bbb にすると「3」が返ってきてほしいのに、2になってしまいます。 個数の合計を返す関数式をご教授ください。

  • 【Excel】行と列で値を検索したい

    こんにちは Sheet1に表があります。 Sheet2のA列と1行に値を入力したときに、 Sheet1の交わる値を表示したいのですが、 Sheet2のB2、C2、B3、C3の式を教えて下さい。 Excel2013です。 宜しくお願いいたします。

専門家に質問してみよう