【问题标题】:Assign Array to .RemoveDuplicates Columns:= [duplicate]将数组分配给 .RemoveDuplicates 列:= [重复]
【发布时间】:2018-05-18 16:57:20
【问题描述】:

我想删除包含数据的列范围内的重复行。

我首先得到我的数据集使用的最后一行和最后一列

lastUsedRowDiff = resultBook.Sheets("Differences").Cells(resultBook.Sheets("Differences").Rows.Count, "A").End(xlUp).Row
lastUsedColumnDiff = resultBook.Sheets("Differences").Cells(6, resultBook.Sheets("Differences").Columns.Count).End(xlToLeft).Column

我尝试像这样使用 RemoveDuplicate 函数:

resultBook.Sheets("Differences").range(resultBook.Sheets("Differences").Cells(1, 1), resultBook.Sheets("Differences").Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44), _
Header:=xlNo

它可以工作,但我希望列数是动态的,因此以这种方式初始化包含列的数组是不切实际的。

我尝试在调用 RemoveDuplicates 之前初始化一个包含列索引的数组,如下所示:

ReDim columnArray(1 To lastUsedColumnDiff) As Integer
For p = 1 To lastUsedColumnDiff
    columnArray(p) = p
Next p

当我尝试将 columnArray 分配给 Columns:= 时出现错误。

resultBook.Sheets("Differences").range(resultBook.Sheets("Differences").Cells(1, 1), resultBook.Sheets("Differences").Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates Columns:=columnArray, _
Header:=xlNo

下面是整个代码段:

lastUsedRowDiff = resultBook.Sheets("Differences").Cells(resultBook.Sheets("Differences").Rows.Count, "A").End(xlUp).Row
lastUsedColumnDiff = resultBook.Sheets("Differences").Cells(6, resultBook.Sheets("Differences").Columns.Count).End(xlToLeft).Column

ReDim columnArray(1 To lastUsedColumnDiff) As Integer
For p = 1 To lastUsedColumnDiff
    columnArray(p) = p
Next p

resultBook.Sheets("Differences").range(resultBook.Sheets("Differences").Cells(1, 1), resultBook.Sheets("Differences").Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates Columns:=columnArray, _
Header:=xlNo

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    好的,这很有趣...乍一看,我不明白为什么它在RemoveDuplicates 方法调用中不接受Columns 的数组参数。 Google 出现了this 的答案,它建议在数组上使用 VBA Evaluate 函数,当我测试它时,它似乎按预期工作。

    问题似乎在于 RemoveDuplicates 方法似乎认为 cols 是某种函数。尝试使用 evaluate() 方法让它将其识别为变量。这在 Excel 2007 中对我有用,应该对你有用。告诉我。

    您的代码也可以从一些清理中受益,试试这个,它使用With 块使代码更易于阅读和修改:

    Sub foo()
    Dim lastUsedRowDiff As Long
    Dim lastUsedColumnDiff As Long
    Dim myWorkbook As Workbook
    Dim mySheet As Worksheet
    Dim columnArray()
    Dim p As Long
    
    Set myWorkbook = ThisWorkbook       '## Modify as needed
    Set mySheet = ThisWorkbook.Sheets(1) '## Modify as needed
    
    With mySheet
        lastUsedRowDiff = .Cells(.Rows.Count, "A").End(xlUp).Row
        lastUsedColumnDiff = .Cells(6, .Columns.Count).End(xlToLeft).Column
    End With
    
    ReDim columnArray(1 To lastUsedColumnDiff)
    For p = 1 To lastUsedColumnDiff
        columnArray(p) = p
    Next
    
    With mySheet
        .Range(.Cells(1, 1), .Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates _
            Columns:=Evaluate(columnArray), Header:=xlNo
    End With
    
    End Sub
    

    【讨论】:

    • 非常感谢您的快速回复。它完美地解决了我的问题。还要感谢您提供格式提示。我想我会花一些时间来清理我的代码。
    【解决方案2】:

    正如我刚刚发现的,Columns:=Evaluate(columnArray) 方法可能无法正确处理。删除了太多行,不知道为什么。试试 Columns:=(columnArray)。这在 Excel 2010 中对我有用。

    【讨论】:

    • 通过一些快速测试,Evaluate(columnArray) 将只返回 first 列号(但是,以函数可以读取的格式),所以如果你有 "1 , A”和“1, B”,它识别出“1”的重复,并忽略“A”和“B”不同。只需用括号括起来就会以“可读”格式返回所有列值
    【解决方案3】:

    另外 - 使用 Columns:=(columnArray) 确保您的 columnArray 从 0 开始索引。否则您将收到运行时错误“9”:下标超出范围。 所以这应该如下所示:

    Sub RemoveDuplicates()
    
    Dim columns As Long
    Dim mySheet As Worksheet
    Dim myArray()
    
    Set mySheet = ThisWorkbook.Sheets(1) 'To modify
    
    columns = mySheet.UsedRange.columns.Count
    
    ReDim myArray(0 To columns - 1)
    
    For i = 0 To columns - 1
        myArray(i) = i + 1
    Next i
    
    mySheet.UsedRange.RemoveDuplicates columns:=(myArray), Header:=xlYes
    
    End Sub
    

    在 MS Excel 2013 上测试。

    【讨论】:

      【解决方案4】:

      这是另一个解决方案

      Private Sub removeDuplicates(ByRef arrName As Variant)
        Dim list As New Dictionary
        Dim item As Variant
      
        For Each item In arrName
      
          If Not list.Exists(item) Then
              list.Add item, item
          End If
        Next
      
        arrName = list.Items
      End Sub
      

      然后重新分配给范围。如果您只想从 vba 中的数组中删除重复项,也可以使用它。

      【讨论】:

        猜你喜欢
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        相关资源
        最近更新 更多