Удалить частичные строки в VBA

Я пытаюсь отформатировать n диапазонов из 4 столбцов, как показано ниже, расширяя их вправо и разделяя пустым столбцом (столбец "E"). Диапазон 2 начинается со столбца "F".

диапазон 1

А Б В Г ...

X Действие1 X X
-
-
X Действие2 X X
X Действие3 X X
#Н/Д #Н/Д #Н/Д

Для каждого диапазона я хочу удалить строки (из 4 столбцов), содержащие «-» во втором столбце или «# N / A» в любом столбце диапазона, ожидая этого результата:

диапазон 1

А Б В Г ...

X Действие1 X X
X Действие2 X X
X Действие3 X X

Это часть макроса VBA, поэтому я не буду использовать ручные автофильтры. Кроме того, автофильтрация также удалит строки из других диапазонов, чего не ожидается.

Я пробую этот код, по крайней мере, для тестирования на 1-м блоке, даже не работая:

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

редактировать: я думаю, что ответ может быть недалеко от это, но я не могу правильно управлять им.

Потерялся в VBA, некоторая помощь была бы отличной, спасибо заранее

EDIT: если это может кому-то помочь, я получил этот рабочий код, спасибо за приведенные ниже подсказки:

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

person hornetbzz    schedule 15.06.2013    source источник
comment
Вы можете использовать это или использовать автофильтр. См. ЭТО   -  person Siddharth Rout    schedule 15.06.2013
comment
За исключением того, что я не хочу удалять всю строку, а только диапазон столбцов текущего блока.   -  person hornetbzz    schedule 15.06.2013
comment
Верно :) Вы можете легко изменить код в соответствии с вашими потребностями :)   -  person Siddharth Rout    schedule 15.06.2013
comment
Был ли код автофильтра слишком сложным для понимания?   -  person Siddharth Rout    schedule 15.06.2013
comment
Да, поскольку у меня нет фона в VBA, и особенно у меня были сомнения, чтобы рискнуть удалить всю строку, но я хочу удалить только 4 столбца в строке.   -  person hornetbzz    schedule 15.06.2013
comment
Извините, но я не вижу комментария выше, в котором говорится, что Сид, я пробовал, но застрял. Это код, который я пробовал. Не могли бы вы мне помочь? В любом случае... вы получили свой ответ, так что давайте остановимся на этом...   -  person Siddharth Rout    schedule 15.06.2013


Ответы (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), но он работает.

person Andy G    schedule 15.06.2013
comment
Спасибо - я редактирую свое обновленное решение для кода - работает, несмотря на то, что это не так уж хорошо. - person hornetbzz; 15.06.2013
comment
Не то, чтобы приятно - щека!! ;) - person Andy G; 15.06.2013