Excel 筛选列中不同值的计数

Excel 筛选列中不同值的计数,excel,vba,Excel,Vba,我有一张6000行的Excel表格。如果一个特定列中的不同值小于(比如)三,我需要删除整行 根据以下示例: A栏中有颜色列表,B栏中有名称。 如果我过滤了B列和A列中的任何“名称”,如果少于三个不同的值=true,则应删除整行 A B Color Employee Red Dev blue Dev blue Dev Red Dev black Dev Red Dev Red Chary blue Chary blue

我有一张6000行的Excel表格。如果一个特定列中的不同值小于(比如)三,我需要删除整行

根据以下示例: A栏中有颜色列表,B栏中有名称。 如果我过滤了B列和A列中的任何“名称”,如果少于三个不同的值=true,则应删除整行

A         B
Color   Employee
Red     Dev
blue    Dev
blue    Dev
Red     Dev
black   Dev
Red     Dev
Red     Chary
blue    Chary
blue    Chary
Red     Chary
Red     Chary
Red     Chary
应删除名为-Chary的行

A         B
Color   Employee
Red     Dev
blue    Dev
blue    Dev
Red     Dev
black   Dev
Red     Dev
Red     Chary
blue    Chary
blue    Chary
Red     Chary
Red     Chary
Red     Chary
使用我的代码: 首先,我在B列中筛选名称,然后将筛选数据粘贴到新工作簿中,然后从A列中删除重复项,然后获得唯一计数。 如果唯一计数小于3,则激活主工作表并删除筛选的行并循环到下一个名称

莱斯特尚亚酒店 Application.ScreenUpdating=False Application.DisplayAlerts=False t=现在 设置wb=ActiveWorkbook SheetsVALID ARNS.激活 iCol=2'标准列 设置ws=SheetsVALID ARNS SheetsVALID ARNS.激活 设置rnglast=ColumnsiCol.Find*,Cells1,iCol,,xlByColumns,xlPrevious ws.ColumnsiCol.AdvancedFilter操作:=xlFilterInput,唯一:=True 设置rngUnique=RangeCells2,iCol,rnglast.SpecialCellsxlCellTypeVisible 工作手册。添加 设置newb=ActiveWorkbook 在恩古尼基的每一个大步 如果是strItem那么 ws.UsedRange.AutoFilter字段:=iCol,准则1:=strItem.Value 新手,启动 ws.UsedRange.SpecialCellsxlCellTypeVisible.Copy目标:=[A1] Application.CutCopyMode=False Cells.EntireColumn.AutoFit Dim uniq As范围 设置uniq=RangeA1:S&RangeA&Rows.Count.EndxlUp.Row uniq.removedupplicates列:=7,标题:=xlYes LastRow=ActiveSheet.UsedRange.Rows.Count 单元格。删除移位:=xlUp 范围A1.选择 wb.激活 如果LastRow<3,则 ActiveSheet.AutoFilter.Range.Offset1,0.Rows.SpecialCellsxlCellTypeVisible.Delete xlShiftUp 如果结束 如果结束 下一个 ws.ShowAllData MsgBox整个过程耗时!&FormatNow-t,hh:mm:ss和分钟 ActiveSheet.AutoFilterMode=False Application.ScreenUpdating=True Application.DisplayAlerts=True 端接头 我的代码在逐步调试模式下工作,但运行时会跳过很多行。 这是否与6000多行相关


在B列中过滤时,如何获得A列中不同值的计数?

这与您发布的代码不完全相同,因为我遇到了一些问题,但这里有一个替代解决方案。我只需将数据复制到另一张表中,请在运行我的代码之前添加名为“结果”的表,再添加两列公式,这些公式将检查是否应删除给定员工,筛选为“真”,然后删除相关行

从我测试的情况来看,这种解决方案似乎比应用高级过滤器、检查唯一值然后在整个数据集中循环更快。我希望它将为您的设置工作良好

代码如下:

Sub DeleteRows()
    Dim t As Variant
    Dim iCol As Long, lngLastRow As Long
    Dim wsOrig As Worksheet, wsNew As Worksheet

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
    End With

    t = Now()
    Set wsOrig = Sheets("VALID ARNS")
    Set wsNew = Sheets("Results")
    iCol = 2 '### criteria column

    With wsOrig
        lngLastRow = .Columns(iCol).Find("*", Cells(1, iCol), , , xlByColumns, xlPrevious).Row
        'copy into Results sheet
        .Range("A1:B" & lngLastRow).Copy wsNew.Range("A1")
        With wsNew
            'add formulas
            .Range("C1:D1").Value = VBA.Array("Instance", "Delete?")
            .Range("C2:C" & lngLastRow).Formula = "=COUNTIFS($A$2:A2,A2,$B$2:B2,B2)"
            .Range("D2:D" & lngLastRow).Formula = "=SUMIFS($C$2:$C$" & lngLastRow & ",$B$2:$B$" & lngLastRow & ",B2,$C$2:$C$" & lngLastRow & ",1)<3"
            'delete when column D = TRUE
            .Range("A1:D" & lngLastRow).AutoFilter Field:=4, Criteria1:="TRUE"
            .Range("D2:D" & lngLastRow).SpecialCells(xlCellTypeVisible).Rows.Delete
            'clear
            .Range("A1:B" & lngLastRow).AutoFilter
            .Range("C:D").Clear
        End With
    End With

    MsgBox "The entire process took! " & Format(Now() - t, "hh:mm:ss") & " Minutes"

    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
    End With
End Sub

嗨,Justyna MK,谢谢你的回复。你的代码太棒了,它工作得很好,非常感谢你的代码…如果有代码,请帮助我在过滤模式下在特定列中获得不同的值计数。。这只是为了我的知识,我在问。提前谢谢。很高兴它对你有用。当然,今天晚些时候我会尝试一下,并让您知道。看起来您无法使用筛选器或高级筛选器功能,因为您并不是真正在一列中查找唯一的值-实际上是a列和B列的组合决定了值是否唯一。这就是为什么您需要使用Scripting.Dictionary功能。我用一个函数getUnique更新了我的代码,该函数显示a列和B列的唯一组合,以及一个子例程CountUnique,该函数在调试模式下打印每个可见的过滤行的唯一组合数。希望能有帮助。