0

我正在尝试格式化n范围的 4 列,如下所示,向右扩展并由空白列(列“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

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

范围 1

A B C D ...

X 动作 1 X X
X 动作 2 X X
X 动作 3 X X

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

我正在尝试使用此代码至少在第一个块上进行测试,甚至无法正常工作:

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

编辑:我想答案可能离这个不远,但我无法正确管理它。

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

编辑:如果它可以帮助某人,我最终得到了这个工作代码,感谢以下提示:

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
4

1 回答 1

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),但它可以工作。

于 2013-06-15T14:22:45.777 回答