- 締切済み
同一セル中にある重複データをカウントしたい
例えば、A1セルに「2, 2, 2, 3, 12, 22」というカンマで区切ったデータがあり、B2セルに2の個数をカウントしたい(12、22はカウントしない)時、どうすればいいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- msMike
- ベストアンサー率20% (364/1804)
- imogasi
- ベストアンサー率27% (4737/17069)
通常の関数では、むつかしそうなので、VBAでやってみた。 VBAが縁遠いようなら無視して。 別に、VBAでユーザー関数化はできる。 ーー データ Sheet1のA1:A9 B列が実行結果 A列はデータ B列は結果ですが先に上げたもの。 2, 2, 2, 3, 12, 22 3 2,12,34,52,2 2 3,4,4,5,6,22,2 1 3,2,4,5,2,22,3 2 3,3,4,5,6,22,4,2 1 3,2,4,2,6,22,5 2 3,2,4,5,26,22,6,2 2 3,2,2,5,2,22,7 3 2,2,4,5,2,22,2 4 標準モジュールに Sub test01() For i = 1 To 9 p = Split(Worksheets("Sheet1").Cells(i, "A"), ",") Worksheets("Sheet2").Range("A1:X1") = p x = pplication.WorksheetFunction.CountIf(Worksheets("Sheet2").Range("A1:X1"), 2) Worksheets("Sheet1").Cells(i, "B") = x Next i End Sub Sheet2は作業シートであるとして、確保してください。 上記では、データ数(カンマ数+1)が26を超えるケースもあるときは、修正必要。 ーー Split関数は便利。 Countiif関数が配列データで使えれば、わかりやすいのだが、VBAでは、セルのデータでないと(配列データに対してでは)使えないようだ。 ーーー Pythonではカウントできるようだ。うらやましい。 https://note.nkmk.me/python-collections-counter/ >キーとして要素を指定するとその個数を取得できる。・・ print(c['a']) # 4
- oboroxx
- ベストアンサー率40% (317/792)
つたないコードですが動きました。 Option Explicit Public Sub countDuplication() Dim i As Long Dim j As Long Dim arr As Variant Dim result As Variant Dim blnMatch As Boolean With ActiveSheet arr = Split(.Range("A1"), ",") ReDim result(UBound(arr), 1) result(0, 0) = arr(0) For i = 0 To UBound(result, 1) result(i, 0) = -1 result(i, 1) = 0 Next i result(0, 0) = arr(0) For i = 0 To UBound(arr) blnMatch = False For j = 0 To UBound(result, 1) If result(j, 0) = arr(i) Then result(j, 1) = result(j, 1) + 1 blnMatch = True Exit For End If Next j If blnMatch = False Then For j = 0 To UBound(result, 1) If result(j, 0) = -1 Then result(j, 0) = arr(i) result(j, 1) = 1 Exit For End If Next j End If Next i .Range("B2") = result(0, 1) End With End Sub