【问题标题】:Compare table to a list in other worksheet and remove no matches将表格与其他工作表中的列表进行比较并删除任何匹配项
【发布时间】:2018-09-05 09:03:57
【问题描述】:

我有以下代码比较两个列表(工作表 1 中的 A 列和工作表 2 中的 C 列)并删除工作表 2 列表中不存在的值。此代码工作正常,但在以下情况下不起作用表 1 中的 A 列和表 2 中的 C 列都有表格。请让我知道如何修改此代码以也适用于表格。另外,如何从具有 C 列(表 2)常量列表的多个工作表中删除不匹配项?

Sub Stridhan()

Dim lr As Integer, x As Integer   
lr = ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False  
For x = lr To 2 Step -1  
    If Application.WorksheetFunction.CountIf(Sheets("Sheet2").Range("C:C"), Sheets("Sheet1").Cells(x, 1).Value) = 0 Then  
        Sheets("Sheet1").Rows(x).EntireRow.Delete  
    End If  
Next x  
Application.ScreenUpdating = True  
End Sub

【问题讨论】:

  • 我今天可能有点慢,但是“此代码工作正常,但当工作表 1 中的 A 列和工作表 2 中的 C 列都有表格时它不起作用”到底是什么意思?我以为您的意思是两列都是表格格式的范围的一部分,但是当我尝试代码对我来说可以正常工作时...另外-它不起作用是什么意思?它显示错误或运行没有错误,但给出错误的数据?
  • 是的,我的意思是当范围格式化为表格时。代码运行没有任何错误,但不会从表中删除行。
  • 我重新创建了文件以确保它再次按预期工作,尽管我的数据集被格式化为表格。表 1 上还有其他内容吗?您是否尝试单步执行代码以查看执行删除行时会发生什么?
  • 我想知道是什么导致了这种行为 - 如果工作表 1 中有任何内容阻止删除行,那么它很可能会导致错误。例如,如果有一个数据透视表。因此,如果您没有看到任何错误,我猜想更有可能找不到匹配项。再一次 - 单步执行代码以查看其行为方式将是最佳的行动方案 - 它是否识别匹配?如果没有 - 为什么?如果是 - 为什么不删除该行?这就是我将如何进行。
  • 您好,谢谢!更改工作表参考后,它对我有用。另外,我希望这段代码除了前两张表之外,也不会从其他工作表中删除任何匹配项。

标签: excel vba compare


【解决方案1】:

为了让它在更多工作表中运行,您可以使用这样的代码

Sub cycle_sheets()
For Each sh In Worksheets
    If sh.Name <> "Sheet2" Then
        'your code to cycle through the data where instead of Sheets("SheetX"). you use sh. like this
        sh.Rows(x).EntireRow.Delete
    End If
Next
End Sub

这将遍历所有工作表,并且对于所有与“Sheet2”命名不同的工作表,它将执行 if 中的内容。所以你只需要拿你的代码,改变Sheet引用并将它放在if中。

编辑: 如果您希望它跳过由于过滤而不可见的行,您可以在确定是否要使用删除它之前检查该行

If sh.Rows(x).Hidden = False Then

【讨论】:

  • 您好,感谢您对之前查询的帮助。现在我只需要在 A 列的过滤行上运行此代码。但是,此代码正在考虑未过滤的行并删除不匹配的行。我希望它只从过滤的行中删除不匹配的内容。提前致谢!
  • ThisWorkbook.Worksheets("Sheet2").Activate ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=3, Criteria1:= _ Array("Num", "ID", " S"), Operator:= _ xlFilterValues lr = sh.Cells(Rows.Count, 1).End(xlUp).Row For x = lr To 7 Step -1 If Application.WorksheetFunction.CountIf(wn.Range("B :B"), sh.Cells(x, 1).Value) = 0 Then sh.Rows(x).EntireRow.Delete End If Next x ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=3
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多