Как устранить ошибку 400 в excel-vba

Я пишу excel-vba, чтобы найти и удалить всю строку, если в определенном столбце есть пустая ячейка. Мой макрос работает нормально, если есть хотя бы одна пустая ячейка, но показывает ошибку 400, если пустой ячейки нет. Мой код

Sub GPF_Sign()
Dim i As Integer, n as integer
Dim LROW As Long

    LROW = Sheets("GPF").Range("B200").End(xlUp).Row

    n = Range("D9:D" & LROW).SpecialCells(xlCellTypeBlanks).Cells.Count
    If n > 0 Then
        Range("D9:D" & LROW).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End If
End Sub

person Abhinn Wasav    schedule 17.06.2017    source источник
comment
Почему вы используете B200 для LROW?   -  person Gowtham Shiva    schedule 17.06.2017
comment
потому что мои строки не могут превышать 150   -  person Abhinn Wasav    schedule 17.06.2017
comment
вы можете использовать это вместо указания значения диапазона, LROW = Sheets("GPF").Range("B" & rows.count).End(xlUp).Row   -  person Gowtham Shiva    schedule 17.06.2017
comment
@GowthamShiva - я думаю, вы имели в виду LROW = Sheets("GPF").Range("B" & Sheets("GPF").rows.count).End(xlUp).Row (вы забыли указать Rows на правильном рабочем листе)   -  person YowE3K    schedule 17.06.2017
comment
Почему не автофильтр?   -  person Siddharth Rout    schedule 17.06.2017
comment
@ YowE3K да, вы абсолютно правы.   -  person Gowtham Shiva    schedule 18.06.2017
comment
непосредственно перед n=..... добавьте: dim rg as range: set rg=Range(D9:D & LROW).SpecialCells(xlCellTypeBlanks): если не rg ничего, то ..... вы выбираете n= rg.cells.count и т. д.... следующее возобновление при ошибке совершенно не нужно и является плохой практикой.   -  person Patrick Lepelletier    schedule 23.06.2017


Ответы (3)


Сделайте ваш выбор

Способ 1. Использование OERN (возобновление при ошибке)

Sub WAY_ONE()
    Dim ws As Worksheet, LROW As Long
    Dim rng As Range

    Set ws = Sheets("GPF")

    With ws
        LROW = .Range("B" & .Rows.Count).End(xlUp).Row

        On Error Resume Next
        Set rng = .Range("D9:D" & LROW).SpecialCells(xlCellTypeBlanks)
        On Error GoTo 0

        If Not rng Is Nothing Then rng.EntireRow.Delete
    End With
End Sub

Способ 2. Использование автофильтра

Sub WAY_TWO()
    Dim ws As Worksheet, LROW As Long
    Dim rng As Range

    Set ws = Sheets("GPF")

    With ws
        .AutoFilterMode = False

        LROW = .Range("B" & .Rows.Count).End(xlUp).Row

        Set rng = .Range("D9:D" & LROW)

        With rng 'Filter, offset(to exclude headers) and delete visible rows
            .AutoFilter Field:=1, Criteria1:=""
            .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With

        .AutoFilterMode = False
    End With
End Sub
person Siddharth Rout    schedule 17.06.2017

Вы можете использовать On Error Resume Next, но обычно это не рекомендуется, поскольку он может маскировать другие ошибки. Вместо этого попробуйте вычислить n безошибочным способом:

n = Application.CountIf(Sheets("GPF").Range("D9:D" & LROW), "")

еще один, еще лучший способ - использовать AutoFilter:

Sub GPF_Sign()
  With Sheets("GPF").Range("D8:D200")
    .AutoFilter 1, ""
    .Offset(1).EntireRow.Delete
    .AutoFilter
  End With
End Sub
person A.S.H    schedule 17.06.2017
comment
++ Я бы также выбрал автофильтр - person Siddharth Rout; 17.06.2017
comment
Кстати, должно быть .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete - person Siddharth Rout; 17.06.2017
comment
@SiddharthRout Спасибо. кстати SpecialCells(xlCellTypeVisible) не нужен, потому что .Delete повлияет только на видимые строки :) - person A.S.H; 17.06.2017

Используемый вами метод ".SpecialCells(xlCellTypeBlanks)" пытается вернуть диапазон. Если пустых ячеек нет, следующая часть «.cells.count» пытается ничего не считать. Вот почему это дает вам ошибку.

Поскольку вы уже проверяете, является ли n>0, вы можете просто добавить On Error Resume Next прямо над строкой «n=». Если после этого есть еще код, вы, вероятно, захотите поставить On Error GoTo 0 после этой части, чтобы он не игнорировал более поздние ошибки.

person Plaidpenguinhat    schedule 17.06.2017
comment
В качестве альтернативы LROW должно быть больше или равно 9. - person OldUgly; 17.06.2017