#1さんの丁寧なご説明で十分と思いますが、ピボットグラフという手もありますね。
一列だけのデータを元に、行のフィールドと、データアイテムに同じ列をドロップしてやり、集計を「データの個数」にします。
Microsoftのこんな解説があることを初めて知りました。
ピボットテーブルウィザード 1/3で、ピボットグラフの方を選択して下さい。
http://www.microsoft.com/japan/office/previous/xp/suminaka/excel/sousa/2000/kihon2_1.htm
データ列に動的な名前をつけて、上記ピボットテーブルのデータソースをこの名前に設定しておくと、以後、新しいデータを追加したら、ピボットテーブルの右クリックメニューから「更新」を実行するだけで、ピボットグラフを含め更新されます。
http://office.microsoft.com/ja-jp/excel-help/HA001126115.aspx
VBAでの作成もおさらいしてみました。割合の大きい順に並び替えるには更に一工夫必要です。データが一番左のワークシートにあるとしています。メモリー上で集計する興味本位のコードですのでご参考にならないかもしれません。
Sub test()
Dim myWbk As Workbook
Dim mySh As Worksheet
Dim hitRange As Range, targetRange As Range
Dim buf As Variant
Dim i As Long
Dim searchWord As String, myKey As String
Dim myDic As Object
Dim myChart As Chart, mySeries As Series
searchWord = "ドロップアイテム"
Set myWbk = ThisWorkbook
Set mySh = myWbk.Worksheets(1)
Set hitRange = mySh.UsedRange.Find(What:=searchWord _
, After:=mySh.UsedRange.Cells(1) _
, LookIn:=xlValues _
, LookAt:=xlWhole _
, SearchOrder:=xlByRows _
, SearchDirection:=xlNext _
, MatchCase:=False _
, MatchByte:=False)
If hitRange Is Nothing Then Exit Sub
With mySh
Set targetRange = .Range(hitRange.Item(2), hitRange.End(xlDown))
End With
buf = targetRange.Value
Set myDic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(buf, 1)
myKey = CStr(buf(i, 1))
If Not myDic.exists(myKey) Then
myDic.Add myKey, 1
Else
myDic(myKey) = myDic(myKey) + 1
End If
Next i
Set myChart = Charts.Add(Before:=mySh)
myChart.ChartType = xlPie
Set mySeries = myChart.SeriesCollection.NewSeries
mySeries.XValues = myDic.keys
mySeries.Values = myDic.items
myChart.HasTitle = True
myChart.HasLegend = False
myChart.ChartTitle.Text = hitRange.Value
mySeries.ApplyDataLabels xlDataLabelsShowLabelAndPercent
End Sub
お礼
丁寧なご説明、大変ありがとうございました。 ピボットテーブルの使い方を、改めて知ることができました。 おかげで、やりたいと思っていたことが実現できました。 やはりExcelは便利ですね。 ありがとうございました。