我有时间为你整理了一个 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 中,您可以在原始数据列旁边创建三列。我在下面的屏幕截图中用彩色背景显示了这些公式。每个都在图像下方进行了解释。
蓝色列:使用上面的 VBA 函数对原始列表中每个单元格的内容进行排序,这给出了一个一致的列表,您可以在其上计算唯一项目。如果您的原始列表中有一些小写的实例和其他大写的实例,并且您需要将它们视为相同,则将此列中的公式修改为=CellSort(UPPER(A2))
绿色列:COUNTIF
标识每个已排序单元格的第一个实例的简单函数(适用于所有最新的 Excel 版本)。
红色单元格:计算 TRUE 在绿色列中出现的次数。这给出了唯一条目的计数。
以下是已完成工作的示例。
原始评论
恐怕我现在没有时间对此进行测试,但这可能会对您有所帮助。
您可能想查看此答案中给出的 VBA(我自己没有尝试过)。
VBA 快速排序
然后,如果您需要在公式中执行此操作,您可以从此 VBA 创建一个用户定义函数来对单元格中的值进行排序。将行更改arr = Split(ActiveCell.Text, ",")
为拥有"/"
,以便拆分您的列表。
接下来在原始数据旁边的列中使用您的公式,然后使用类似于此页面上的公式的内容:计算数据范围中值或唯一值的出现次数以计算唯一值。
如果您在上述任何方面需要更多帮助,请告诉我,我会在明天尝试做。