【问题标题】:VBA If Last Two Characters equals "XX" Then Delete Entire RowVBA如果最后两个字符等于“XX”然后删除整行
【发布时间】:2012-12-24 04:02:32
【问题描述】:

我正在尝试运行一个宏,它查看一个字符串并确定最后两个字符是否等于“XX”,然后删除整行。

我收到一个对象错误哦,下面突出显示。

Sub Oval2_Click()


Last = Cells(Rows.Count, "E").End(xlUp).Row

For i = Last To 1 Step -1

`If (Right(Cells(i, "E"), 2).Value) = "TZ" Then`

    Cells(i, "E").EntireRow.Delete

End If
Next i

End Sub

请帮忙!谢谢。

【问题讨论】:

    标签: vba excel excel-2007


    【解决方案1】:

    Right(Cells(i, "E"), 2).Value 中删除.Value。抱怨是因为.Value 不存在于函数 Right

    【讨论】:

      【解决方案2】:

      虽然您已经有了答案,但我不建议通过循环来实现这一点。如果您有大量行,循环会很慢。这是一个相对非常快的替代方案。我还对代码进行了注释,以便您理解它不会有问题...

      逻辑

      1. 使用自动过滤器过滤以“XX”结尾的数据
      2. 删除过滤数据

      代码

      Option Explicit
      
      Sub Sample()
          Dim ws As Worksheet
          Dim lRow As Long
      
          '~~> Change this to the respective sheet
          Set ws = ThisWorkbook.Sheets("Sheet1")
      
          With ws
              '~~> Remove any filters
              .AutoFilterMode = False
      
              '~~> Get last row of Col A
              lRow = .Range("A" & .Rows.Count).End(xlUp).Row
      
              '~~> Use autofilter to identify the cells which end in "XX"
              With .Range("A1:A" & lRow)
                  .AutoFilter Field:=1, Criteria1:="=*XX"
                  '~~> Offset to exclude the header and delete them
                  .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
              End With
      
              '~~> Remove any filters
              .AutoFilterMode = False
          End With
      End Sub
      

      截图

      【讨论】:

      • 这段代码比其他答案写得好得多。虽然其他方法可能有效,但这是遵循 VBA 最佳实践的唯一答案。
      【解决方案3】:

      这个

      If (Right(Cells(i, "E"), 2).Value) = "TZ" Then
      

      应该是

      If Right(Cells(i, "E").Value, 2) = "TZ" Then
      

      这应该也可以:

      If Right(Cells(i, "E"), 2) = "TZ" Then
      

      【讨论】:

      • 哎呀...我应该在输入相同的响应之前刷新我的页面。
      【解决方案4】:

      我测试过。这行得通,而且速度最快,因为我还使用Range 来加速代码。

      Sub Oval2_Click()
      
          Dim Rng As Range 
          Dim i As Integer, counter As Integer
          'Please Set Your Range
          Set Rng = Range("E2:E300000")
          i = 1
          For counter =1 To Rng.Rows.Count
          
          If (Right(Rng.Cells(i),2)) = "XX" Then
              Rng.Cells(i).EntireRow.Delete
          Else 
             i = i + 1
          End If
      
          Next 
      
      End Sub
      

      【讨论】:

      • 这不正确:如果您有两个后续行,包含“XX”,则不会删除第二行。
      • 不太明白,但我的代码产生了预期的结果。删除所有 E 单元格中包含“XX”的 E 整行
      • 确实:因为没有后续的两行,包含“XX”。如果有,则不会删除第二个案例。
      • 好的。你的建议是什么?因为我不知道如何解决这个问题
      【解决方案5】:

      正如 cmets 中提到的,我建议您将循环转向(反向):

      For counter = To Rng.Rows.Count To 1 Step -1
        If (Right(Rng.Cells(counter),2)) = "XX" Then
            Rng.Cells(counter).EntireRow.Delete
        End If
      Next counter
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-16
        • 2011-09-09
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        • 2016-01-21
        相关资源
        最近更新 更多