エクセルで項目名を指定せずに数を数える方法をおしえて下さい。


   A   B   C   D
1 いちご りんご ぶどう めろん  
2 りんご みかん めろん いちご
3 みかん いちご みかん みかん
4 すいか     いちご

このような表を別のシート、もしくは別の列に

4 いちご
4 みかん
2 めろん
2 りんご
1 すいか
1 ぶどう

このように数えたいです。項目名を「いちご」等指定することなく、
例えば「さくらんぼ」という項目が新たに入っても対応するようにしたいです。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/10/24 11:35:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:kumaimizuki No.1

回答回数614ベストアンサー獲得回数31

ポイント27pt

   A   B   C   D

1 いちご りんご ぶどう めろん  

2 りんご みかん めろん いちご

3 みかん いちご みかん みかん

4 すいか     いちご


と入っていて、


   A   B   C   D

11 いちご

12 みかん

13 めろん

14 りんご

15 すいか

16 ぶどう


といった形で、B列に個数を求めたい場合

B列にcountifという関数を埋め込めばできますよ。

例えば、B11の場合


=COUNTIF($A$1:$D$4,A11)


とすれば、いちごの数を数えてくれます。

$A$1:$D$4 がカウントする範囲の指定。

A11 がカウントする項目の条件の指定です。


B11に関数を埋め込んだら、あとは下のセルにコピーすれば数えられます。

また、A列の名称を変更すれば、自動的に数を数えなおしてくれますよ。

id:eco_clover

丁寧な回答ありがとうございます。

そうすると、A列に入る項目(いちご等)は自分で拾い出さなければならないということですね。

表から重複しない項目の拾い出しを行なうところから自動で行なうことはできないでしょうか?

2007/10/17 11:47:08
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント27pt
Sub Macro1()
    s1 = "Sheet1"   '対象があるシート
    s2 = "Sheet2"   '結果をのせるシート
    
    r1 = 1          '開始 行
    c1 = 1          '開始 列
    r2 = 4          '終了 行
    c2 = 4          '終了 列
    
    a = 0
    
    For b1 = r1 To r2
        For b2 = c1 To c2
            c = Worksheets(s1).Cells(b1, b2)
            If c <> "" Then
                f = 0
                For d = 1 To a
                    If Worksheets(s2).Cells(d, 2) = c Then
                        Worksheets(s2).Cells(d, 1) = Worksheets(s2).Cells(d, 1) + 1
                        f = 1
                        Exit For
                    End If
                Next d
                If f = 0 Then
                    a = a + 1
                    Worksheets(s2).Cells(a, 1) = 1
                    Worksheets(s2).Cells(a, 2) = c
                End If
            End If
        Next b2
    Next b1
    
    'ソートする。
    Worksheets(s2).Columns("A:B").Sort Key1:=Range("A1"), Order1:=xlDescending, Key2:=Range("B1"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal

End Sub

マクロを作ってみました。

変更箇所は

s1 = "Sheet1" '対象があるシート

s2 = "Sheet2" '結果をのせるシート

r1 = 1 '開始 行

c1 = 1 '開始 列

r2 = 4 '終了 行

c2 = 4 '終了 列

です。

集計は 別シートに出すようにしましたので、そのシート名と 表があるシート名を指定してください。

あと それぞれ行数と列数も 指定してください。

id:SALINGER No.3

回答回数3454ベストアンサー獲得回数969

ポイント26pt

Nigitamaさんの言われてるDictionaryオブジェクト使ってみますと・・・

Sub UseDic()
    Dim s1, s2 As String
    Dim myDic As Object
    Dim myKey, myItem
    Dim v1, v2
    Dim i As Long
    
    s1 = "Sheet1"   '対象があるシート
    s2 = "Sheet2"   '結果をのせるシート
    
    '集計前の表を指定してください。
    v1 = Worksheets(s1).Range("A1:D4").Value
      
    Set myDic = CreateObject("Scripting.Dictionary")
        
    For Each v2 In v1
        If Not v2 = Empty Then
            If Not myDic.exists(v2) Then
                myDic.Add v2, 1
            Else
                myDic(v2) = myDic(v2) + 1
            End If
        End If
    Next
    
    myKey = myDic.Keys
    myItem = myDic.Items
    For i = 0 To UBound(myDic.Keys)
        Worksheets(s2).Cells(i + 1, 1).Value = myKey(i)
        Worksheets(s2).Cells(i + 1, 2).Value = myItem(i)
    Next
    
    'ソートは一緒
    
    Set myDic = Nothing
End Sub
  • id:taknt
    マクロを使えば簡単。

    普通は
    =COUNTIF(A1:D4,"いちご")
    とか やるけどね。

    だけど これだと いちご って指定しないとダメだから。
  • id:rikuzai
    項目の拾い出しとカウントを同時に行うとしたら、
    一般機能ではピボットを使うくらいでしょうか。
    それでも元データを一列にまとめる工数が必要なので、
    (逆に言えば元データが一列になっていればピボットで解決可)
    それも自動で、となるとマクロ組んだ方がよさそうな気がします。
  • id:Nigitama
    ひょっとしてVBAのDictionaryというやつで実現可能かも?
    http://q.hatena.ne.jp/1149753451

    あまり自信ないけど参考程度に。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません