У меня есть лист с ~ 300 строками и 30 столбцами чисел. Мне нужно покрасить ячейки в результате обработки события SelectionChange
. Производительность важна как вопрос юзабилити.
Первый способ - взять Range
объект для каждой ячейки, которую я собираюсь выделить:
For x = 1 To 30: For y = 1 To lastNonemptyRow
If someClause(CInt(Cells(rowIdx, colIdx).Value)) Then
Range(Cells(rowIdx, colIdx).Value).Interior.Color = Rgb(255, 0, 0)
End If
Next y: Next x
Этот путь довольно медленный даже при отключенном ScreenUpdating
.
Второй способ - создать строку с набором адресов:
addressesToHighlight = ""
For x = 1 To 30: For y = 1 To lastNonemptyRow
If someClause(CInt(Cells(rowIdx, colIdx).Value)) Then
addressesToHighlight = addressesToHighlight & Cells(rowIdx, colIdx).Address & ", "
End If
Next y: Next x
Range(addressesToHighlight).Interior.Color = Rgb(255, 0, 0)
Этот способ выдает ошибку, когда выделено 42 или более ячеек.
Третий способ - создать диапазон как объединение двух диапазонов, которые являются ранее накопленными ячейками и текущей ячейкой:
Set resultRange = Nothing
For x = 1 To 30: For y = 1 To lastNonemptyRow
If someClause(CInt(Cells(rowIdx, colIdx).Value)) Then
If resultRange is Nothing then
Set resultRange = Range(Cells(rowIdx, colIdx))
Else
Set resultRange = Union(resultRange, Range(Cells(rowIdx, colIdx)))
End if
End If
Next y: Next x
resultRange.Interior.Color = RGB(255, 0, 0)
Этот способ довольно быстрый, но после 1000 ячеек время его выполнения увеличивается в геометрической прогрессии: 1000 ячеек выделяются за 1,5 с, 2000 ячеек выделяются за 8 с.
Какой самый быстрый способ указать и выделить произвольные 1000..10000 ячеек?