Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4902 / 13644 ツリー ←次へ | 前へ→

【53683】リスト内のデータ種数 どんたく 08/1/31(木) 22:46 質問[未読]
【53684】Re:リスト内のデータ種数 ichinose 08/2/1(金) 8:27 発言[未読]
【53685】Re:リスト内のデータ種数 りん 08/2/1(金) 8:41 回答[未読]
【53696】Re:リスト内のデータ種数 (解決) どんたく 08/2/2(土) 10:59 お礼[未読]

【53683】リスト内のデータ種数
質問  どんたく  - 08/1/31(木) 22:46 -

引用なし
パスワード
   初心者です。たびたび経験してそのたび悩んでいます。
あるリストがある。其の中には重複している可能性があるデータがあります。
つまり
  固体命 
1  A
2  B
3  A
4  C
5  B
・  ・
・  ・
つまりこのリスト内に何種類の固体があって、それが何回出現しているのか
求めたい。
関数でもマクロでもいいんだが、できるだけスマートな方法を知りたい。
なにか定番みたいなものはあるんでしょうか ???

【53684】Re:リスト内のデータ種数
発言  ichinose  - 08/2/1(金) 8:27 -

引用なし
パスワード
   ▼どんたく さん:
おはようございます。

>初心者です。たびたび経験してそのたび悩んでいます。
>あるリストがある。其の中には重複している可能性があるデータがあります。
>つまり

例題をちょっと変更して
   A列
1  固体命 
2  A
3  B
4  A
5  C
6  B
・  ・
・  ・

とExcelでは、一行目は項目名を付加する癖を付けてください
そうする方がExcel機能が使いやすいですから・・。
(↑本当は、既にそうされているのかもしれませんが。)

上記のようにA列にデータがある事を想定します。

結果は、同シートのセルE1から表示するコードです。

標準モジュールに
'==========================================================
Sub main()
  Dim rngA As Range
  Dim rngE As Range
  Set rngA = Range("a1", Cells(Rows.Count, "a").End(xlUp))
  rngA.AdvancedFilter xlFilterCopy, , Range("e1"), True
  Set rngE = Range("e1", Cells(Rows.Count, "e").End(xlUp))
  With rngE
    .Cells(.Count + 1).Formula = "項目数 " & .Count - 1
    With .Offset(0, 1)
      .Cells(1).Value = "出現回数"
      .Range("a2:a" & .Count).Formula = _
        "=countif(" & rngA.Address & ",e2)"
      End With
    End With
End Sub

mainを実行してみてください。

【53685】Re:リスト内のデータ種数
回答  りん E-MAIL  - 08/2/1(金) 8:41 -

引用なし
パスワード
   どんたく さん、おはようございます。

>つまりこのリスト内に何種類の固体があって、それが何回出現しているのか
>求めたい。
>関数でもマクロでもいいんだが、できるだけスマートな方法を知りたい。
>なにか定番みたいなものはあるんでしょうか ???

フィルタ機能のマクロを記録し、ちょっと編集しました。

Sub Macro1()
  Dim r1 As Range, r2 As Range, Rmax As Long
  'A1は見出し、データはA2:A21まで入っているとして
  Set r1 = Range("A1:A21")
  '集計先はB1
  Set r2 = Cells(1, 2)
  r1.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=r2, Unique:=True
  '生成したリストの最下行
  Rmax = r2.End(xlDown).Row
  With r2.Offset(1, 1)
   'C2に式を入れる
   .Formula = "=COUNTIF(" & r1.Address & "," & .Offset(0, -1).Address(False, True) & ")"
   'それを下にフィル
   Range(.Offset(0, 0), Cells(Rmax, .Column)).FillDown
  End With
  '
  Set r1 = Nothing: Set r2 = Nothing
End Sub

こんな感じです。

【53696】Re:リスト内のデータ種数 (解決)
お礼  どんたく  - 08/2/2(土) 10:59 -

引用なし
パスワード
   ichinoseさん、りんさん、 さっそくのご指南ありがとうございます。
なるほど、両氏に共通しているのは

r1.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=r2, Unique:=True

で重複を避けたリストを作成して、それぞれに CountIf で出現回数を出力する
という方法ですね。
大変参考になりました。

4902 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free