vba удаляет строки на основе нескольких критериев - в коде отсутствуют некоторые критерии

У меня есть код vba, который удаляет строки на основе нескольких критериев. Он работает очень хорошо, и мне нравится, насколько короткий и простой код. Однако я заметил, что он каким-то образом пропускает некоторые ячейки, содержащие критерии. Обычно я бы хотел удалить только три или около того из перечисленных критериев. Любая подсказка, почему это может происходить?

Вот код:

Sub DeleteMyRows()

Dim Rng As Range, Cell As Range
Set Rng = Range(Range("B2"), Range("B" & Rows.Count).End(xlUp))
With Application
    .ScreenUpdating = False
    .EnableEvents = False
For Each Cell In Rng

If Cell = "ADD" Or Cell = "ANFR" Or Cell = "CADV" Or Cell = "DEF" Or Cell = "DEFD" Or Cell = "OIL" Or Cell = "PROP" Or Cell = "STAX" Or Cell = "UREA" Or Cell = "WWFL" Or Cell = "NGAS" Then
    Cell.EntireRow.Delete
End If

Next Cell
End With
End Sub

Спасибо!


person Hcbrucey    schedule 12.08.2015    source источник
comment
Я предполагаю, что одна из ваших ячеек содержит, например, Add, которое не полностью прописно, как ADD; поэтому он не считается «идентичным» вашему поисковому запросу. См. Мой ответ ниже, в котором устранены некоторые общие «невидимые» различия между текстовыми значениями.   -  person Grade 'Eh' Bacon    schedule 12.08.2015


Ответы (4)


[Ответ взят из предыдущего вопроса здесь: IF-THEN w / strings in VBA]

Насколько «идентичны» две струны? Один из них написан с большой буквы, а другой - нет? Есть ли нули в начале и в конце? Есть ли у кого-то непечатаемые символы?

Попробуйте это, которое превращает Cell в CleanedCell перед использованием в качестве сравнения:

CleanedCell = AllCleanedUp(Cell)

If CleanedCell = "ADD" Or CleanedCell = "ANFR" Or CleanedCell = "CADV" Or CleanedCell = "DEF" Or CleanedCell = "DEFD" Or CleanedCell = "OIL" Or CleanedCell = "PROP" Or CleanedCell = "STAX" Or CleanedCell = "UREA" Or CleanedCell = "WWFL" Or CleanedCell = "NGAS" Then
    Cell.EntireRow.Delete
End If

...

Что относится к следующей функции:

Function AllCleanedUp (DirtyString byVal) As String

    AllCleanedUp = Trim(Application.Clean(Ucase(DirtyString)))

End Function
person Grade 'Eh' Bacon    schedule 12.08.2015

может случиться так, что значения в ячейке находятся в другом регистре или имеют начальные или конечные пробелы. (Я часто нахожу эту проблему при вводе вручную данных)

попробуйте использовать:

If UCase(Trim(Cell.Value)) = "ADD" Or UCase(Trim(Cell.Value)) = "ANFR" Or ....... Then
person Oliver Humphreys    schedule 12.08.2015
comment
Обратите внимание, что также могут быть непечатаемые символы (например, разрывы строк), которые не считаются конечными пробелами и не могут быть «обрезаны». Вместо этого вам также понадобится дополнительная функция «очистки». Подробности смотрите в моем ответе. - person Grade 'Eh' Bacon; 12.08.2015

Это может быть один из других ответов, но я предполагаю, что проблема в том, что когда вы удаляете строку, «ячейка» становится следующей под, а затем вы нажимаете «следующий» и полностью пропускаете эту строку. Например, если вы это сделаете:

Sub test()
Dim cell
For Each cell In Range("A1", "A10")
    cell.EntireRow.Delete
Next cell
End Sub

Вы удалите только строки 1,3,5,7,9

Вы должны выполнить цикл в обратном порядке, что, насколько я знаю, невозможно с a для каждой ячейки в цикле range (...), но может быть выполнено путем итерации по числам следующим образом:

for i=cells(rows.count,"B").end(xlup).row to 2 step -1
    If Cells(i,"B") = "ADD" Or Cells(i,"B") = "ANFR" Or Cells(i,"B") = "CADV" Or Cells(i,"B") = "DEF" Or Cells(i,"B") = "DEFD" Or Cells(i,"B") = "OIL" Or Cells(i,"B") = "PROP" Or Cells(i,"B") = "STAX" Or Cells(i,"B") = "UREA" Or Cells(i,"B") = "WWFL" Or Cells(i,"B") = "NGAS" Then
        Cell.EntireRow.Delete
    End If
next i
person Latch    schedule 12.08.2015
comment
Я полностью согласен с вашими комментариями, но я только добавляю, что вы действительно можете работать в обратном направлении с помощью цикла For, используя оператор For: For x = MAX_VALUE to MIN_VALUE Step - 1 [Step + 1 предполагается; вы также можете выполнить Шаг + 2, чтобы повторять только каждый второй и т. д.] - person Grade 'Eh' Bacon; 12.08.2015
comment
О, это плохо, мой комментарий по этому поводу был не очень ясным, я имел в виду, что (насколько я знаю) вы не можете вернуться назад, если используете для каждой ячейки в диапазоне (...), но вы можете, если вы повторяете над числами. Уточню, спасибо! - person Latch; 12.08.2015
comment
Ах да, вы имеете в виду, что "для каждого" не может вернуться назад. Насколько мне известно, это невозможно, поэтому я снова с вами согласен. - person Grade 'Eh' Bacon; 12.08.2015

я люблю делать :

If Cell LIKE "*ADD*" Or Cell LIKE "*ANFR*" Or Cell LIKE "*CADV*" Or Cell LIKE "*DEF*" Or Cell LIKE "*DEFD*" Or Cell LIKE "*OIL*" Or Cell LIKE "*PROP*" Or Cell LIKE "*STAX*" Or Cell LIKE "*UREA*" Or Cell LIKE "*WWFL*" Or Cell LIKE "*NGAS*" Then
    Cell.EntireRow.Delete
End If

звездочка (*) означает любые буквы, цифры, пробелы ... могут быть до или после (в моем примере) заданных вами значений.

  • это нечувствительно к регистру, поэтому мне это нравится!

Надеюсь на эту помощь.

person mourad    schedule 12.08.2015