【问题标题】:Delete Rows Based on Visible Range In Another Worksheet根据另一个工作表中的可见范围删除行
【发布时间】:2020-06-01 17:02:02
【问题描述】:

我有 2 个工作表,sheet1 和 sheet2。由于两张表中有共同的行,我想删除 sheet1 中可以在 sheet2 中找到的行。我只希望为具有条件“Y”的列删除工作表 1 中的行。我使用 sheet2 中的条件 Y 过滤了列,并选择了范围作为可见范围。所以 sheet1 中行的删除要根据 sheet2 中的可见范围。但是,在 sheet1 中删除行是根据 sheet2 删除每个出现的事件,而不是根据可见范围。我有下面的代码,但它不工作。有人可以让我知道我做错了什么吗?谢谢。

lastrow = Sheets("Sheet1").Cells.Find("*", searchorder:=xlByRows, SearchDirection:=xlPrevious).Row

With Sheets("Sheet2")
    .AutoFilterMode = False
    .Range("B1").AutoFilter Field:=2, Criteria1:="Y"
End With

With Sheets("Sheet1")
    For i = lastrow To 1 Step -1
            If IsNumeric(Application.Match(.Range("A" & i).Value, Sheets("Sheet2").Range("A1:B" & lastrow).SpecialCells(xlCellTypeVisible), 0)) Then
            .Rows(i).Delete
            End If
    Next i
End With

【问题讨论】:

  • 如果第 1,3 和 5 行是 Sheet2 中唯一可见的行,您希望在 Sheet1 中删除这些相同的行吗?
  • 两个文件是否具有相同的行结构?我的意思是相同数量的行,位于相同的位置?
  • 不,两个文件都有随机列出的行。 sheet1 中要删除的行将基于 sheet2 中的 2 个条件。一个条件是列中的值等于 Yes,另一个条件是列中的值等于唯一标识符。

标签: excel vba


【解决方案1】:

如果我正确理解要求,此代码将起作用。

With Sheets("Sheet2")

    Dim lastRow As Long
    lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row

    Dim data As Range
    Set data = .Range("B1:B" & lastRow)

    .AutoFilterMode = False
    data.AutoFilter 1, "Y"

    Dim deleteRows As Range
    Set deleteRows = data.SpecialCells(xlCellTypeVisible)

End With

Worksheets("Sheet1").Range(deleteRows.Address).EntireRow.Delete

要删除 sheet2 过滤数据中的 sheet1 中的值,请执行此操作

Dim d as Range
For each d in deleteRows

    Dim found as Range
    Set found = Worksheets("Sheet1").Columns(1).Find(d.Value,lookat:=xlWhole)

    If not found is Nothing Then

        Dim removeFrom1 as Range
        If removeFrom1 is Nothing Then
            set removeFrom1 = found
        else
            set removeFrom1 = Union(removeFrom1,found)
        end If

    End If

Next

removeFrom1.entirerow.delete

【讨论】:

  • 太棒了@SJL。如果您将其标记为已回答,它将在将来对其他人有所帮助。
  • 实现了基于地址的代码删除。如果两张纸中的行顺序相同,它将完美地工作。在 sheet2 中过滤后,如果我想根据 sheet2 中的唯一标识符删除 sheet1 中的行,我该怎么做?谢谢。
  • 它没有用。它不会进入 if not found is nothing then 循环。
  • 请调试代码并查看为什么它没有找到您期望的单元格值。我没有你的数据,无法调查。我还有一个需要解决的优先项目。 @SJL
  • 好吧。谢谢。
猜你喜欢
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多