• ベストアンサー

INDEX関数を使用した関数の意味を教えてください。

INDEX(sheet2!C:C,SMALL(INDEX((sheet2!$B$1:$B$100<>$B$18)*10^4+ROW($1:$100),),ROW(A1)))&"" sheet2にある表のB列に検索時に使用する文字列があり、sheet1のB18にその検索したい文字列を入力すると、一致したB列と同じ行のC列のデータを抽出する式です。 表のデータは今後も増加しますが、どの程度増加するは不明です。 INDEX関数やSMALL関数など一つ一つの関数の意味はわかっているつもりですが、なぜ上記のセルが選択されているのかわかりません。 特にSMALLの後の式がわかりません。 エクセル関数にはあまり詳しくないので、この式の意味をできれば詳しく教えていただけないでしょうか? (式の意味は人から聞いたものですが、違っていたらすいません)

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

  • ベストアンサー
回答No.2

要するに=vlookup(B18,Sheet2!B1:C100,FALSE)を小難しく書いてい るわけですが、まず、small関数の第二引数はrow(A1)ですから常に 1ですね。min関数でいいのに無駄なことをしています。 次に、index((sheet2!$B$1:$B$100<>$B$18)*10^4+row($1:$100),) ですが、これは(sheet2!$B$1:$B$100<>$B$18)つまりsheet2にある 表のB列がB18と一致しないかの論理値の配列 {TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;....}に10^4をかけてやると、 {10000;10000;10000;0;10000;10000;....}になり、対応する行番号 を加算して、{10001;10002;10003;4;10005;10006;....}という配列 がかえってくるわけです。 この配列の最小値は4、これで最初のindex関数は、sheet2!C:Cの4 番目の値を返すことが決まりました。そして、この表は10000行を 超えると破綻することも判りますね。唯一vlookupより便利なの は、B18に表に無い値を入力した場合にもエラーにならずsheet2!C1 を返すことでしょうか。

gogog00
質問者

お礼

わかりやすく、説明していただき、ありがとうございました。

その他の回答 (1)

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

sheet2!$B$1:$B$100<>$B$18)*10^4 Sheet2のB列(1~100行)がB18の内容と同じなら0、違うなら1000になります。 ROW($1:$100) Sheet2のB列の比較した行数になります。 上記の和は一致した場合は行数、一致しない場合は行数+1000になります。 次にINDEX関数を利用しているのはSMALL関数の初めの引数が配列のためです。 SMALL(INDEX関数で配列になった上記の結果,ROW(A1)) で一致する小さい方からの行数が順に表示されます。(一致しない場合は1000以上) 最後の&""は空欄対策と思われます。セル参照元が空欄の場合表示は空欄でなく0になります。 空欄&""とすることで文字列化して""を表示(見た目は空欄)

gogog00
質問者

お礼

ご回答ありがとうございました。 式の意味が理解できました。

関連するQ&A

  • match関数とindex関数について

    B列に空白を含む連続した数値の配列において、空欄と空欄の間の数値の個数を数える式として、以下の式を見たことがあります。 =IF(AND(B9<>"",B10=""),IF(ROW(B9)=COUNT($B$1:B9),ROW(B9),ROW(B9)-MATCH(1,INDEX(0/($B$1:B9=""),0))),"") 確かにこの式で求める答えが出るのですが、式の最後の「MATCH(1,INDEX(0/($B$1:B9=""),0)」の意味がよく分かりません。 ・MATCH関数の範囲としているINDEXの内容はどういう意味なのか ・MATCH関数の検査値としている「1」はどういう意味なのか ご教授願います。

  • ExcelのSMALL関数について

    ExcelのB列(B2:B50)にフラグ「0」または「1」が入力されています。 フラグ「0」が入力されている行番号を関数を使用して取得したいと思っています。 B列のフラグは順次更新されており、フラグ「0」の個数は複数あります。 下記の関数式(以下多めにオートフィル)で上記のことができるようになったのですが、 =IF(COUNTIF(B$2:B$50,0)<ROW(A1),"",SMALL(INDEX((B$2:B$50<>0)*10^5+ROW(B$2:B$50),),ROW(A1))) SMALL関数式の部分↓↓の意味がよくわかりません。 SMALL(INDEX((B$2:B$50<>0)*10^5+ROW(B$2:B$50),),ROW(A1)) どなたかご教授いただけないでしょうか。

  • INDEX関数SMALL関数を使って空白行を詰める

    シート1にINDEX関数SMALL関数を使って空白行を詰める表を作成したのですが詰めた表をシート2に表示することはできないのでしょうか。  =IF(COUNTIF($A4:$A4,0)=0,MAX(D$3:$D3)+1,"")  =IFERROR(INDEX(A:A,MATCH(ROW()-3,$D:$D, )),"")この表をシート2に表示する方法

  • エクセル 関数式の応用

    こんにちは エクセル2010を使っています。 画像の様なデータがあって、次のような式を教えてもらいました。 =IFERROR(INDEX($B$1:$B$7,SMALL(IF($A$1:$A$7=C$1,ROW($A$1:$A$7)),ROW(A1))),"") 画像では A列 B列の データが7行目までなのですが、これを3万行まで広げようと次のような式に変更してみましたが上手く行きません。(空白が返される) =IFERROR(INDEX($B$1:$B$30000,SMALL(IF($A$1:$A$30000=C$1,ROW($A$1:$A$30000)),ROW(A1))),"") 詳しい方、教えていただけませんか? よろしくお願いします。

  • エクセルでお聞きします。

    こちらのサイトの回答を参考に、セルに下記のような式が入れました。 他のシートや他のセルにも同様の式が入っているのですが割愛致しました。 通常Sheet1のB列は空白なんですが、もし何か文字が入っていたら その行に関してはこの式を反映させない方法を教えて下さい。 (Sheet2) B列 =IF(ROW(E1)>COUNT('Sheet1'!$E$4:$E$505),"",INDEX('Sheet1'!E$1:E$505, SMALL(INDEX(SUBSTITUTE(('Sheet1'!$E$4:$E$505<>"")*1,0,10^5)*ROW('Sheet1' !$E$4:$E$505),),ROW(E1)))) D列 =IF(ROW(C1)>COUNT('Sheet1'!$E$4:$E$506),"",INDEX('Sheet1'!C$1:C$505, SMALL(INDEX(SUBSTITUTE(('Sheet1'!$E$4:$E$505<>"")*1,0,10^5)*ROW('Sheet1' !$E$4:$E$505),),ROW(C1))))

  • ExcelでIndexとMatch関数が使いこなせない

    すみません、カテゴリを間違えてまして、再度投稿いたします。 有給管理表をExcelで作成しています。 シート1に社員のデータ表を入力してあり、 シート2には有給が発生する社員へ有給の残日数や 付与日に関するお知らせの案内状をB5サイズで作っています。 シート1のデータを拾って、シート2の案内状へ反映させる際、 付与日や残日数などはVlookupで参照できるのですが、 社員番号は退職した社員がいるため番号が飛んでいて うまくできません。 IndexやMatch関数を使えばなんとかなりそうだと思い やってみましたが、VALUE!が表示されてしまいます。 どなたかうまくいく関数を教えて頂けますでしょうか? シート1のデータ例  A列   B列   C列   D列    E列 社員番号  氏名  入社日  付与日   付与日数 100001   くま  2007/4/1  2007/10/1  10 100003   たぬき 2007/5/1  2007/11/1  10 100005   うさぎ 2007/5/10 2007/5/10  10  100010   きつね 2007/6/1  2007/12/1  10 シート2(例)ページ1    B列   C列 B1 社員番号  100001←ここに式を入れたい B2 社員氏名  くま  さん(vlookupでC1を拾ってくる) B4 あなたの有給付与日は  2007/10/1 です。付与日数は 10 日です・・・・・・。 シート2 ページ2 B30 社員番号  100003 (←ページ1の次の該当者を拾いたい) B31 社員氏名  たぬき  さん B33 あなたの有給付与日は 2007/11/1 です。 付与日数は 10 日です・・・・・・。 このような感じです。社員番号が飛んでいても下の行を拾っていくような関数はありますでしょうか?(Index、Match関数以外でも結構です)

  • INDEXとSUMPRODUCT関数が分かりません

    INDEXとSUMPRODUCT関数で以下の作業を行おうと思っています。 Sheet2に以下の関数を入れたのですが、どこかがおかしいです。 よろしければ、間違いを教えてください。 Sheet2のB2に入れている関数は =INDEX(Sheet1!$A$2:$A$4,SUMPRODUCT((Sheet1!$B$2:$D$4=A2 )*ROW(Sheet1!$B$2:$D$4))) です。

  • INDEX、SMALL、ROW関数と配列

    INDEX、SMALL、ROW関数で配列を利用した方法がうまく理解できません。 以下のURLで書かれている方法を理解したいのですが、いくつかわからない部分があります。 http://q.hatena.ne.jp/1291020662 (1)『それ以外は101を返す』とありますが、なぜ101なのですか? (2)SMALL関数は範囲(又は配列)と順位が引数ですが、 配列を表している部分『IF(B$1:B$100="男",ROW(B$1:B$100),101)』は、条件が男であるものを対象範囲とするという意味なのはわかるのですが、『ROW(B$1:B$100)』はなぜ必要なのでしょうか? 宜しくお願いします。

  • Excel INDEX関数ズレて抽出される

    INDEX関数で行列番号取得にMATCH関数を使用したときにズレてしまう。 定例のミーティングの参加表を作成しようとしています。 シートの構成は添付画像の通りです。 Sheet1 定例のミーティングの参加表 巡回Aは月ごとに担当者が変わる。 Sheet2 巡回Aの月別の担当表 巡回Aの担当表を用意して、COUNTIF関数で参加表の氏名が巡回Aのリストに含まれていない場合(カウント0)は空欄にし、0以外の場合、INDEX関数で列番号のところにMATCH関数をネスト、MONTH(TODAY())+1とし、ex. 8月なら翌月の9月に該当する列番号を抽出して巡回Aの出席を月が変わると連動するようにしたいです。 =IF(COUNTIF($B$22:$B$29,$B3)=1,IF(INDEX($C$22:$N$29,MATCH($B3,$B$22:$B$29,0),MATCH(MONTH(TODAY())+1,$C$20:$N$20,0))=0,"",INDEX($C$22:$N$29,MATCH($B3,$B$22:$B$29,0),MATCH(MONTH(TODAY())+1,$C$20:$N$20,0))),"") 職場のExcel2016では列がズレてしまい、抽出ができないです。 Excel365では問題なく抽出ができました。 2016でズレるのは何故でしょうか。 詳しい方居ましたらご教授下さい。 よろしくお願い致します。

  • Excel 空白セルを詰めて表示する方法

    <sheet1>にある表をオートフィルタを使用せず,関数で<sheet2>のように空白を詰めた状態にしたいと思っています。 <sheet1>    A    B   C 1 100 -100 2 100 -100 3 -200 100 100 4 5 <sheet2>    A    B   C 1 100 -100 -100 2 -200 100 100 3 100 4 以前に似た質問があり,それを参考にやってみたのですがどうもうまくいきませんでした。文字列と数値では式も変わるものなのでしょうか?参考にした例もあげておきます ------以下,参考にした例------ <図1>     A     B 1   あいう 2         えお 3   かきく 4         けこ 5   さしす <図2>各行の空白セルを詰めて表示させる     A     B     10  あいう   えお 11  かきく   けこ 12  さしす 13 14 【関数】 A10: =IF(ROW(A1)>COUNTA(A$1:A$5),"",INDEX(A$1:A$5,SMALL(IF(A$1:A$5<>"",ROW($A$1:$A$5),""),ROW(A1))))

専門家に質問してみよう