#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
на aRange
с ячейками разного цвета вернется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