Excel VBA не удаляет строки в некоторых случаях - PullRequest
0 голосов
/ 07 ноября 2019

Я использую следующий код для удаления видимых строк в Excel (после фильтрации для значений больше 30). Проблема, с которой я сталкиваюсь, заключается в том, что код работает нормально и удаляет строки, когда значения (больше 30) находятся в последовательности, но не удаляет строки и выдает ошибку, когда значения не в последовательности. Что я делаю не так?

'With rng
     .AutoFilter Field:=13, Criteria1:=">30"
     .SpecialCells(xlCellTypeVisible).EntireRow.Delete
     .AutoFilter Field:=13, Criteria1:=">0"
End With '

Я получаю сообщение об ошибке: Delete method of Range class failed

Вот как выглядят данные, которые я пытаюсь удалить:

enter image description here

Как устанавливается диапазон:

Dim rng As Range

LastRow = btsvoice.Range("M" & btsvoice.Rows.Count).End(xlUp).Row
Set rng = btsvoice.Range("M2:M" & LastRow)

Ниже приведен полный код модуля:

Sub Delete_Row_Final()

    Dim voice As Workbook
    Dim data As Workbook
    Dim btsvoice As Worksheet
    Dim nodebvoice As Worksheet
    Dim btsdata As Worksheet
    Dim enodebdata As Worksheet
    Dim rng As Range
    Dim LastRow As Long
    Dim MyRange As Range

    Set voice = Workbooks("Voice_Files.xlsx")
    Set btsvoice = voice.Sheets("2G Voice")
    Set nodebvoice = voice.Sheets("3G Voice")

    Set data = Workbooks("Data_Files.xlsx")
    Set btsdata = data.Sheets("2G Data")
    Set enodebdata = data.Sheets("4G Data")

    Application.Calculate
    If Not Application.CalculationState = xlDone Then
        DoEvents
    End If

    ' -------------------  2G Voice ------------------------
    'filter and delete all but header row which is in row 3
LastRow = btsvoice.Range("M" & btsvoice.Rows.Count).End(xlUp).Row
Set rng = btsvoice.Range("M1:M" & LastRow)

    ' filter and delete all but header row
    With rng
         .AutoFilter Field:=13, Criteria1:=">30"
    .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .AutoFilter Field:=13, Criteria1:=">0"
    End With

    ' -------------------  3G Voice ------------------------
    'filter and delete all but header row which is in row 3
    LastRow = nodebvoice.Range("K" & nodebvoice.Rows.Count).End(xlUp).Row
    Set rng = nodebvoice.Range("K2:K" & LastRow)

    ' filter and delete all but header row
    With rng
         .AutoFilter Field:=11, Criteria1:=">30"
         .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
         .AutoFilter Field:=11, Criteria1:=">0"
    End With

    voice.Save

        ' -------------------  2G Data ------------------------
    'filter and delete all but header row which is in row 3
    LastRow = btsdata.Range("L" & btsdata.Rows.Count).End(xlUp).Row
    Set rng = btsdata.Range("L2:L" & LastRow)

    ' filter and delete all but header row
    With rng
         .AutoFilter Field:=12, Criteria1:=">30"
         .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
         .AutoFilter Field:=12, Criteria1:=">0"
    End With

            ' -------------------  4G Data ------------------------
    'filter and delete all but header row which is in row 3
    LastRow = enodebdata.Range("M" & enodebdata.Rows.Count).End(xlUp).Row
    Set rng = enodebdata.Range("M2:M" & LastRow)

    ' filter and delete all but header row
    With rng
         .AutoFilter Field:=13, Criteria1:=">30"
         .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
         .AutoFilter Field:=13, Criteria1:=">0"
    End With

    data.Save

End Sub

1 Ответ

0 голосов
/ 07 ноября 2019

Глядя на ваш текущий вопрос и объяснение, я думаю, что, должно быть, добавлено 3 в ваш код:

Если вы установите диапазон:

LastRow = btsvoice.Range("M" & btsvoice.Rows.Count).End(xlUp).Row
Set rng = btsvoice.Range("M2:M" & LastRow)

Вы не можетеиндекс до Field:=13, поскольку он просто отсутствует в диапазоне 1 столбца. Вместо этого используйте Field:=1.

Однако, некоторые другие указатели, которые нужно сделать, это то, что, поскольку у вас есть заголовки, может быть даже лучше использовать Offset, чтобы ваш код выглядел следующим образом:

Dim rng As Range

LastRow = btsvoice.Range("M" & btsvoice.Rows.Count).End(xlUp).Row
Set rng = btsvoice.Range("M1:M" & LastRow)

With rng
    .AutoFilter Field:=1, Criteria1:=">30"
    .Offset(1,0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .AutoFilter Field:=1, Criteria1:=">0"
End With

Еще одна вещь, которую я могу себе представить: описанная ошибка также будет выдана, когда AutoFilter уже применен к одному столбцу, а вы хотите AutoFilter к другому столбцу. Это означает, что у вас есть два варианта:

  • Удалить AutoFilter перед применением другого фильтра
  • Применить фильтр к полному диапазону вместо отдельных столбцов

Для первого варианта вы можете попробовать:

With Sheet1
    If .AutoFilterMode = True Then .AutoFilterMode = False
End with

Для второго варианта вам нужно установить диапазон в столбец A: M (или даже дальше)

Set rng = btsvoice.Range("A2:M" & LastRow)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...