• ベストアンサー

配列数式を用いて、表を完成させたいのですが

配列数式について教えてください。 配列数式についてこちらのサイトで教えていただき、自分が作成したいと思っていた表がだんだん形となってきました。 ご回答いただいた方々、本当にありがとうございましたm(_ _)m 作成したいと思っている表は、株の1分単位の始値・高値・安値・終値を表示するようにしたいと思っているのですが、始値・安値についてうまくできません。 配列数式と若干異なるかもしれないのですが、エクセルで表示が可能かどうかを教えていただけないかと思い、再度質問させていただきたいと思います。 表を添付しました。通常9:00に始値がつくのですが、1月2日は調整がつかなかったため、金額が「0」で表示されています。 表示させたい始値は、金額がついた9:02の「8000」を表示させたいと思います。また最小値も、「0」ではなく、9:03の「7800」を表示させたいと思います。 何か良い方法はないでしょうか?

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

  • ベストアンサー
  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.3

No1です IF((B2:B7>="9:00"*1)*(B2:B7<="9:05"*1)*E2:E7,E2:E7,"") IF分は(条件式、真(TRUE)の場合、偽(FALSE)の場合)となります 今回の最小値算出は取引の無かった時間帯(金額が0の値)のデータを除いた最低値の算出になっているので、金額も条件に加えています。 配列で考えるとE列の配列(E2:E7)は 0,0,7900,7800,7950,8000 時間帯指定の(B2:B7>="9:00"*1)*(B2:B7<="9:05"*1)の計算結果は 1,1,1,1,1,1 時間帯の条件だけで計算するとIF分の結果が 0,0,7900,7800,7950,8000 になりMIN(0,0,7900,7800,7950,8000)の計算から最低金額は0になってしまいます 条件式に金額を掛ける事でIF分の計算結果が "","",7900,7800,7950,8000 となり(IF分の計算結果で0は""(NULL)に変換されます) MIN("","",7900,7800,7950,8000)の計算結果として7900が最低値として算出される事になります。 (MIN関数は""は算出対象に含まないため)

colnago98
質問者

補足

ありがとうございました! よくわかりました(^-^) ようやく表が完成できます。 ちなみに、【始値の式】については、あんな感じの理解でよいでしょうか? 【始値の式】(再掲)  INDEX(C2:C7,MATCH(MIN(IF(C2:C7<>0,B2:B7,"")),B2:B7)) (式を分解して考えると・・・)  (1)MIN(IF(C2:C7<>0,B2:B7,""))   C2からC7の中で、数値が0でないものを選び、その時間の中から   最小値を選び出す→9:02が選ばれる  (2)MATCH(MIN(IF(C2:C7<>0,B2:B7,"")),B2:B7)   選ばれた9:02が、B2からB7の中で、何行目にあるかを   表示する→4行目  (3)INDEX(C2:C7,MATCH(MIN(IF(C2:C7<>0,B2:B7,"")),B2:B7))   C2からC7の中で、4行目にある数値を表示する→8000

その他の回答 (3)

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.4

もう少し補足 IF分の条件式は計算結果をTRUEまたはFALSEのみで返します 計算結果が0の場合はFALSE、0以外の場合はすべてTRUEを返します。 今回のように0より大きい最低値算出の場合 (E2:E7>0)と表記するのとE2:E7と表記するのは同じ結果になるため余分な計算式を省いただけです。 金額にマイナスの値がある場合で0より大きいとの条件があった場合には (E2:E7>0)と条件付けが必要になります。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

1月2日の初値(つまり0の最後の行の下の値で宜しいですよね) =INDEX(C:C,MATCH(0,C:C)+1) 最小値(0以外) =MIN(IF(C2:C7=0,"",C2:C7)) Ctrl+Shift+Enter では如何でしょうか。

colnago98
質問者

お礼

INDEXやMATCHの関数を勉強する必要がありそうですね。 たいへん参考になりました。ありがとうございました!(^-^)

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

始値(配列計算) {=INDEX(C2:C7,MATCH(MIN(IF(C2:C7<>0,B2:B7,"")),B2:B7))} 最小値(配列計算) {=MIN(IF((B2:B7>="9:00"*1)*(B2:B7<="9:05"*1)*E2:E7,E2:E7,""))} この表ならこれでできると思うけど、毎回質問の度に表の形式が変化してるようですが、基本的な考え方に大きな違いは無いはずです。 回答で得た数式の意味合いが理解できていれば応用で対応できるはずなのですが、計算式の意味が分からないのであればその旨補足したら詳しく説明をいたしますよ。

colnago98
質問者

補足

早速の回答ありがとうございます。おっしゃっていただいたように計算式の意味がしっかりと分かっていないため、応用ができないのだと思います(^^; 今回の式は、よく知らない関数も出ており、ネットにて調べながら理解したつもりなのですが、下記の考えでよいでしょうか?式が何を意味しているか、分解して考えてみました。 【始値の式】  INDEX(C2:C7,MATCH(MIN(IF(C2:C7<>0,B2:B7,"")),B2:B7)) (式を分解して考えると・・・)  (1)MIN(IF(C2:C7<>0,B2:B7,""))   C2からC7の中で、数値が0でないものを選び、その時間の中から   最小値を選び出す→9:02が選ばれる  (2)MATCH(MIN(IF(C2:C7<>0,B2:B7,"")),B2:B7)   選ばれた9:02が、B2からB7の中で、何行目にあるかを   表示する→4行目  (3)INDEX(C2:C7,MATCH(MIN(IF(C2:C7<>0,B2:B7,"")),B2:B7))   C2からC7の中で、4行目にある数値を表示する→8000 (最小値の式)  MIN(IF((B2:B7>="9:00"*1)*(B2:B7<="9:05"*1)*E2:E7,E2:E7,""))}    最小値の式はIF((B2:B7>="9:00"*1)*(B2:B7<="9:05"*1)は理解でき るのですが、「*E2:E7」を条件に加えることで、「0」が最小値から  省かれてしまうところがよくわかりません。「*E2:E7」は何を意味す るのでしょうか?  たいへんお手数かけて恐縮ですが、ご教授のほうよろしくお願い  いたしますm(_ _)m   

関連するQ&A