これを Excel の数式としてまとめる時間がありました。私のソースへのリンクについては、この投稿の下部にある私の元のコメントを参照してください。
これを解決する手順:
セルをソートするユーザー定義関数
Excel VBA で新しいモジュールを作成します (これに関する手順が必要な場合はお知らせください。数回クリックするだけです)。
以下のすべてのコードをコピーして貼り付けます。
Option Explicit
Const c_Separator = "/"
' User Defined Function to split a list within a cell and then sort it
' before recreating a sorted list
Public Function CellSort(strString As String) As String
Dim i As Integer
Dim arr As Variant
Dim strRet As String
arr = Split(strString, c_Separator)
' trim values so sort will work properly
For i = LBound(arr) To UBound(arr)
arr(i) = Trim(arr(i))
Next i
' sort
QuickSort arr, LBound(arr), UBound(arr)
' construct ordered list to return
For i = LBound(arr) To UBound(arr) - 1
strRet = strRet & CStr(arr(i)) & c_Separator
Next i
' Attach the last item separately to avoid adding an unecessary separator
CellSort = strRet & CStr(arr(i))
End Function
' Quick Sort function found here:
' https://stackoverflow.com/questions/3399823/excel-how-do-i-sort-within-a-cell
Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
Dim pivot As Variant
Dim tmpSwap As Variant
Dim tmpLow As Long
Dim tmpHi As Long
tmpLow = inLow
tmpHi = inHi
pivot = vArray((inLow + inHi) \ 2)
While (tmpLow <= tmpHi)
While (vArray(tmpLow) < pivot And tmpLow < inHi)
tmpLow = tmpLow + 1
Wend
While (pivot < vArray(tmpHi) And tmpHi > inLow)
tmpHi = tmpHi - 1
Wend
If (tmpLow <= tmpHi) Then
tmpSwap = vArray(tmpLow)
vArray(tmpLow) = vArray(tmpHi)
vArray(tmpHi) = tmpSwap
tmpLow = tmpLow + 1
tmpHi = tmpHi - 1
End If
Wend
If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Sub
VBA エディターを閉じます (コーディングは不要です)。
一意の組み合わせの数を計算するための Excel の数式 Excel
では、元のデータ列と並んで 3 つの列を作成します。これらの式は、下のスクリーンショットの色付きの背景の列に表示されています。画像の下にそれぞれ説明があります。
青の列: 上記の VBA 関数を使用して、元のリストの各セルの内容を並べ替えます。これにより、一意の項目をカウントできる一貫したリストが得られます。元のリストに小文字のインスタンスと大文字のインスタンスがあり、これらを同じものとして扱う必要がある場合は、この列の式を次のように変更します。=CellSort(UPPER(A2))
緑の列: 並べ替えられた各セルの最初のインスタンスを識別する単純なCOUNTIF
関数 (最近のすべての Excel バージョンで機能します)。
赤いセル: 緑の列に TRUE が表示された回数をカウントします。これにより、一意のエントリの数が得られます。
そして以下が完成作品の一例です。
元のコメント
今はこれをテストする時間がないのではないかと心配していますが、これが役立つかもしれません.
この回答に記載されている VBA を参照してください (私自身は試していません)。
VBAクイックソート
次に、数式でこれを行う必要がある場合は、この VBA からユーザー定義関数を作成して、セル内の値を並べ替えることができます。行arr = Split(ActiveCell.Text, ",")
を have に変更して"/"
、リストを分割します。
次に、元のデータと一緒に列で数式を使用してから、このページの数式のようなものを使用します:データ範囲内の値または一意の値の出現をカウントして、一意をカウントします。
上記のいずれかについてさらにサポートが必要な場合はお知らせください。明日対応させていただきます。