Отметьте все ячейки, в которых нет двух указанных слов - PullRequest
1 голос
/ 13 марта 2019

Я пишу код, который должен пометить в диапазоне красным цветом все ячейки, в которых нет слов "bel" и "hsa".

Sub Check()
    Range("c2:c49").Select

    For Each cell In Selection
        If (cell.Value <> "bel" Or cell.Value <> "hsa") Then
            cell.Interior.Color = RGB(255, 0, 0)
        End If
    Next cell
End Sub

Это работает, если у меня только одинаргумент.С двумя аргументами, как указано выше, он отмечает все ячейки в диапазоне красного цвета.

Неправильно ли указан оператор Or?

1 Ответ

3 голосов
/ 13 марта 2019

Обратите внимание, что эту задачу можно решить с помощью Условное форматирование , которое имеет то преимущество, что оно обновляется автоматически при изменении данных и вам не нужно запускать процедуру снова и снова.


Это просто для улучшения вашей кодировки:

  1. Избегайте использования Select в Excel VBA .• Вместо этого используйте диапазон напрямую, а также укажите, в каком листе находится диапазон.Если вы этого не сделаете, Excel угадает, какой лист вы хотели использовать, и он может потерпеть неудачу:

    For Each cell In Worksheets("MySheet").Range("C2:C49")
    
  2. Я рекомендую всегда активировать Option Explicit и объявлять все ваши переменные.Это очень хорошая практика, которая предотвращает множество ошибок: в редакторе VBA перейдите на Инструменты Параметры Требуется объявление переменных .

  3. Ваша проблема заключается в том, что если вы хотите исключить "bel" и "hsa", то (конечно) вам нужно использовать оператор And.

    Cell.Value <> "bel" And Cell.Value <> "hsa"
    

    Обратите внимание, что <> против = всегда меняет логику операторов or/and.В качестве альтернативы вы можете использовать:

    Not (Cell.Value = "bel" Or Cell.Value = "hsa")
    

    … что даст вам тот же результат.Используйте тот, который вам легче понять.


Таким образом, вы получите что-то вроде:

Option Explicit

Public Sub ValidateAndColorCells()
    Dim CheckRange As Range
    Set CheckRange = Worksheets("YourSheet").Range("C2:C49") 'Always specify the sheet!

    Dim Cell As Range '<-- declare ALL your variables
    For Each Cell In CheckRange 
        If Cell.Value <> "bel" And Cell.Value <> "hsa" Then
            Cell.Interior.Color = RGB(255, 0, 0)
        End If
    Next Cell 
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...