Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 从一列中删除重复的值和单元格_Vba_Excel_Dictionary - Fatal编程技术网

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

Vba 从一列中删除重复的值和单元格,vba,excel,dictionary,Vba,Excel,Dictionary,我从RemovedDuplicates、selections和脚本字典中尝试了很多方法,但我无法让这些方法发挥作用。我知道有很多方法可以做到这一点,但如果你们中的任何人能提供帮助,那就太好了 我有一个值列表,我正在从另一张表(最多约80k行)向下拉入单元格B13。然后,我尝试删除重复的值和单元格,以便留下唯一的值,然后可以使用这些值在其他工作表上执行查找 Sub Address_Sage() Dim dataBook As Workbook Dim dict As Object

我从RemovedDuplicates、selections和脚本字典中尝试了很多方法,但我无法让这些方法发挥作用。我知道有很多方法可以做到这一点,但如果你们中的任何人能提供帮助,那就太好了

我有一个值列表,我正在从另一张表(最多约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
,因为我只有列,但运气不佳


谢谢你

在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
第二段代码是从0到字典中条目数的循环。它从零开始,因为字典像数组一样存储,而VBA数组以零为基。第一条语句将打印每个r的唯一键,直到字典中不再有条目。第二条语句将打印与其关联的值或项。它将是一个整数值,等于唯一条目在数据中显示的次数


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

您为什么不使用?应该比重新发明轮子容易。为什么你认为它比拆下的复制品好?这正是微软为此而发明的。您对RemovedUpplicates有任何问题吗?我同意最好使用本机函数,并且您在第一次尝试
RemovedUpplicates
时一定编码错误。不管怎样,你的问题和这个问题非常相似,它有一个有效的解决方案:同意之前的评论。但是,您将
Address
声明为一个工作表变量,但从未定义它(顺便说一句,名称不是一个好的选择,因为它是VBA属性,但可能不会阻止代码工作)。
value2
中的2与列号无关,也没有
value1
属性(afaik)。感谢您的所有评论,已更改回removeduplicates,还更改了address中的sheetname,我已使其正常工作。当我有机会的时候,我会更仔细地看一下脚本字典。。。非常感谢。
For r = 0 To dict.Count
    Sheets("Results").Range("B" & iResults) = dict.Keys(r)
    Sheets("Results").Range("C" & iResults) = dict(dict.Keys(r))
Next