• ベストアンサー

エクセルのカウント

宜しくお願いします。 あるデータをCSV形式で抽出したのですが、以下のような状態になっています。 / A B 1 a Windows 2 a Linux 3 a Sun 4 b Windows 5 b Sun 6 c linux 7 c Sun 8 d Windows 12345678は行 ABは列になります。 ここで抽出したいのはA1:A8の間に何種類の文字があるかです。 この場合は、abcdの4種類なので「4」という数値が出て欲しいのです。 データ件数が13000行ほどあるので関数やVBでどうにかならないかなと思い、質問しました。 宜しくお願いします。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

以下の関数(配列)で如何でしょうか。 {=SUM(1/COUNTIF(A1:A1300,A1:A1300))} { と } は実際には入力する必要は無く、式の入力の最後にShiftキーとCtrlキーの両方を「押しながら」Enterキーを押して下さい。

ark_kiss
質問者

お礼

回答ありがとうございます。 No.1の方と同じ数値が出ました。 ただし、実は一部数値が13000件で、全データをCSVにエクスポートした結果、34000件に膨れ上がりました。 質問文ではB列までしかありませんが、実際データは29列まであったり・・・。 検索結果が出るまで、こちらも数分かかってしまうので、ハングしてしまわないか不安でした。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

まだ、オープンされているようですね。 13000行ですと、Excelの Version(2000以下) では、配列にエラーが使えない時があります。したがって、Version を示されないときは、VBAがベストだと思います。BLUEPIXYさんが、Dictionary を使っていますので、こちらは、ユニーク・アルゴリズムを使います。 該当する列を選択してから、マクロを起動します。 '<標準モジュール登録> Option Explicit Sub UniqCount() Dim N As Long Dim i As Long, j As Long Dim S As Long Dim Flg As Boolean Dim cnt As Long Dim myData() Dim a()   '該当する列を選択してから、マクロを起動する   N = Range(Cells(1, ActiveCell.Column), _    Cells(65536, ActiveCell.Column).End(xlUp)).Count   ReDim myData(1 To N)   For i = 1 To N    myData(i) = Cells(i, 1) '先頭はフィールド名ではないとします   Next i   Flg = False   ReDim a(1 To N)   i = 0   For i = 1 To N    Flg = True 'sentinel    For j = 1 To S      If a(j) = myData(i) Then       Flg = False       Exit For      End If    Next j    If Flg = True Then      S = S + 1      a(S) = myData(i)    End If   Next i   For i = 1 To N    If a(i) <> Empty Then      cnt = cnt + 1    Else      Exit For    End If   Next i   MsgBox cnt End Sub

ark_kiss
質問者

お礼

オープンし続けて申し訳ありません。 こう言ってしまうのは、大変恐縮なのですが・・・。 いろんな関数、VBによる結果を比類して、抽出された数値の精度を上げようかと思っていました。 皆様が提案された関数やロジックによって、特定の結果が出ることが確認されました。 この場をお借りして、皆様にお礼を申し上げます。 ちなみに、34000件から抽出された数値は4896です。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

こんにちは。maruru01です。 >データ件数が13000行ほどあるので ということだと、SUMPRODUCTやSUMを使用した数式は、配列数式なので重くなるかも知れませんね。 重くなる場合は、No.3の方のようにユーザー定義関数を使うか、作業列を使用した方が無難かも知れません。 以下、作業列を使用する方法の1つです。 仮に作業列をC列とすると、C1に、 =COUNTIF($A$1:A1,A1) と入力して、下の行へコピーします。 そうしたら、 =COUNTIF(C:C,1) でデータ種類数が出ます。 作業列は離れていても構わないし、非表示にしておいてもいいですよ。

ark_kiss
質問者

お礼

回答ありがとうございます。 No.1-2様と同様の数値が出ました。 ただし、やはり数が34000件ともなると、手動の部分(コピー)で時間をとられてしまいます。 作業列は、仰るとおり離れた場所での作業となりました。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3です あと、もう一つ注意を忘れてました。 COUNTIFによる方法は、Aとaを区別しませんが kindは、区別します。 これは、利点でもあり欠点でもあります。

ark_kiss
質問者

お礼

区別に関しては・・・。 公表してしまうと、A列に出てくるデータはネットワーク監視用のサーバから引き抜いてきた、クライアントのドメインを絡めたフルコンピュータ名です。 その為、大小文字を区別しなくても大丈夫です。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

前にOKWebで見た方法は =SUMPRODUCT(1/COUNTIF(A1:A8,A1:A8)) だけど、1/n*nで誤差がでたりしないのか不安だから 関数を作ってみました。 =kind(A1:A8) のように使います この方法の利点は、途中に空白があっても(無視するので)良いこと ---------------------------------------------------- Public Function kind(r As Range) '指定された範囲のデータの種類を数える Dim x As Range Dim aDic Set aDic = CreateObject("Scripting.Dictionary") For Each x In r If (Not x.Value = Empty) And (Not aDic.Exists(x.Value)) Then '中身がない、重複する時は登録しない aDic.Add x.Value, x.Value End If Next kind = aDic.Count End Function

ark_kiss
質問者

お礼

回答ありがとうございます。 自分で関数を作るというのは盲点でした。 BottunによってVBを動かして抽出するか、通常の関数だけとしか考えていなかったです。 参考になります、ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

=SUMPRODUCT(1/COUNTIF(A1:A13000,A1:A13000))

ark_kiss
質問者

お礼

回答ありがとうございます。 No.2の方と同じ数値が出ました。 ただし、実は一部数値が13000件で、全データをCSVにエクスポートした結果、34000件に膨れ上がりました。 質問文ではB列までしかありませんが、実際データは29列まであったり・・・。 検索結果が出るまで、数分かかってしまうので、ハングしてしまわないか不安でした。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルで・・・・・

    エクセルにABCDの4種類で1つの数字グループが大量にあります(300位) この中から其々の条件にあった2種類の数字群を抽出したいのです。 条件(1)はA>DでA+40>BとD-20<Cのものがいくつあるか 条件(2)はA<DでA-40<CとD+20>Bのものがいくつあるか です。 コピペで出来る回答お待ちしております。

  • エクセル関数(SUMPRODUCT)について教えてください。

    SUMPRODUCTを使って、件数を出しています。   A    B(抽出条件を入力) 1都道府県  ● 2職業    ● 3性別    ● 4購買日   ●    A    B    C   D     11 都道府県  職業   性別  購買日   12 東京    会社員  男   20080901  13 ・      ・   ・    ・     14 ・      ・   ・    ・     15 ・      ・   ・    ・     上記のような表を作り、A11:E100までデータが入っています。 B1:B5に条件を入れて、C1:C4に =SUMPRODUCT(($A$12:$A$100=$B$1)*($B$12:$B$100=$B$2)*($C$12:$C$100=$B$3)*($C$12:$D$100=$B$4)*1) で件数をカウントしています。 抽出条件をすべて指定すると、件数が出てきますが、特に指定しないで 空欄のままで件数をカウントする方法はないでしょうか? (たとえば、職業を絞らないでほかの条件だけで抽出するとか) 何か解決策を教えてください。

  • Excel 重複データーのカウント

    Excelの関数に対する質問です。   =COUNTIF(A1:E1,A1) はA1と重複するデータを求めますが、この方法ではなく A B C D E 0 A A B C D 1 A A B C C 2 このように 行に重複するデータのデータ件数をいっきに求められる関数があるのでしょうか? それともそれぞれのデータを=COUNTIF(A1:E1,A1)~でそれぞれもとめた後、それを合計しなければならないのでしょうか? よろしくお願いします。

  • excel 2010 VBAについて質問です

    複数(約2000ファイル)のcsvファイルのC列だけを抽出してまとめるVGAコード? をしりたいのですがなにか方法はないでしょうか。 例 ファイル名が1.csv~100.csvのファイル 1.csvのc1~c100をa1~a100 2.csvのc1~c100をb1~b100 100.csvのc1~c100をn1~n100 に抽出するようなことをしたいです。 1.csv 2.csv 抽出されたファイル.csv ABCDEF ABCDEF ABCDEF 111 112 12 121 122 12 131 132 12 ・・・ ・・・ 12 ・・・     ・・・ ご回答よろしくお願いいたします。

  • エクセルでの部分データ摘出(?)について質問です

    はじめまして。 在庫管理ソフトから吸い出したエクセルデータを 見やすい表にするために配置換えをしたいと思い いろいろ調べてみたのですが分からなかったので質問させて頂きます。 まず摘出したエクセルデータは下の表のような感じで AB-01-C1L→品番(AB-01)・カラー(C1)・サイズ(L) といった配置になっています。 この部分は同じセルにあります。 品番 /カラー /サイズ  | 在庫数 ---------------------- AB-01-C1L | 10 ←A AB-01-C1M | 52 ←B AB-01-C2L | 03 ←C AB-01-C2M | 20 ←D 上の表のABCDの所を下の表のABCDにあてはめて見やすくしたいと思っています。 ┌───┬──┬──┬──┐ │AB-01│   │M  │L  │ │___│__│__│__│ │品名 │白  │B  │A  │ │    │黒  │D  │C  │ 【環境】 Windows XP Office Excel2003 お手数をおかけしますが、よろしくお願い致します。

  • SQLのカウントについて

    質問です。 テーブルAとBに下記データが存在した場合、AにいてBにいなかったデータは「0」AにいてBにもいた場合のデータはその件数を抽出するSELECT文を教えて下さい。 テーブルA   テーブルB A1       A1 A2       A1 A3       A1 A4       A3 A5       A4 ---------- 結果 ---------- A1 3 A2 0 A3 1 A4 1 A5 0

  • エクセルで一部の文字を置き換えたい

    A列の中の特定の文字をB列にある文字に置き換えたいのですが、 どのようにすればよいでしょうか? 例えば、一行目はab123d となる様に、B列の文字をA列のCの部分と置き換えたいのです。  |A |B --|-------|---- 1 | abCd |123 2 | abCd |456 3 | abCd |aaa 4 | abCd |bbb 5 | abCd |ccc どなたか解る方が居りましたら教えてくれないでしょうか。 宜しくお願いします。

  • エクセル2000(マクロ)を使っていくつかの処理を一度にしたい・・・

    A列に下記の例のようなデータがあり、件数は毎日変わります。 マクロに登録したいのは (1)B列にはA列の最終行まで、(例えば)1、2と繰り返し入力させたい (2)B列に2のデータが入っているものだけを抽出し、抽出したA列のデータだけをコピーし、別のシートに貼り付けたい というところまでを一つのマクロで処理させたいのですが、うまくいきません。 A列のデータ数は必ず偶数で、数字のみで出てきています。貼付け先は日々のデータを月ごとに表にしていくため、毎日変わります。 ※土日祝日分はデータがでてきませんが、項目には記載がありますので、土日祝日は飛ばさなければいけないようになっています。 別シートは行の項目が日付で、列に抽出したデータを入れるようなレイアウトになっています。 A列   B列 1    1 1    2 2    1 0    2 10    1 2    2 13    1 2    2 ちなみに私が取得するデータはA列のデータだけなので、B列に入れるデータは1、2でなくてもなんでも大丈夫です。また処理や他にいい考え方等があれば教えてください。 宜しくお願いします。

  • 不等式の証明

    不等式の証明の問題で、 絶対値が1より小さい4つの実数a,b,c,dに対して、次の不等式が成り立つことを示せ。というものがありました。(1),(2)と2問あって (1)はa+b<1+abの証明でした。 これは(右辺)-(左辺)をして(a-1)(b-1)>0となり、証明できました。 (2)は(1)を利用して示せ。となっており (2)はa+b+c+d<3+abcdの証明でした。 (1)よりa+b<1+abなのでc+d<1+cd 辺々加えてa+b+c+d<2+ab+cd ここまではできたのですが、ここからどうやって右辺を3+abcdに するのかどうしてもわかりません。 答えにはa+b+c+d<2+ab+cd            <2+(1+abcd)            <3+abcd と書かれていたのですがどうしても    <2+ab+cd          ↓    <2+(1+abcd) が分かりません。教えてください!            

  • エクセル グループごとに一つのセルに纏める方法

    教えて下さい。 エクセル2003で仮に以下のような表があるとします。 「1」「2」 あ  A あ  B あ  C い  A い  B う  A う  B う  C う  D 別のシートのセルでも、同一セルでもいいのですが、 「1」「2」 あ  ABC い  AB う  ABCD いう風にグループごとにひとつのセルにデータを纏めたいのですが、 何かよい方法はありませんでしょうか? あまりエクセルが詳しくありません。 宜しくお願い致します。

専門家に質問してみよう