删除VBA中的部分行

时间:2013-06-15 13:59:53

标签: excel excel-vba excel-2010 vba

尝试格式化以下4列的 n 范围,向右扩展并用空白列(col“E”)分隔。范围2从“F”列开始。

  

范围1

     

A B C D ...

     

X措施1 X X
   -
   -
  X措施2 X X
  X措施3 X X
  #N / A#N / A#N / A

对于每个范围,我想删除第二列中包含“ - ”的行(4列)或该范围的任何列上的“#N / A”,期望得到以下结果:

  

范围1

     

A B C D ...

     

X措施1 X X
  X措施2 X X
  X Action3 X X

这是VBA宏的一部分,所以我不会使用手动自动过滤器。最重要的是,自动过滤还会删除其他范围内的行,这是不期望的。

我正在尝试使用此代码至少用于测试第一个块,甚至不能正常工作:

Dim Rng As Range
  Set Rng = Range("A4", "D53")
  If Not Rng(, 2).Value = "-" Then
    Rng.Delete Shift:=xlUp
  End If

编辑:我猜答案可能离this不远,但我无法正确管理。

在VBA中失败,一些帮助会很棒,提前

编辑:如果它可以帮助某人,我最终将这个工作代码thx提供给以下提示:

Dim iRows, iCols, NbLig, x, BlockSize, BlockOffset, MyOffsetBtwnBlocks, CountBlocks As Integer


    BlockSize = 4

    NbLig = Range("A3").SpecialCells(xlCellTypeLastCell).Row

    CountBlocks = 0

    For iCols = 2 To NbCol Step BlockSize + 1

        iRows = Range(Cells(3, iCols), Cells(NbLig, iCols + BlockSize).End(xlToLeft)).Rows.Count

        For x = iRows To 3 Step -1
            If Application.WorksheetFunction.IsNA(Cells(x, iCols + 1)) Then
                Application.Intersect(Cells(x, iCols + 1).EntireRow, _
                     Range(Cells(3, iCols), Cells(3, iCols + BlockSize)).EntireColumn).Delete

            ElseIf Application.WorksheetFunction.IsNA(Cells(x, iCols + 2)) Then
                Application.Intersect(Cells(x, iCols + 2).EntireRow, _
                     Range(Cells(3, iCols), Cells(3, iCols + BlockSize)).EntireColumn).Delete

            ElseIf Cells(x, iCols + 1).Value = "-" Then
                Application.Intersect(Cells(x, iCols + 1).EntireRow, _
                     Range(Cells(3, iCols), Cells(3, iCols + BlockSize)).EntireColumn).Delete

            End If

            CountBlocks = CountBlocks + 1

        Next x

    Next iCols

1 个答案:

答案 0 :(得分:1)

这应该是你:

Sub RemoveX()
    Dim iRows As Integer
    Dim x As Integer

    Application.ScreenUpdating = False
    iRows = Range("A1").CurrentRegion.Rows.Count

    For x = iRows To 1 Step -1
        If Application.WorksheetFunction.IsNA(Cells(x, 2)) Then
            Application.Intersect(Cells(x, 2).EntireRow, _
                Range("A1:D1").EntireColumn).Delete
        ElseIf Cells(x, 2).Value = "-" Then
            Application.Intersect(Cells(x, 2).EntireRow, _
                Range("A1:D1").EntireColumn).Delete
        End If
    Next x
    Application.ScreenUpdating = True
End Sub

CurrentRegion是您点击A1并按Ctrl-A获得的区域。

如果可以整理一下(使用Range引用而不使用EntireRow或-Column),但它可以工作。