Метод ListRow.Delete не работает на отфильтрованной таблице - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь выяснить, почему метод VBA ListRow.Delete работает по-разному, когда моя таблица фильтруется, а когда нет.

У меня есть таблица с адресами электронной почты, и ястолбец с именем AutoCheck с формулой, которая проверяет, соответствует ли адрес моим критериям достоверности.У меня также есть макрос (привязанный к некоторым кнопкам), который удаляет все строки таблицы со значением AutoCheck в False:

Sub FixErrors()

    Dim tbl As ListObject
    Dim x As Long
    Set tbl = ActiveSheet.ListObjects("Kontakty")

    For x = tbl.ListRows.Count To 1 Step -1
        If tbl.ListRows(x).Range.Columns(tbl.ListColumns("AutoCheck").Index) = False Then
            tbl.ListRows(x).Delete
        End If
    Next x


End Sub

. Это работает как шарм, когда у меня есть целоетаблица отображается, но когда я применяю фильтр и отображаю только некоторые записи (независимо от того, отфильтрованы ли поврежденные строки или нет), макрос внезапно перестает работать!Я попробовал отладку и остался совершенно сбит с толку.Я установил точку останова в строке tbl.ListRows(x).Delete, и она правильно идентифицирует строку, вызвавшую сбой (часы для tbl.ListRows(x).Range.Columns(tbl.ListColumns("Email").Index) отображают правильную электронную почту, которую мне нужно удалить), но tbl.ListRows(x).Delete просто ничего не делает, я шагаючерез это и ничего не меняется!

Я уверен, что здесь что-то упущено, я был бы признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Такое поведение в таблицах, по-видимому, является намеренным.Я не уверен, почему это так или каковы могут быть последствия разрешения удаления строк отфильтрованной таблицы.Если щелкнуть правой кнопкой мыши ячейку отфильтрованной таблицы и перейти к пункту «Удалить», можно выбрать «Столбцы таблицы» или «Строка всего листа».

При запуске кода во время выполнения будет выдано значение 1004 в строке tbl.ListRows(x).Range.Delete:

Can't move cells

Однако, если щелкнуть правой кнопкой мыши параметры удаления, описанные выше, можно удалить EntireRow:

Sub FixErrors()
Dim tbl As ListObject
Dim x As Long

    Set tbl = ActiveSheet.ListObjects("Kontakty")

    For x = tbl.ListRows.Count To 1 Step -1
        If tbl.ListRows(x).Range.Columns(tbl.ListColumns("AutoCheck").Index) = False Then
            tbl.ListRows(x).Range.EntireRow.Delete
        End If
    Next x

End Sub

Протестированов Excel 365 и все работает!

0 голосов
/ 31 мая 2018

Проверьте, работает ли это:

Sub FixErrors()

   Dim tbl As ListObject
   Dim x As Long
   Set tbl = ActiveSheet.ListObjects("Kontakty")

   Application.DisplayAlerts = False

   For x = tbl.ListRows.Count To 1 Step -1
       If tbl.ListRows(x).Range.Columns(tbl.ListColumns("AutoCheck").Index) = False Then
          tbl.ListRows(x).Range.Delete
       End If
   Next x

   Application.DisplayAlerts = True

End Sub
...