• ベストアンサー

エクセルで、指定の値よりも大きい数字を最初に越えたときの列番号を返すには?

テストの点数で、初めて40点を下回ったときの日付と、初めて80点を越えた時の日付を返すような関数を組みたいのですが、どうやればいいか分かりません。MATCH関数を使うような気がするのですが、そこから先が分かりません。 例) 1月1日  43点 1月2日  83点 1月3日  81点 1月4日  26点 ・・・ この例であれば、80点を初めて越えるのは「1月2日」、 初めて40点を下回るのは「1月4日」という形で答えを返したいのですが、どなたかお知恵を貸してください。よろしくお願いします。

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

  • ベストアンサー
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.2

◆こんな方法はいかがでしょう >80点を初めて越えるのは「1月2日」 D2=MIN(INDEX((B2:B10<=80)*10^5+A2:A10,)) >初めて40点を下回るのは「1月4日」 D5=MIN(INDEX(((B2:B10>=40)+(A2:A10=""))*10^5+A2:A10,))

kenken18
質問者

お礼

ありがとうございます。 私が理想にしていた形そのものです。 質問なのですが、INDEX関数内で範囲を指定して掛け算、足し算まで入っていて、この関数の意味するところが良く理解できません。 この部分についても教えていただけないでしょうか? よろしくお願いいたします。

その他の回答 (5)

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.6

>INDEX関数内で範囲を指定して掛け算、足し算まで入っていて、この関数の意味するところが良く理解できません。 1)((B2:B10>=40)+(A2:A10=""))*10^5 は40未満のデータを排除しています 2)「B2:B10の40以上」または、「A2:A10が空白」に10^5(100000)を掛けます 3)数式バーのうち、((B2:B10>=40)+(A2:A10=""))*10^5 の部分を指定して、「F9」をクリックします 4){100000;100000;100000;0;0;100000;100000;100000;100000} になり、B列40以上、A列空白が「100000」になっています 5)それに、A2:A10 を足しますと 6)数式バーのうち、((B2:B10>=40)+(A2:A10=""))*10^5+A2:A10 の部分を指定して、「F9」をクリックします 7){139814;139815;139816;39817;39818;100000;100000;100000;100000} になり、これのMINは「39817」になります 8)「39817」はシリアル値なので、表示形式を「日付」にすると、「1月4日」になります

kenken18
質問者

お礼

ありがとうございました。大変ためになりました。 F9キーの使い方まで教えていただき、大変感謝です。 本当にありがとうございました。

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

80点以上の行で、行番号の最小の行の日付、を求める。 配列数式ですが 例データ 2月3日 23 2月14日 45 2月25日 82 3月4日 81 4月4日 34 4月7日 89 =INDEX(A1:A8,MIN(IF(B2:B8>80,ROW(B2:B8),99))) と入れて、SHIFT+CTRL+Enterを同時押し。 99はこのデータではありえない行数を入れる。 結果 2009/2/25 (このセル書式は日付に設定) ーー 作業列を使うなら A2:B7  にデータ A列   B列  C列 2月3日 23 2月14日 45 2月25日 82 1 3月4日 81 4月4日 34 4月7日 89 C列は =IF(COUNTIF($B$2:B2,">80")=1,1,"") 求める日付は =INDEX(A2:A8,MATCH(1,$C$2:$C$8,0),1) (このセル書式は日付に設定) ーーー 下回った日も上記式を 初出だからMIN、点数判定部部分を<40に変えることで出来ると思います。

kenken18
質問者

お礼

ありがとうございます。配列数式という方法があるんですね。 話には聞いていたんですが、こういうときに使うんですね。 あまり馴染みがなっかたので、今後覚えていこうと思います。 ありがとうございました。

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

作業列を使った方法を紹介します。 データがAおよびB列の2行目から下方にあるとします。 C2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(B2="","",IF(COUNTIF(B$2:B2,"<="&40)=1,"A",IF(COUNTIF(B$2:B2,">="&80)=1,"B",""))) 最初に40点以下となった行にAが、80点以上になった行にBが表示されます。 たとえばD2セルに40点以下となった日、D3セルに80点以上になった日と入力し、E2セルには次の式を =INDEX(A:A,MATCH("A",C:C,0)) E3セルには次の式を入力します。 =INDEX(A:A,MATCH("B",C:C,0)) なお、E2およびE3のセルの表示形式は日付にします。 いずれの式も列を対象にしていますのでデータが次々に入力されても即座に対応できます。 なお、MATCH関数を検討したことでしょうが何点以上とか、何点以下とかの形で式をたて使うことができません。点数を昇順や降順で並べ替えをしたうえで使うことができなくもないですが、元のデータを並び替えるなど操作が面倒になりますね。

kenken18
質問者

お礼

ありがとうございます。やはり作業列を使うのがスマートのようですね。 MATCH関数を使おうかと思ったんですが、KURUMITOさんのおっしゃるとおり、昇順並び替えの必要などがあり、あまり実用的なものにならず困っていました。。。 ありがとうございました。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.3

◆先ほどの回答での添付図で「83越え」になっていますが、正しくは「80越え」です ◆なお、回答式は「80越え」になっています

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

こんばんは! 色々方法はあると思いますが・・・ 一例です。 ↓の画像のような感じで作業列を使っています。 C2セルに =IF(OR(B2="",B2<=80),"",ROW(A1)) D2セルに =IF(OR(B2="",B2>=40),"",ROW(A1)) という数式をいれて、C2・D2セルを範囲指定した後に C2セルのフィルハンドルで下へオートフィルでコピーします (とりあえず100行まで対応できる数式にしていますので、100行までオートフィルでコピー) そしてF2セルに =INDEX($A$2:$A$100,SMALL(C$2:C$100,1)) と入れてG2セルまでオートフィルでコピーします (セルの書式設定から表示形式は「日付」で・・・) これで何とか希望に近い形にならないでしょうか? 以上、参考になれば幸いですが、 他に良い方法があれば読み流してくださいね。m(__)m

kenken18
質問者

お礼

ありがとうございます。作業列を使えばいいんですね。 なんとか関数だけで完結させようとしてたので、 今後はこういうやり方も考えるようにしたいと思います。 ありがとうございました。

関連するQ&A