Удаление строк с определенным значением в определенном столбце - PullRequest
3 голосов
/ 29 июля 2011
Sub main()
   Dim count As Integer
   Dim i As Integer
   count = Range("Q" & Rows.count).End(xlUp).Row
   MsgBox count
   For i = 2 To count
      If Cells(i, "Q").Value = 2 Then
           Sheets(1).Rows(i).EntireRow.Delete
      End If
  Next i
End Sub

Почему код не работает сразу?Когда я выполняю приведенный выше код VBA в Excel, он удаляет некоторые строки и затем завершает работу с этим сообщением:

run time error 13 

Что это значит?Иногда я получаю это сообщение:

type mismatch

В приведенном выше коде VBA я хочу удалить строки, у которых значение столбца Q равно 2, но оно не работает.Не могли бы вы сообщить мне, где ошибка?

Позвольте мне рассказать вам, что происходит.Код работает, но он удаляет некоторые строки и прерывается с ошибкой времени выполнения 13. Когда я открыл свой файл EXCEL, чтобы увидеть столбец Q, я заметил, что некоторые строки столбца Q имели #REF!.

Я думаю, что это может быть причиной, но как мне справиться с этим?Как мне заставить мой код работать правильно?У меня есть столбец Q, состоящий из 1,2 значений в нем.Строка столбца Q, содержащая 2, должна быть удалена, я имею в виду всю строку.

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Если строка № 10 == 2, то вы удаляете строку № 10;на следующей итерации цикла вы исследуете строку № 11, которая теперь имеет значение строки № 12, смещенную вверх после удаления, это означает, что вы пропускаете просмотр любой строки сразу под удаленной строкой.

Вы, вероятно, хотите вернуться назад;

Sub main()
   Dim count As Integer
   Dim i As Integer
   '//assuming all filled rows from Q2 downwards?
   count = Range("Q2").End(xlDown).Row

   For i = count To 2 Step -1
      If Cells(i, "Q").Value = 2 Then
           Sheets(1).Rows(i).EntireRow.Delete
      End If
  Next i
End Sub
1 голос
/ 30 июля 2011

Цикл каждой строки может занимать много времени на большом листе. Попробуйте использовать метод поиска. Также отключите обновление экрана.

Sub HTH()
    Dim rCell As Range
    Dim strAddress As String

    Application.ScreenUpdating = False

    With ActiveSheet.Columns("Q")
        Set rCell = .Find(What:=2, LookIn:=xlValues, SearchOrder:=xlByColumns)

        If Not rCell Is Nothing Then
            Do
                strAddress = rCell.Address
                rCell.EntireRow.Delete
                Set rCell = .FindNext(Range(strAddress))
            Loop Until rCell Is Nothing
        End If

    End With

    Application.ScreenUpdating = True

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...