У меня есть макрос расписания, и я задаю случайные цвета каждой ячейке первой строки и называю в них заголовки. Однако иногда случайным образом появляется черный цвет, что бесполезно, поскольку контент также черный. Как мне избежать черного цвета (и потенциально близкого к черному цветам, где контент не виден) Ниже приведена моя часть текущего кода (я не помещаю весь цикл 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((55 * Rnd) + 2)? (Не испытано)
Я попробовал Int((56*Rnd)+2) и несколько раз выдавал ошибку, когда случайное число выходило за пределы, поэтому не знаю, будет ли Int((55*Rnd)+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
Не эксперт, но, возможно, можно присвоить переменную, которую вы сверите со списком чисел темного цвета? Что-то вроде:
RandColor = Int((56 * Rnd) + 1)
иIf RandColor = 1 Then RandColor + 1
(хотя сам не могу разобраться).