Как предотвратить черный цвет в клетке

У меня есть макрос расписания, и я задаю случайные цвета каждой ячейке первой строки и называю в них заголовки. Однако иногда случайным образом появляется черный цвет, что бесполезно, поскольку контент также черный. Как мне избежать черного цвета (и потенциально близкого к черному цветам, где контент не виден) Ниже приведена моя часть текущего кода (я не помещаю весь цикл for, так как он здесь неуместен, но этот код в основном повторяется для каждой ячейки первой строки):

With ActiveSheet
    rg.Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Font.Size = 18
        .ColumnWidth = 30
        .RowHeight = 80
        .Interior.ColorIndex = Int((56 * Rnd) + 1)
    End With
End With

Не эксперт, но, возможно, можно присвоить переменную, которую вы сверите со списком чисел темного цвета? Что-то вроде: RandColor = Int((56 * Rnd) + 1) и If RandColor = 1 Then RandColor + 1 (хотя сам не могу разобраться).

Excellor 19.04.2024 15:53

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

cybernetic.nomad 19.04.2024 16:00

Будет ли работать RandColor = Int((55 * Rnd) + 2)? (Не испытано)

Tom Sharpe 19.04.2024 16:46

Я попробовал Int((56*Rnd)+2) и несколько раз выдавал ошибку, когда случайное число выходило за пределы, поэтому не знаю, будет ли Int((55*Rnd)+2) работать.

Barbarian 19.04.2024 16:52
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать что-то вроде создания переменной для случайного цвета.

Dim RandCol As Integer    
RandCol = Int((56 * Rnd) + 1)

а затем повторяйте это, пока оно не перестанет равняться 1

Do Until RandCol <> 1
    RandCol = Int((56 * Rnd) + 1)
Loop

или просто сделай это еще раз

if RandCol = 1 then
    RandCol = Int((56 * Rnd) + 1)
end if

а затем используйте это как индекс цвета

.Interior.ColorIndex = RandCol 

Вероятно, самый простой способ — создать массив допустимых значений индекса цвета и создать случайное число для выбора цвета из этого массива.

Function getRandomColorindex() As Long
    Dim validColors
    validColors = Array(2, 3, 4, 5, 6, 7, 8, 9, 10, _
                       12, 13, 14, 15, 16, 17, 18, 19, _
                       20, 22, 23, 24, 26, 27, 28, 29, _
                       31, 33, 34, 35, 36, 37, 38, 39, _
                       40, 41, 42, 43, 44, 45, 46, 47, 48, _
                       50, 53, 54)

    Dim i As Long
    i = Int((UBound(validColors) + 1) * Rnd)
    getRandomColorindex = validColors(i)
End Function

Адаптируйте определение массива к своим потребностям: если есть какие-то цвета, которые вам не нужны, просто удалите их. Если есть какие-то цвета, которые я пропустил, но вы хотите, добавьте их. Чтобы было всего 4 цвета,

Обратите внимание, что вам не нужно использовать Select для работы с диапазоном.

With rg
    (... set all your properties.. )
    .Interior.colorIndex = getRandomColorindex
End With 

Альтернативой может быть использование всех цветов (даже черного), но изменение цвета шрифта на белый, если цвет фона слишком темный. Следующая функция сообщит, должен ли цвет фона использовать черный или белый цвет текста, он адаптирован из https://stackoverflow.com/a/3943023/7599798

Public Function isDarkColor(color As Long)
    Dim r As Long, g As Long, b As Long
    getRGB color, r, g, b
    
    isDarkColor = ((r * 0.299 + g * 0.587 + b * 0.114) < 130)
End Function

И ваш код изменится на

With rg
    (... set all your properties.. )
    .Interior.colorIndex = Int((56 * Rnd) + 1)
    .Font.color = IIf(isDarkColor(.Interior.color), vbWhite, vbBlack)
End With 

Другие вопросы по теме

Похожие вопросы

Как подсчитать непустые ячейки, если в определенном диапазоне есть записанные значения
Обрезать данные в ячейке до определенного формата
Определите сгруппированные строки на основе нескольких условий с помощью PowerQuery
Формула сопоставления, игнорирующая значения NULL
Курорт от спуска к подъему
Необходимо искать значение в нескольких столбцах, возвращать значение в другом столбце каждый раз, когда появляется первое значение
Как создать формулу развернутого массива в Excel с помощью ПОИСКПОЗ или XLOOKUP, которая не пропускает строки
Создайте электронное письмо Outlook и добавьте именованный диапазон Excel и 3 диаграммы из другого листа в тело электронного письма в виде изображений
Скопируйте несколько строк и вставьте их на другой лист, пропуская 5 строк
Как объединить слова с помощью разделителя на основе значений в другом столбце?