在电子表格中select特定的行

我有一个庞大的电子表格,我需要select某些行数据,其余的可以删除。 我想要select的所有行都以RC开头,后跟6个数字。 数字可以是不同的,所以他们看起来像RC125468和RC212548。 电子表格中有空行,但我不知道这是否会有所作为。 要覆盖电子表格中的所有行,我将不得不循环约30000。

这里是我的代码(这很糟糕,主要来自于我在Google上发现的,我认为会起作用的东西):

Sub Macro1() Dim x As Integer Dim rng As Range Set rng = Range("A2:A35000") Set x = x + 1 Do Until x = 30000 If Range(x, 1).Value <> ("RC??????") Then Delete.Row (x) End If Loop End Sub 

我已经尝试了几个不同的东西,但不断地运行到不同的错误,不能把东西放在一起,即使运行,更不用说select我需要的信息。 任何帮助将不胜感激。

尝试这个:

 Dim i as Long For i = 30000 to 1 step -1 If Not ActiveSheet.Range("A" & i) Like "*RC*" Then ActiveSheet.Range("A" & i).EntireRow.Delete End If Next I 

尝试这个:

 Sub Macro2() Dim x As Long For x = 30000 To 1 Step -1 If Left(Cells(x, 1).Value, 2) <> "RC" Or Not IsNumeric(Right(Cells(x,1).Value),6) Then Rows(x).Delete End If Next x End Sub 

如果一个单元格不是以RC启动的,或者如果是这样的话,如果这个6位数字不是数字,它就会删除该行。

尝试这个…

 Sub Macro1() Application.ScreenUpdating = False Dim x As Integer Dim rng As Range Set rng = Range("A2:A35000") For x = 1 To 30 If Not Cells(x, 1).Value Like "RC*" Then Rows(x).EntireRow.Delete x = x - 1 End If Next x Application.ScreenUpdating = True End Sub 

这将删除第一个单元格不启动RC的任何行

希望有所帮助

我第一次尝试将使用高级filter。 当使用通过VBA调用的Advanced Filter ,可以将过滤的范围复制到不同的工作表中(不像在Excel中这样做)。 所以你可以尝试:

 Option Explicit Sub SpecialFilter() Dim myTable As Range Dim myCriteria As Range Dim vResults As Variant Dim WS As Worksheet, wsRes As Worksheet, rRes As Range Dim LastRow As Long, LastCol As Long Set wsRes = Worksheets("sheet1") Set rRes = wsRes.Cells(1, 1) Set WS = Worksheets("sheet2") With WS LastRow = .Cells.Find(what:="*", after:=.Cells(1, 1), _ LookIn:=xlValues, searchorder:=xlByRows, _ searchdirection:=xlPrevious).Row LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _ LookIn:=xlValues, searchorder:=xlByColumns, _ searchdirection:=xlPrevious).Column Set myTable = .Range(.Cells(1, 1), .Cells(LastRow, LastCol)) Set myCriteria = .Range(.Cells(1, LastCol + 5), .Cells(2, LastCol + 5)) End With myCriteria(2).Formula = "=AND(LEFT(" & myTable(2, 1).Address(rowabsolute:=False) & _ ",2)=""RC"", ISNUMBER(-MID(" & myTable(2, 1).Address(rowabsolute:=False) & _ ",3,6)),LEN(" & myTable(2, 1).Address(rowabsolute:=False) & ")=8)" wsRes.Cells.Clear myTable.AdvancedFilter _ Action:=xlFilterCopy, _ criteriarange:=myCriteria, _ copytorange:=rRes myCriteria.Clear End Sub 

但是,通过每条线的循环方法,您需要进行一些更改

  • 使用正确的语法来testingRC后跟6个数字"RC######"
  • 从底部到顶部删除。 从上到下混淆索引指针。

您的代码与修改:

 Option Explicit Sub Macro1() Dim x As Long Dim LastRow As Long 'Determine last row in column A LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'Cycle from last row to first 'Assume row 1 is a column header not to be deleted Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For x = LastRow To 2 Step -1 If Not Cells(x, 1) Like "RC######" Then Rows(x).Delete Next x Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub 

试试看看哪个更好。

其他说明:

  • 在VBA中,没有很好的理由使用Integer数据types,除非你想为超出范围的数字引发溢出错误。
  • 实际确定一个范围的最后一行(如果有必要的话,最后一列)比超大的范围更有效。
    • 您可以使用currentregion属性,但使用空白行将不可靠。 我所展示的方法应该都是可靠的。

build立一个范围然后一次删除,而不是一次删除1行:

 Sub DeleteByCriteria() Dim MyRange As Range, Cell As Object For Each Cell In Range("A2:A35000") If Left(Cell.Value, 2) = "RC" Then If MyRange Is Nothing Then Set MyRange = Range(Cell.Address) Else Set MyRange = Union(MyRange, Range(Cell.Address)) End If End If Next MyRange.EntireRow.Delete End Sub 

如果你真的想一次走1,那就用相反的方法做:

 For X = 30000 to 1 step -1 

这样你每次删除一行就不需要从X中减1。