从一列中删除重复的值和单元格

时间:2018-06-04 09:22:17

标签: vba excel-vba dictionary excel

我已经尝试过removeduplicates,selections和scripting dictionaries中的这么多方法,但我无法让它工作。我知道有多种方法可以做到这一点,但如果你们中的任何一方可以提供帮助,那就太棒了。

我有一个值列表,我从另一张纸(最多约80k行)中向下拉入单元格B13。我然后尝试删除重复的值和单元格,所以我留下了唯一的值,然后我可以用它来执行其他工作表上的查找。

Sub Address_Sage()

    Dim dataBook As Workbook
    Dim dict As Object
    Dim Sage_Data As Worksheet, Address As Worksheet
    Dim dataSource As Range, dataDest As Range
    Dim sourceDataRowCount As Integer, index As Integer
    Dim rowCount As Long
    Dim strVal As String

    Set dataBook = Application.ThisWorkbook
    Set sheetSource = dataBook.Sheets("Sage_Data")
    Set sheetDest = dataBook.Sheets("Address")
    Set dict = CreateObject("Scripting.Dictionary")

    Set dataSource = sheetSource.Range("A3", _
                    sheetSource.Range("A90000").End(xlUp))
    sourceDataRowCount = dataSource.Rows.Count

    Set dataDest = sheetDest.Range("B13", "B" & _
                                sourceDataRowCount)

    For index = 1 To sourceDataRowCount
      dataDest(index, 1).Value = dataSource(index, 1).Value
    Next index

    Sheets("Address").Select

    rowCount = ActiveSheet.Range("B13").CurrentRegion.Rows.Count

    Do While rowCount > 0
      strVal = Address.Cells(rowCount, 1).Value2

      If dict.exists(strVal) Then
        ActiveSheet.Rows(rowCount).EntireRow.Delete
      Else
        dict.Add strVal, 0
      End If

      rowCount = rowCount - 1
    Loop
    'Set dict = Nothing

End Sub

它总是卡在strVal行。我尝试将value2更改为value1,因为我只有列但没有运气。

谢谢

1 个答案:

答案 0 :(得分:1)

VBA没有超级经验,所以我不能确切地说出你正在做什么以及你的代码在说什么,但我想我会和你分享这个。上周,我不得不创建一个宏书,返回不同工作人员在工作时观察到的电气缺陷的独特条目。我创建了一个字典,读取电子表格中的所有条目,然后打印所有唯一条目。我将发布代码并尝试引导您完成它。

If .Range("A" & i) <> "" Then
    If dict.Exists(data) Then
        dict(data) = dict(data) + 1
    Else
        dict.Add Key:=Data, Item:="1"
    End If
End If

所以代码基本上说如果列A(我只是一个增量器)不是空的,那么我们将读取列A的条目。数据只是一个变量,你可以设置它等于范围您希望在字典中阅读的值。显然,字典键是唯一的,不能重复,因此代码会询问密钥是否已存在于字典中。如果是这样,我们将添加一个计数或值。如果没有,我们会将该密钥添加到字典中。在循环结束时,您的词典将存储所有唯一条目及其出现的次数。

现在我们可以引用它们或打印它们。

For r = 0 To dict.Count
    Sheets("Results").Range("B" & iResults) = dict.Keys(r)
    Sheets("Results").Range("C" & iResults) = dict(dict.Keys(r))
Next 

第二段代码是从0到字典中条目数的循环。它从零开始,因为字典像数组一样存储,VBA数组基于零。第一个语句将打印每个r的唯一键,直到字典中没有更多条目。第二个语句将打印与其关联的值或项。它将是一个整数值,等于数据中唯一条目出现的次数。

您也可以将此相同的方法用于其他目的,不仅可以打印数据,还可以引用它并在其他地方使用它。但我相信你会发现带有dict.Keys(r)的For循环是运行字典条目的最简单方法。花了几天时间来弄明白这一点,它彻底改变了我的计划。希望这会帮助你。