• ベストアンサー

EXCELで、データの種類の数を求めるのに、

EXCELで、データの種類の数を求めるのに、 =COUNT(INDEX(1/(MATCH(A1:A10,A1:A10,)=ROW(A1:A10)),)) という数式で求める事ができるとQ&Aがありました。 この中のINDEX関数の意図がよくわからないのですが、 どなたか解説していただけませんか?

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

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

>「なぜ1(どんな数字でもよい)で割った数値をCOUNT」 >そこも理解できていないんです。 MATCH(A1:A10,A1:A10,)=ROW(A1:A10)),) 上記の数式の部分は、A1:10セルに入力されたそれぞれの値がA1:A10セルの何番目に出てくるか調べ、それが行番号(最初に出現するデータの場所)と等しい場合TRUEを返します(最初に出てくるデータのみTRUE,2つ目以降のデータはFALSEを返す配列を取得しています)。 これを1で割ると、TRUEは「1」、FALSEは「0」として演算されますから、演算の結果は1と#DIV/0エラーが返されます。 この1とエラーの配列の中の数字の数をカウントすれば重複のないデータ(1つ目のデータ)の数を求めることができるわけです。 すなわち、1(数字なら何でもよい)で割り算したのはFALSEの結果をエラー値にしてカウントしないようにした工夫なわけです(たとえば1を掛けるような演算した場合はFALSEが0となりこれもカウントしてしまいます)。 ちなみに、通常の関数では、範囲内にエラー値を含む数式ではエラーを返すのが一般的なのですが、COUNT関数はエラーを無視して計算するという特徴を利用しています。

tana59
質問者

お礼

大変良く分かりました。 まさに技ですね。 ありがとうございました。

その他の回答 (2)

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

ある列に出てくるデータの値の種類を勘定するには =SUMPRODUCT((1/COUNTIF($A$1:$A$10,A1:A10))) の方が易しいのでは。 逆数を取るのは1つのアイデアで、これを全セル加えると、求める件数になるのは良く使われる。 作業セル1列使うなら、これ以上の難しい技巧は要らない。 INDEX関数の利用については、既にご回答があるが、COUNTIF関数で第2引数で多数セルを対象にしているので、技巧を凝らさなければ、配列数式になるところを、それ(配列数式)を避けるにはSUMPRODUCT関数もよく使われる。 ーー 質問の式の方だが A列   B列 a TRUE s TRUE d TRUE f TRUE a FALSE s FALSE d FALSE a FALSE s FALSE x TRUE B列は =MATCH(A1,$A$1:$A$10,)=ROW(A1) これを=COUNT(B1:B10)すると0 COUNT関数は、数値のセルをカウントするので当たり前なのだが。 そこで工夫して、H列に =IF(MATCH(A1,$A$1:$A$10,)=ROW(A1),1,"") H列 1 1 1 1 1 とすると =COUNT(H1:H10)は5 TRUE、FALSEのセルではカウントしてくれなくて、1と空白なら1をカウントしてくれて正しい件数になる。 これを私が上記に書いたような作業セル10セル使うかつIF関数を使うのでなく、 INDEX(1/(MATCH(A1:A10,A1:A10,)=ROW(A1:A10)),)) で行ったというのが、#1のご回答の主旨だと思う。

tana59
質問者

お礼

{=COUNT(MATCH(A1:A10,A1:A10,)=ROW(A1:A10))}が求める答えにならない理由も良く分かりました。 ありがとうございました。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

INDEX関数の部分はその中の「1/(MATCH(A1:A10,A1:A10,)=ROW(A1:A10))」の配列を範囲として認識させるための処理です。 すなわち、「INDEX(配列,0)」のようにINDEX関数の第2引数を0または省略する数式にすると配列をそのまま範囲として認識しますので(関数によっては範囲として使えないときもある)、配列数式を入力するのに必要なCtrl+Shift+Enterの処理をする必要がなくなることです。 すなわち、以下の式を入力してCtrl+Shift+Enterで確定すれば、全く同じ計算結果を得ることができます。 =COUNT(1/(MATCH(A1:A10,A1:A10,)=ROW(A1:A10))) #INDEX関数よりも、なぜ1(どんな数字でもよい)で割った数値をCOUNTしていることのほうがわかりにくいような気もするのですが・・・

tana59
質問者

お礼

ありがとうございます。 INDEXはそういう役割だったんですね。 「なぜ1(どんな数字でもよい)で割った数値をCOUNT」 そこも理解できていないんです。 {=COUNT(MATCH(A1:A10,A1:A10,)=ROW(A1:A10))} で、最初の種類だとtrue、既出だとfalseでcountすれば種類の数が求まるように思うのですが、 結果は0になってしまいます。