Excel 2016-删除单元格颜色为X或其他条件的重复项

Excel 2016-删除单元格颜色为X或其他条件的重复项,excel,excel-2016,vba,Excel,Excel 2016,Vba,我有一个用户想要从包含四万多行的电子表格中删除重复的行 看起来Excels remove duplicates函数只是保留值/行的第一个实例,然后删除后面的所有重复项 他们希望根据初始偏好选择要保留的副本,即包含副本的单元格的颜色。删除重复项是非常基本的,因此从我所看到的情况来看,没有能力做到这一点,即使我们可以提取细胞颜色,我认为我们可以使用以下方法: =CELL("color",E2) 将颜色名称或其他值放在另一个单元格中,我认为这不能与删除重复项一起使用,以实现它们想要的效果 VB是我们

我有一个用户想要从包含四万多行的电子表格中删除重复的行

看起来Excels remove duplicates函数只是保留值/行的第一个实例,然后删除后面的所有重复项

他们希望根据初始偏好选择要保留的副本,即包含副本的单元格的颜色。删除重复项是非常基本的,因此从我所看到的情况来看,没有能力做到这一点,即使我们可以提取细胞颜色,我认为我们可以使用以下方法:

=CELL("color",E2)
将颜色名称或其他值放在另一个单元格中,我认为这不能与删除重复项一起使用,以实现它们想要的效果


VB是我们实现这一目标的唯一途径吗?有人对实现这一目标的代码有什么建议吗?假设为了论证,它们有黄色和白色的单元格,并希望删除白色。

以下代码将在“Sheet1”中的“Column 1”上迭代,将找到每个重复的值,并将其地址存储在数组中。然后它将迭代数组并检查每个地址单元的颜色-如果是黄色,它将删除重复的地址单元

这是完全按照你的要求,除了这里黄色将被删除,因为它似乎更海峡向前我

例如,此数据:

在VBA运行后将变为:

您可以根据要删除白色的ColorIndex属性修改要删除值的颜色,将条件更改为如果RangetoDeli.Cells.Interior.ColorIndex=2


这里是一个很好的参考。

如果您想按某些标准删除行,我怀疑您是否会找到非VBA解决方案……我也怀疑。鉴于我几乎从未接触过VBA,任何关于我可能需要考虑的命令类型的粗略建议?ReDim PREVENCE应该被拉到for循环之外,这会大大降低代码的速度。首先在循环ReDim toDel1到RNG.Cells.Count之前重新分配阵列,然后在循环后使用ReDim PREVICE toDel1到i-1删除不必要的插槽。这非常有效!我现在需要做的是删除单元格所在的整行,感觉可能有点棘手。我通过以下操作成功地做到了这一点:RowToDel=RangetoDeli.Cells.row RowsRowToDel.EntireRow.delete
Sub sbFindDuplicatesInColumn_With_Color_Condition()

    Dim toDel(), i As Long
    Dim RNG As Range, Cell As Long

    'Declare and set the worksheet where your data is stored
    Dim sheet As Worksheet
    Set sheet = Worksheets("Sheet1")

    'Finding the last row in the Column 1
    lastRow = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row

    'Set the range to the last row of data in the column
    Set RNG = Range("a1:a" & lastRow) 'set your range here

    'Iterate over the column, finding duplicates and store their address in an array
    For Cell = 1 To RNG.Cells.Count
        If Application.CountIf(RNG, RNG(Cell)) > 1 Then
            ReDim Preserve toDel(i)
            toDel(i) = RNG(Cell).Address
            i = i + 1
        End If
    Next
    'Iterate over the array and remove duplicates with specific color index (in this example - remove the yellow ones)
    For i = UBound(toDel) To LBound(toDel) Step -1
        If Range(toDel(i)).Cells.Interior.ColorIndex = 6 Then
            Range(toDel(i)).Cells.Value = ""
        End If
    Next i

End Sub