【问题标题】:VBA Return occurrence of each unique value in a range to an arry [duplicate]VBA将范围内每个唯一值的出现返回到一个数组[重复]
【发布时间】: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 不用担心,这给了我一个很好的校验和来确保数据完整性,所以它根本没有用。我能够使用字典找到我的答案,只是花了一些时间。我会用分辨率更新我的问题。

标签: excel vba


【解决方案1】:

试试这个方法:

Dim uniques As New Collection
Dim searchRange As Range, sr As Range

'Set searchRange = Range() ' assign the range

On Error Resume Next

For Each sr In searchRange
    uniques.Add sr, sr
Next
Err.Clear

On Error GoTo 0

您将获得一组独特值。但是有一些限制 - 请参阅 Collections 文档。

【讨论】:

  • 谢谢,我会调查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2012-10-25
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多