【发布时间】:2020-01-04 16:48:15
【问题描述】:
已解决。最后解决。
注意:我想接收每个唯一值的出现次数,而不是某个范围内唯一值的总数。
我试图想出一种好方法,将范围内的唯一值复制到二维数组或单数组中,然后在二维数组的另一列或单独的数组中,计算原始范围内每个唯一值的出现次数。
我知道我可以使用高级过滤器复制到不同的范围并读入,但如果可能,我会尝试跳过该步骤并将其直接存储到数组中。
至于计数,我根本不完全确定如何在 VBA 中使用这种方法来做到这一点。
编辑:感谢您告诉我使用字典,并使用计数唯一变量的版本,但这些都没有回答问题。
例子:
范围 A 1、1、1、2、3、4、4、5、5、5、5、6、6、7、8、9
我想要一个输出到一个数组中,这样:
对于一维 arr1(x) 来自 0-max 个唯一变量 arr1(0)=1,arr1(1)=2,以此类推。 在第二个数组中,使用相同的元素编号计算出现次数: arr2(0)=arr1(0) 在范围 A 中的出现次数,在本例中为 3。
对于 2-d,我想它会更简单,将单引用替换为 r,c 并拥有一个数组。
解决方案:
Sub CreateList()
Dim dic As Object, vData As Variant, i As Long
Dim LastRow As Long
Dim Array1 As Variant
LastRow = Sheets("Raw").Cells(Rows.Count, "D").End(xlUp).Row
'Create a dictionary object
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = vbTextCompare
'Pass the data to a variant array to speed processing
vData = Sheets("Raw").Range("D2:D" & LastRow + 1)
'Loop
For i = 1 To UBound(vData)
If vData(i, 1) <> "" Then dic(vData(i, 1)) = Empty
Next i
'Pass the unique keys to a 0 based array
Array1 = dic.keys
Sheets("AlarmCounts").Range("B2:B" & UBound(Array1) + 2).Value = Application.Transpose(Array1)
Call CountArray(Array1)
Call SortRange
End Sub
Sub CountArray(Array1)
Dim LastRow As Long
LastRow = Sheets("Raw").Cells(Rows.Count, "D").End(xlUp).Row
Dim i As Integer
Dim Array2() As Variant
ReDim Array2(UBound(Array1))
Dim iVal As Integer
For i = LBound(Array1) To UBound(Array1)
With Sheets("Raw")
iVal = Application.CountIf(.Range("D2:D" & LastRow), Array1(i))
Array2(i) = iVal
End With
Next i
Sheets("AlarmCounts").Range("C2:C" & UBound(Array1) + 2).Value = Application.Transpose(Array2)
Call AvgLen(Array2)
End Sub
【问题讨论】:
-
使用字典。
-
这能回答你的问题吗? Count unique values in Excel 有关如何使用字典的信息,请参阅 VBA 答案。您可能需要稍作调整。
-
@ExJester - 关闭部分是我的错,对不起我的匆忙,这不完全是重复的,因此我投票重新提出这个问题。但是,您绝对可以使用字典并在遍历项目时更新每个项目的计数。
-
@BigBen 不用担心,这给了我一个很好的校验和来确保数据完整性,所以它根本没有用。我能够使用字典找到我的答案,只是花了一些时间。我会用分辨率更新我的问题。