如何使用 VBA 模块计算新工作表中输出中的重复值

Posted

技术标签:

【中文标题】如何使用 VBA 模块计算新工作表中输出中的重复值【英文标题】:How to count the duplicate value in output in new worksheet using VBA Module 【发布时间】:2021-09-24 07:11:44 【问题描述】:

我需要使用 VBA 模块从源工作表“Rawdata”计算新工作表中的重复值。在不同工作表中 ID 前面的特定列中重复相同值的次数。

我已经通过数据透视表完成,但我想通过 VBA 模块在按钮单击事件上执行此操作。

原始来源页面

预期输出工作表如下:

我已尝试通过更新正确的工作表名称来使用以下代码,但出现如下类型不匹配错误:

我正在使用以下代码,但我通过插入新列手动将整个列数据从位置“Y”(25) 复制到第一个 (“A”)。

修改工作表

Option Explicit

 Sub CountDuplicates()

Dim a As Variant, b As Variant, e As Variant
  Dim d As Object
  Dim i As Long
  
  Set d = CreateObject("Scripting.Dictionary")
  
  d.CompareMode = 1
  
  b = Sheets("Rawdata").Range("A3").CurrentRegion.Resize(, 1).Value
  
  ReDim Preserve b(1 To UBound(b), 1 To 2)
  a = Sheets("Rawdata").UsedRange.Value
  
  For Each e In a
  
    If Len(e) > 0 Then
      d(e) = d(e) + 1
    End If
    
  Next e
  
  For i = 1 To UBound(b)
    b(i, 2) = d(b(i, 1))
  Next i
  
  Sheets("DuplicateCount").Range("A1:B1").Resize(UBound(b)).Value = b
End Sub

**现在我的输出结果工作表有重复计数(不明显)。我的意思是 ID 列不是唯一的。尽管将源列中的格式更改为文本,但结果中的数值与计数重复 **

【问题讨论】:

到目前为止你做了什么? 嗨 Maciej 我是 VBA 新手。我已经通过数据透视表创建了它,但我们需要 vba 模块,所以我们可以在不同的 Excel 工作表上重复它并通过点击事件完成。 【参考方案1】:

这就是它的实现方式。根据您的更改工作表名称。

Option Explicit

 Sub CountDuplicates()

  Dim a As Variant, b As Variant, e As Variant
  Dim d As Object
  Dim i As Long
  
  Set d = CreateObject("Scripting.Dictionary")
  
  d.CompareMode = 1
  
  b = Sheets("Rawdata").Range("Y3:Y10000").Value
  
  ReDim Preserve b(1 To UBound(b), 1 To 2)
  a = Sheets("Rawdata").UsedRange.Value
  
  For Each e In a
  
    If Len(e) > 0 Then
      d(e) = d(e) + 1
    End If
    
  Next e
  
  For i = 1 To UBound(b)
    b(i, 2) = d(b(i, 1))
  Next i
  
  Sheets("DuplicateCount").Range("A1:B1").Resize(UBound(b)).Value = b
  
End Sub

【讨论】:

您好,我已经通过将工作表名称更改为实际名称来尝试上述代码。我在以下行收到类型不匹配错误:ReDim Preserve b(1 To UBound(b), 1 To 2) 亲爱的 Hafiz 感谢您的快速回复。它几乎可以工作,但在创建工作表“DuplicateCount”时,第一列是错误的。它显示第 1 列“A”而不是第 25 列“Y”。如何修复正确的列? 我真的不明白。上面的代码采用Sheets("Rawdata").Range("Y3") 整个列,然后将唯一值粘贴到Sheets("DuplicateCount").Range("A") 并计入Sheets("DuplicateCount").Range("B"),您可以更改对任何列的引用,例如Sheets("DuplicateCount").Range("Y1:Z1").Resize(UBound(b)).Value = b 实际上,它从列“Y”或 25 的原始表中复制列号一或“A”,并粘贴到第一列“A”的重复表中。例如,“A”列的值为 CASE-2021-4306 CASE-2021-4305 CASE-2021-4304 CASE-2021-4304 CASE-2021-4303 CASE-2021-4302 CASE-2021-4301 CASE-2021-4301 I需要是 NV2142 不开机 NV2101 NV2103 2142 2142 NV2784 NV2651 将此行 b = Sheets("Rawdata").Range("Y3").CurrentRegion.Resize(, 1).Value 更改为 b = Sheets("Sheet1").Range("Y1:Y10000").Value

以上是关于如何使用 VBA 模块计算新工作表中输出中的重复值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBA 根据活动工作表中的单元格自动填充 Excel 表单?

Excel VBA在生成副本的工作表中插入本工作簿中的VBA模块代码

如何在工作表中动态创建具有列数的数组,以删除多列中的重复项

在 VBA 中,我如何创建一个匹配 2 张工作表中的日期并将数据作为值粘贴到匹配日期的代码?不能为此使用 vlookup

如何用VBA新建一个EXCEL表,并将将另一个EXCEL表中的内容复制到这个新建的EXCEL表中

使用 excel vba 计算每行中的重复值和报告重复数