【问题标题】:Delete rows containing a specific string while keeping rows where the cell is blank删除包含特定字符串的行,同时保留单元格为空白的行
【发布时间】:2020-02-05 11:16:19
【问题描述】:

我有一个工作表,其中“B”列中的某些单元格包含字符串(它们都以某种形式包含“DELETE”),而某些单元格是空白的。

我想删除“B”列中的单元格包含字符串“DELETE”的所有行,但保留“B”列中的单元格为空白的行。

我只能根据“A”列确定循环的范围(lastrow),因为它被填充到最后。

我在循环中尝试做的另一件事是删除“E”列中的单元格不等于字符串“Active”的所有行。这不起作用。

字符串“DELETE”可以是大写或小写随机(“DELETE”、“delete”、“Delete”等)

我的代码删除了几行然后停止。

Sub format_pull()
Dim sh1 As Worksheet

Set sh1 = Sheets("Sheet1")

    LastRow = crc.Cells(Rows.Count, "A").End(xlUp).Row
    For x = 2 To LastRow

        If InStr(1, sh1.Range("B" & x).Value, UCase("DELETE"), 1) = 0 Then sh1.Range("B" & x).Value = "KEEP"
        If sh1.Range("B" & x).Value = "DELETE" Then sh1.Range("B" & x).EntireRow.Delete
        If sh1.Range("E" & x).Value <> "Active" Then sh1.Range("E" & x).EntireRow.Delete

    Next x

End Sub

【问题讨论】:

  • 嗨,您没有告诉我们的是实际问题是什么?它不是删除行吗.. 它删除了一些行但不是全部?另外,在您的B 列中,是否存在B 列中的字符串有一个字符串但其中没有单词DELETE 的情况?如果是这样,那你想做什么?
  • 另外,在您的第一个If 条件下,您有UCase("DELETE")。由于您已经拥有大写字符串 DELETE,因此此处不需要 UCase。相反,将sh1.Range("B" &amp; x).Value 大写(即UCase(sh1.Range("B" &amp; x).Value))。我怀疑这是问题的一部分,因为B 列中的字符串可能并不总是大写
  • 我认为应该使用 UCase 来获取参数以忽略搜索的字符串是大写还是小写等?字符串并不总是大写(可能是 Delete、DELETE、delete 等)。我更新了我的问题,澄清了这个细节
  • 再次阅读您的帖子,您将InStrvbTextCompare 一起使用,因此比较不区分大小写。底线您不需要UCase 进行此类比较。将其他 2 个IF's 更改为以类似方式使用InStr 并实施 Sam 的建议。这应该可以解决问题
  • 好的,已经解决了,谢谢大家!

标签: excel vba


【解决方案1】:

在循环内删除时,最好向后执行,如下所示:

For x = LastRow To 2 Step -1
    ...
Next x

这样在删除某些内容时它不会搞砸,但行计数器不会调整。

【讨论】:

  • 它会考虑空单元格吗?假设B列的最后5个单元格是空白的,然后有一个单元格包含一个字符串(带删除)等等?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2018-09-23
  • 2012-03-21
  • 1970-01-01
  • 2016-02-26
相关资源
最近更新 更多