• ベストアンサー

配列数式について教えてください

ここでエクセルでの文字列の検索方法をさがしていたらさきほど、ちょうど良くこのような配列数式をみつけました。 =IF(A1="","",MIN(IF(ISNA(MATCH("*"&$H$1:$H$9,A1,0)),10,$I$1:$I$9))) A1セルに、H1からH9の表にあるどれかの文字列を含んだ文字列をいれると対応するI1からI9の表の値を表示するものです。 使われているMINやISNAやMATCH関数はわかるつもりですが、組み合わせるとなんでこんなことができるのか、ぜんぜんわかりません。どなたか解説していただけないでしょうか? http://oshiete1.goo.ne.jp/kotaeru.php3?q=653775

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

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

#2の追加です。 配列数式の「式」の方の解説を読まれる時の一助として。 A1:B7にデータ a 1 b 2 c 3 d 4 a 6 d 6 c 7 を入れて、A1:A7と同じセル数のD1:D7を範囲指定して(ここの点が通常は解説されていないので、仕組みが良く判らない理由の1つと思う。配列数式の結果は1セルに出すので 、演算結果が欲しいのだから、1セルだけ指定で良いのですが、理解のために周り道をしてみてください。) =IF($A$1:$A$7="a",$B$1:$B$7)と入れてS+C+Eを押してください(Shift+Ctrl+Enterを同時に押す)。するとD1:D7に 1 FALSE FALSE FALSE 6 FALSE FALSE となります。 これはD1に=IF(A1="a",B1,FALSE)といれ、D2:D7に複写 した結果と同じです。 =IF(A1="a",B1,FALSE) =IF(A2="a",B2,FALSE) =IF(A3="a",B3,FALSE) =IF(A4="a",B4,FALSE) =IF(A5="a",B5,FALSE) =IF(A6="a",B6,FALSE) =IF(A7="a",B7,FALSE)   です。 その後に、これら7セルに対してsum,max,min,average等を考えるのは、普通の関数と同じだから、理解しやすいと思います。 IF(・・)を外から =SUM(IF(・・))  =MAX(IF(・・)) =MIN(IF(・・)) =AVERAGE(IF(・・)) =COUNT(IF(・・)) などを入れS+C+Eを押す。 すると SUM-->1+6=7 MIN-->1,7の最小1 MAX-->1,7の最大7 AVERAGE-->1,7の平均(1+7)/2=3.5 COUNT-->1,2の2個 となります。    

max_min
質問者

お礼

本当にありがとう御座いました!

その他の回答 (2)

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

エクセルで数を行列的に扱う基礎論を説明します。 その応用として、各セルに対する関数当て嵌めを考える 応用があります。質問は後者でしょうがまず前者のご理解を。 配列数式の作り方 (1)1度のエンタで複数セルに一度に数をセットする方法。 (2)1つずつセルに入力しエンタキーや→や↓キーで複数セルに(但し近接した1列や長方形、正方形型の範囲のデータに限る。)に入力してデータを作る。 (1)でも(2)でも、入力してしまえば、それらの範囲は 配列数式として扱える。また演算の結果で値が出ているセルも 配列数式に含められる。 (1)は珍しいでしょうから、説明します。 A1:A5を範囲指定して、={1;2;3;4;5}でS+C+E (ShiftとCtrlを押しながらENTERキーを押す)。--->縦に1,2,3,4、5が入る。 A1:E1を範囲指定して={1,2,3,4,5}でS+C+E --->横に1,2,3,4,5が入る。 A1:C3を範囲指定して={1,2,3;4,5,6;7,8,9}でS+C+E これで 123 456 789 と入る。 ------(本題) (1)普通は演算は=A1+B1や=A1*B1や=A1/B1のように1セル対1セルの演算を使ってきた。 (2)配列数式はこのA1のところが:が入って複数セル範囲の指定になります。 <加算> (3)=A1:A3+B1は=A1+B1,=A2+B1,=A3+B1のセルの集合になります。 数学の行列では(3,4,5)+(3)はエラーですが エクセルでは同じ数を、補ってくれて、(3,4,5)+(3,3,3)と同じにしてくれます。 (4)=A1:A3+B1:B2は、A3に対する不足分はB1やB2にするわけにもいかず、エラーになります。 =A1:A3+B1:B3は=A1+B1、=A2+B2、=A3+B3の3セルに集まりになります。 (5)(注意)答えを出すセルとして、行列とも、次元数だけのセルを範囲指定してから演算式をいれること。 (6)演算式の入れ方 (A)答えの入るセルを範囲指定して黒く反転させる。 (B)=を入れる (C)範囲指定(被加数範囲) (D)+(演算子)を入れる (E)範囲指定(加数範囲) (F)S+C+E <減算>行列の減算と同じで加算と同じく、対応する行列の 引き算 <乗算> 行列の掛け算と違い対応する行の積のセルの集合です。 A1     B1      =A1*B1 A2  X  B2  --> =A2*B2 A3     B3      =A3*B3 <除算> 乗算と同じく=A1/B1、=A2/B2、=A3/B3 のセルの集まりです。 A1     B1      =A1/B1 A2  /  B2  --> =A2/B2 A3     B3      =A3/B3 のセルの集まりです。 これらのセルの「集まり」に対し、=SUM、=MIN、=MAX, =AVERAGEがどういう意味(数)になるかは判りますね。セル集合全部を対象に考える関数群は判りやすい。         

max_min
質問者

お礼

わかりやすくありがとうございました。

  • Hageoyadi
  • ベストアンサー率40% (3145/7860)
回答No.1
参考URL:
http://pc21.nikkeibp.co.jp/pc21/pc_10/hr_top.htm
max_min
質問者

お礼

ありがとうございました。

関連するQ&A

  • 配列数式を用いたINDEX関数について教えてください

    INDEX関数について教えてください。 先日来、配列数式について教えていただいている者です。 相場の始値を表示させる式で、INDEX関数を使うと良いと教えていただきました。その際、同じ日にち内でデータを拾う形で質問し、回答していただきましたが、その後、自分で、異なる日にちも含めて表示させようとしたところ、「0」の表示となってしまいました。 式は日にちを変えただけなのに、なぜエラーとなってしまうのかがどうしても分かりません。どうか教えてくださいm(_ _)m 表を添付しましたが、式が小さくてみずらいかと思いますので、下記に表示させていただきます。 【2008/1/4の式】   INDEX($C$2:$C$13,MATCH(MIN(IF(($A$2:$A$13="2008/1/4"*1)*($C$2:$C$13<>0),$B$2:$B$13,"")),$B$2:$B$13)) 【2008/1/7の式】 INDEX($C$2:$C$13,MATCH(MIN(IF(($A$2:$A$13="2008/1/7"*1)*($C$2:$C$13<>0),$B$2:$B$13,"")),$B$2:$B$13))

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

    エクセルの関数について お世話になります。 エクセルの関数について質問をさせて頂きます。 チェック用の数式として、下記のような場合、 D2とH行に同じ数字があった場合はA2に○を この場合、 =IF(ISNA(MATCH(D2,H:H,0)),"","○") このような数式を使っております。 この数式を少しアレンジして、 D2とH行に同じ数字があった場合はA2に○を、 D2とI行に同じ数字があった場合はA2に×を、 このような数式を作りたいと考えております。 また、 I2とD列に同じ数字があった場合、J2に空白、 同じ数字が無かった場合に×が入る数式として、 [J2]=IF(ISNA(MATCH(I2,D:D,0)),"×","") このようなものを使っています。 こちらも少しアレンジをして、 I2もしくはH2とD列に同じ数字があった場合、J2に空白、 同じ数字が無かった場合に×が入る。 このような数式を作りたいと考えております。 こちらの2点、中々良い数式ができずに悩んでおります。 どなたか、エクセルの関数に詳しい方、良いアドバイスを 頂けると嬉しいです。 どうぞよろしくお願い致します。

  • 配列数式って何ですか??

    きのうは、ある列において偶数行だけの合計を求めたいときの計算式を教えてもらいました。 数式は以下のようになるそうです。 {=SUM(IF(MOD(ROW(A1:A10),2)=0,A1:A10,""))} (ありがとうございました。) しかし、そこで出てきた「配列数式」というものが何なのか分かりません。上では{}でくくられた部分だという事はわかるのですが、どうして一番初めと終わりに{}があるのか、たとえば比較として、上において{}がない数式ではどのような計算がされてしまうのでしょうか。 また、{}の位置がSUMの後にあるとき、 =SUM{(IF(MOD(ROW(A1:A10),2)=0,A1:A10,""))} なんかはどんな計算をしていることになるのでしょうか。 配列数式の計算手順がイメージできないのです。 どなたか教えて下さい。

  • 配列数式がうまくいきません

    現在、部品の管理をする為に配列数式をたてて行っています。 集計表にのセルに以下のような式が入っています。 {=SUM(IF($M$10:$M$500=200711,IF($S$10:$S$500={10,11},$T$10:$T$500,0)))} M列:客先の希望納期(2007年11月) S列:こちらの納品月(10月、11月) T列:納入数量 今は自分で行っておりますので年が改まった場合などに式(希望納期月)を書き換えておりますが、担当者が変わると配列数式を知らない方が行うこともありえるので、あるセル(A1)を参照する形で式を以下のように変更してみました。 このようにすればA1のセルの部分を変更するだけでいけると考えました。 {=SUM(IF($M$10:$M$500=VALUE(A1)&11,IF($S$10:$S$500={10,11},$T$10:$T$500,0)))} しかしながら、この式ではうまく行きません。 この計算式のどこがまずいのでしょうか。 よろしくお願いいたします。

  • 3千行以上あるExcel表の一つの列を配列数式に

    3千全行以上あるExcel表の一つの列を配列数式にしたいです。 {=SUM(IF(A:A="みかん",B:B,))}のようなやつ。 色々試しましたが、配列数式を使わないと出したい値を出せませんでした。 3千行あるのですが、めちゃくちゃ重くなります。 重くならずに済む方法はありますでしょうか。 やはり配列数式を使うとしょうがないのでしょうか。

  • 配列数式での平均値

    こんにちは。 今、エクセルで配列数式を使って平均値を出す作業をしています。 列Aには男女別を示す1、2が入力されており、 列B以降にはいろいろなデータが入っています。 それらデータにおける男女別の平均値を出したいので 配列数式を使って求めるまでは良かったのですが、 どうやら、列B以降の空欄になっているセルも 0として計算されてしまっているようなのです。 (普通のaverageと同様に)空欄を数に入れないで計算させるには どのようにしたらよいのでしょうか? ちなみに今使っている配列数式は、 {=average(if(A1:A10=1,B:B10,""))} です。

  • Excel 同じ内容の文字列セルをまとめる

    お世話になります。 文字列の入った複数セルの中から 同じ内容のものがある場合 これらを配列数式データ上でまとめたいと思ってます MATCH構文を使って MATCH($A:$A,$A:$A,0)として 自らと同じものが何処に最も早く現れたかの配列数式データを作り これをソートして その後の主処理のデータにしたのですが MATCH構文かたくじ式なのでしょうか 物凄く遅いのです。 で本題なのですか MATCH構文を使わず 軽いCPU負荷で 配列数式上にある複数文字列データの同じものをまとめたいとき どうすればいいでしょうか? ご教示お願いします。

  • エクセル関数で列を挿入し同時に数式の列もずらしたい

    数式で =IF(COUNTIF(E1:H1,1)=0,1,IF(MATCH(1,E1:H1,1)=1,1,"")) をJ1に設定してます。 その後 J列に列挿入すると K1に=IF(COUNTIF(E1:H1,1)=0,1,IF(MATCH(1,E1:H1,1)=1,1,"")) がコピーされますが (E1:H1)を列挿入することで(F1:I1)にすることは可能でしょうか 列を増やすことが多々あるため挿入する列数の応じた ずれ方をしていきたいです。 何分に勉強不足のためご教授よろしくお願いします。

  • エクセル:配列数式やINDIRECT(CxRy,1)の挙動について

    modesut様がQNo.2487818でされている質問に答えられればと 頭を捻ったのですが (http://oshiete.coneco.net/kotaeru.php3?q=2487818) データはQNo.2487818のを流用させて頂くとして =INDIRECT("C10")とか =INDIRECT("c"&10)とかすると チャンと参照して6と応えるのに =INDIRECT(CONCATENATE("r",3,"c",10),1)とか (#REF!) =INDIRECT(TEXT(CONCATENATE("r",3,"c",10),"@"),1)とか (#REF!) =INDIRECT("c"&(MATCH(1,1*(D2=$A$2:$A$11)*(A2=$B$2:$B$11))))とか (#VALUE!) =INDIRECT("c"&MATCH(1,1*(D2=$A$2:$A$11)*(A2=$B$2:$B$11)))とか (#N/A!) =INDIRECT(CONCATENATE("R",3,"C",MATCH(1,1*(D2=$A$2:$A$11)*(A2=$B$2:$B$11))),1)とか (#N/A!) =INDIRECT("c"&TEXT(MATCH(1,1*(D2=$A$2:$A$11)*(A2=$B$2:$B$11)),"@"))とか (#N/A!) エラーに成ってしまいます 何故でしょうか? もう一つ 例えば上の例を流用して TRANSPOSE((D2=$A$2:$A$11)*(A2=$B$2:$B$11)*({0,1,2,3,4,5,6,7,8,9,10}))と ($D$2:$D$11)を結合して10行2列の配列を合成できたら データベース構文のCriteriaにも応用できそうだし 何よりVLOOKUPやHlookupのリストとして使えるので 便利そうだから出来ないのかな? と探したのですが見付けられませんでした 何か良い方法ありませんか? あと 文字列の1文字ずつを可変長の配列定数の要素の1つ々に分解するにはどうしたらいいでしょうか? (文字列は可変長な為) 例 text     → {t,e,x,t} ストリングス → {ス,ト,リ,ン,グ,ス} "stringth" → {s,t,r,i,n,g,t,h} 注)全てマクロ系は使わずにお願いします m(_ _)m

  • 《エクセル》配列数式について教えて下さい

    いつもお世話になります。 先日、このページで質問した時、配列数式について教えていただいて、例をもとに自分で作成しようとしたのですが、うまくいきません。 集計表A列とB列に項目行があり、別のファイル[Book1.xls]のSheet1にあるデータを羅列した表のA列とB列にある項目の2つのセルの内容に合致するデータ数をカウントする場合 =COUNTA(IF('[BOOK1.xls]Sheet1'!$A$2:$A$2000=$A1*'[BOOK1.xls]Sheet1'!$B$2:$B$2000=$B1)) と入力して、Shift+Ctrl+Enterキーを打ったのですが、「入力した数式にはエラーがあります」のエラーメッセージが出てきて、ヘルプを読んでみても解決方法がわかりませんでした。 お手数ですが、ご教授宜しくお願い致します。

専門家に質問してみよう