Как проверить, является ли диапазон.Интерьер.ColorIndex=xlNone простым способом?

#excel #vba

#excel #vba

Вопрос:

Я попробовал несколько способов проверить, окрашена ли какая-либо ячейка в пределах диапазона, и задаюсь вопросом, есть ли более простой способ сделать то же самое.

Моя первая попытка:

 If Range("A1:O50").Interior.ColorIndex = xlNone Then MsgBox ("Nothing is colored") Else MsgBox ("Sth is colored")
 

Это сработало хорошо, хотя чего я действительно хочу, так это запустить sth, когда любая ячейка в пределах диапазона окрашена.


2-я попытка:

 If Not Range("A1:O50").Interior.ColorIndex = xlNone Then MsgBox ("Sth is colored") Else MsgBox ("Nothing is colored")
 

Это не сработало. Кажется, что VBA не понимает отрицания «Диапазона.Интерьер.ColorIndex = xlNone».

Я знаю, что могу сделать это таким образом:

 If Range("A1:O50").Interior.ColorIndex = xlNone Then Else MsgBox ("Sth is colored")
 

Однако это не так интуитивно понятно и не просто в использовании, когда есть много условий.


3-я попытка:

 If CBool(Range("A1:O50").Interior.ColorIndex = xlNone) = False Then MsgBox ("Sth is colored")
 

На этот раз я попытался преобразовать …ColorIndex=xlNone присваивает логическое значение, но возвращает «недопустимое использование null», когда любая ячейка действительно была окрашена.


4- я попытка:

 Dim b As Boolean
If Range("A1:O50").Interior.ColorIndex = xlNone Then b = True Else b = False
If b = False Then MsgBox ("Sth is colored")
 

Это сработало нормально, но для меня это недостаточно просто. Я хочу сделать это в 1-2 строках и по возможности не использовать переменную.

Есть ли более простой способ выполнить ту же задачу? Приветствуется любое вдохновение. Большое спасибо!

Комментарии:

1. Во 2-й попытке вы отрицаете Range("A1:O50").Interior.ColorIndex и сравниваете его с xlNone вместо отрицания сравнения

2. @Nacorid Спасибо за ответ. Однако Not (Range("A1:O50").Interior.ColorIndex = xlNone) и Range("A1:O50").Interior.ColorIndex <> xlNone это не сработало.

3. Ах, да, ColorIndex на a Range с ячейками разного цвета вернется Null . Вы должны перебирать свои ячейки для проверки. Или сделайте вывод, Null что хотя бы одна ячейка окрашена иначе, чем другие.

Ответ №1:

Вы могли бы поместить это в оператор select Case; Результат Range(«A1:O50»).Интерьер.ColorIndex может быть xlNone, Null или длинным, но Null не может быть захвачен оператором Select (поэтому предложение Else) и нет необходимости в переменных, плюс его легко расширить с помощью дополнительных условий.

     Select Case Range("A1:O50").Interior.ColorIndex
        Case xlNone: MsgBox "Nothing is colored"
        Case Else: MsgBox "Sth is colored"
    End Select
 

Ответ №2:

@Nacorid @EvR

Спасибо за ваши предложения! В конце концов я нашел ответ, который мне нужен.

 If Not Range("A1:B1").Interior.ColorIndex = xlNone Or IsNull(Range("A1:B1").Interior.ColorIndex) Then MsgBox ("colored")
 

Теперь я могу сделать интерьер.Проверка ColorIndex в одной строке, плюс я могу добавить все остальные условия в эту единственную строку. Еще раз спасибо за ваши советы 🙂

Ответ №3:

Как насчет чего-то подобного:

 Sub test()
Dim cell As Range
Dim rng As Range
Dim sht As Worksheet
Dim n As Long
n = 0
Set sht = ThisWorkbook.Worksheets("Sheet1")
Set rng = sht.Range("A1:O20")
For Each cell In rng.Cells
    If cell.Interior.ColorIndex <> xlNone Then
        n = n   1
    End If
Next cell
Debug.Print n amp; " colored cells found"
End Sub