• 締切済み

教えて下さい!!

重複してない個数を数えたいのですが、例としてA1:A100までいろいろな数字と「***」が入力されているとしてB1に「=1/COUNTIF($A$1:$A$100,A1)として下までコピーし、SUMで足した個数が重複してない個数となりますが、どうもきれいな数字にならなくて困ってます。 (12.78659)とか・・・。これはどうしてでしょうか?こういうものなんでしょうか。。。他に重複してない個数を数える数式があれば是非、 教えて欲しいです。拙い説明ですみませんが宜しくお願い致します。

みんなの回答

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

質問者が混乱するといけないので参考までに補足します。 たとえば、No6のYON56さんの回答では、基本的に質問者が提示されている数式と同じことをしていますので、当初の質問の半端な数字になる問題(おそらくデータ内に文字列が混入しているため)を解決できません。 すなわち、データ内に「***」が含まれているセルをCOUNTIF関数で計算すると、文字列もカウント対象になりますので、たとえば文字列がこのセルより上にあると「***」が初めてのデータとならず、正しくカウントされないことになるわけです。 もし補助列を使って計算するならNo3の回答の「「=IF(A1="***","",COUNTIF($A$1:$A1,A1))」 として「***」の有無を別途数式で求めて加算するような手順になります。 ただし、この方法でも、「*」や「***」など複数のワイルド文字記号がセルに入力されていると、これらは同じ文字としてカウントしますのでうまく対応できません。 いずれにしろ、このようなワイルドカード文字と認識されるような文字列をセルに入力する場合は、すでに回答したように半角でなく全角で入力することをお勧めします。

tomota0130
質問者

お礼

本当にご親切にありがとうございます<(_ _)> 半角のアスタリスクは全角に直すか、もしくはあらかじめ空白セルに しておいてカウントするか、自分の納得いく手段でやってみようと 思います!!頑張って精進します。 お世話になりましたm(__)m

回答No.6

セルB1に次式を入力してください。 =Countif(A$1:A1,A1) これをコピーして、B2:B100に貼り付けます。 重複してない個数を表示したいセルに次式を入力します。 =Countif(B1:B100,1) B列の表示を見せたくないときは、B列を選択し右クリックにて[表示しない]を選択します。

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

>データがすべて文字列(人名とか)と「***」だったら、「***」の個数も含め、上記の数式をどう変えたら、重複してない個数を返すんでしょうか? 「*」や「***」などワイルドカード文字を検索するときは、文字列との区別に工夫が必要になります。 たとえばMATCH関数を使った配列数式で、半角のアルタリスクを全角に変更してその重複のない個数を求めるような式になります。 =COUNT(1/(MATCH(JIS(A1:A10)&"",JIS(A1:A10)&"",0)=ROW(A1:A10)))-(COUNTA(A1:A10)<>ROWS(A1:A10)) ちなみに、後半の「-(COUNTA(A1:A10)<>ROWS(A1:A10))」の部分は空白セルがある場合にカウント数を補正するための数式です。 ご希望にしたがって、「*」や「***」などを含むデータから重複のないデータの個数をカウントするための配列数式を提示してみましたが、このようにわかりにくい数式にしなくてもよいように、半角のアスタリスクなどの特殊文字はセルに入力しないことをお勧めします(普通の文字列なら、空白セルを含む場合でも、もっと簡単なSUMPRODUCT関数で表示できます)。

tomota0130
質問者

お礼

繰り返しの質問にご丁寧に回答頂きありがとうございました。 上記の式で、うまくいきました!! 自分では、こんな数式を出せないのですごいなと思いました。 すごく、ためになりました。 ありがとうございました<(_ _)> 感謝です☆

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

>もし、ご面倒でなければ上記の式の説明をお聞きしたいのですが・・・。 かなり特殊な関数の使い方を組み合わせて利用しているので、わかりにくいかもしれませんが、簡単に説明すると、FREQUENCY関数は区間配列の数字の出現頻度を返す数式で、データ範囲にそれぞれの数字がいくつあるか返す数式です(ヘルプ参照)。 したがって、区間配列の初めての数字はデータ配列にあるので必ずカウントされますが、区間配列に同じ数字があると、2回目からカウントは0となります、 「1」をこの配列で割り算すると、配列内のデータが0の場合はエラー値となり、数字の場合はその数値になります。 最後に、この配列の中の数値の数をCOUNT関数で数えています(COUNT関数はエラー値を無視します)。 後半のSUMPRODUCT数式は「(A1:A10="***")*1」でA1:A10セルに「***」の文字列があれば「1」なければ「0」が返る配列を取得し、その中の最大値(1つでも1があれば1、1つもなければ0)を求めていることになります。 どちらかというと、2つ目に回答したSUMPRODUCT関数のほうが元の式に近い(元の式を補助列を使わずに1つの式にした)のでわかりよいと思います(この数式でもデータ範囲に文字列が混入していなければ正しい値が返ると思います)。

tomota0130
質問者

補足

ありがとうございます!!いろいろ調べた他のサイトのどの説明よりも一番解りやすかったです☆大変、勉強になりました。ただ、ひとつ気になるのですが、FREQUENCY関数は数字を返すんですよね。データがすべて文字列(人名とか)と「***」だったら、「***」の個数も含め、上記の数式をどう変えたら、重複してない個数を返すんでしょうか? 質問ばかりで本当にすみません。とても気になるので教えて頂ければ幸いです。どうか宜しくお願いします<(_ _)>

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

一案ですが 「=COUNTIF($A$1:$A1,A1)」 或いは 「=IF(A1="***","",COUNTIF($A$1:$A1,A1))」 と入れて下までコピィ COUNTIF関数で、B列が 1 の数を数えては如何でしょうか。

tomota0130
質問者

お礼

早速の回答、ありがとうございます!! こういった数式のやり方もあるんですね。とても参考になりました!! 本当に助かりました。ありがとうございました<(_ _)>

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

参考までに。 上記の式はデータ範囲に空白セルや文字列データがあり、数字と***だけの種類を求める数式を提示しましたが、A1:A100セルのデータ範囲に空白セルや文字列データがないなら、単純に以下の式でカウントできます。 =SUMPRODUCT(1/COUNTIF(A1:A100,A1:A100))

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

セルにワイルドカードで使用する「*」が入力されていると、すべての文字列がカウント対象になりますので、間違えた答えを返す可能性があります(*の右のB列の値を確認してみてください)。 数字と「***」以外の文字列が入力されないなら、たとえば以下のような数式で異なる数字の種類と「***」の数がカウントできます。 =COUNT(1/FREQUENCY(A1:A10,A1:A10))+SUMPRODUCT(MAX((A1:A10="***")*1))

tomota0130
質問者

補足

ありがとうございます!!上記の式できれいな数字で個数が出ました! もし、ご面倒でなければ上記の式の説明をお聞きしたいのですが・・・。すみません、お手数おかけします<(_ _)>どうか宜しくお願いします。

関連するQ&A