День добрый. Я нашел интересный макрос который выделяет строку цветом заданным в ячейке а1 и при выделении иной ячейки формат предыдущей сохраняется. В спойлере комментарий разработчика:
Здравствуйте! Предлагаю свой способ подсветки строки без использования условного форматирования, который не удаляет существующие правила условного форматирования в таблице. Цвет подсветки определяется цветом заливки ячейки А1. Если заливки в ячейке А1 нет, то подсветки строки таблицы с выделенной ячейкой не будет. В подсвечиваемой строке выделенная ячейка остается без заливки, если в ней не сработало условное форматирование, которое имеет приоритет во всех ячейках подсвечиваемой строки. При сохранении файла или активации другого листа подсветка строки убирается. Подсветка столбца мне была не нужна, но ее несложно сделать аналогично подсветке строки, добавив еще один массив.
Вот сам макрос В модуль листа: [vba]
Код
Private Sub Worksheet_Deactivate() 'если активируется другой лист и есть подсветка, то подсветка убирается Call restoreFill End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim dataRng As Range ' диапазон данных таблицы Dim rowRng As Range ' диапазон ячеек в строке таблицы для подсветки Dim celRng As Range ' ячейки в диапазоне подсветки rowRng Dim n As Integer Call restoreFill If Range("A1").Interior.ColorIndex = xlNone Then Exit Sub 'если подсветка отключена, то выход If Target.Count > 1 Then Exit Sub 'если выделено больше одной ячейки Set dataRng = Range(Cells(7, 2), Cells(ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1, _ ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1)) ' диапазон данных таблицы, Cells(7, 2) - адрес (начало) диапазона данных таблицы If Not Intersect(Target, dataRng) Is Nothing Then 'если ячейка выделена в диапазоне данных таблицы Set rowRng = Intersect(dataRng, Target.EntireRow) 'строка таблицы с выделенной ячейкой в диапазоне данных таблицы ReDim saveColor(rowRng.Cells.Count) 'размерность массива = ширина таблицы + нулевой элемент массива для адреса диапазона подсветки n = 0 saveColor(n) = rowRng.Address 'адрес диапазона подсветки в нулевой элемент массива For Each celRng In rowRng 'перебор ячеек в диапазоне подсветки n = n + 1 'номер следующего элемента массива saveColor(n) = celRng.Interior.ColorIndex 'индекс заливки текущей ячейки в массив Next celRng rowRng.Interior.ColorIndex = Range("A1").Interior.ColorIndex 'заливка диапазона подсветки цветом заливки ячейки А1 Target.Interior.ColorIndex = xlNone 'выделенная ячейка без заливки End If End Sub
Sub restoreFill() 'проверка включения подсветки, если подсветка была включена, то восстановление первоначальной (до подсветки) заливки в этой строке Dim c As Integer Dim cel_InRng As Range ' ячейки в диапазоне подсветки rowRng If (Not Not saveColor) <> 0 Then 'если массив не пустой (так проверяется массив, объявленный как Dim saveColor() ), т.е. диапазон подсветки был определен ранее c = 0 For Each cel_InRng In Range(saveColor(0)) 'перебор ячеек в диапазоне, указанном в нулевом элементе массива c = c + 1 'номер следующего элемента массива cel_InRng.Interior.ColorIndex = saveColor(c) 'заливка ячеек цветами, сохраненными в массиве Next cel_InRng Erase saveColor 'удаление массива Else Exit Sub End If End Sub
[/vba] В модуль книги: [vba]
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ActiveSheet.Name = "Имя листа с таблицей" Then Call Sheets("Имя листа с таблицей").restoreFill End Sub
[/vba] В стандартный модуль: [vba]
Код
Public saveColor() ' адрес подсвечиваемого диапазона и сохраненные цвета заливки подсвечиваемых ячеек таблицы до подсветки
[/vba] Проверил его на своем файле - работает, но: - почему то выделение идет инвертированным цветом, а не заданным в ячейке а1 - цвет выделенных ячеек после выделения меняется на иной (см. файл) Помогите пожалуйста устранить эти проблемы А также как его доработать чтобы выделение работало на всех листах файла
День добрый. Я нашел интересный макрос который выделяет строку цветом заданным в ячейке а1 и при выделении иной ячейки формат предыдущей сохраняется. В спойлере комментарий разработчика:
Здравствуйте! Предлагаю свой способ подсветки строки без использования условного форматирования, который не удаляет существующие правила условного форматирования в таблице. Цвет подсветки определяется цветом заливки ячейки А1. Если заливки в ячейке А1 нет, то подсветки строки таблицы с выделенной ячейкой не будет. В подсвечиваемой строке выделенная ячейка остается без заливки, если в ней не сработало условное форматирование, которое имеет приоритет во всех ячейках подсвечиваемой строки. При сохранении файла или активации другого листа подсветка строки убирается. Подсветка столбца мне была не нужна, но ее несложно сделать аналогично подсветке строки, добавив еще один массив.
Вот сам макрос В модуль листа: [vba]
Код
Private Sub Worksheet_Deactivate() 'если активируется другой лист и есть подсветка, то подсветка убирается Call restoreFill End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim dataRng As Range ' диапазон данных таблицы Dim rowRng As Range ' диапазон ячеек в строке таблицы для подсветки Dim celRng As Range ' ячейки в диапазоне подсветки rowRng Dim n As Integer Call restoreFill If Range("A1").Interior.ColorIndex = xlNone Then Exit Sub 'если подсветка отключена, то выход If Target.Count > 1 Then Exit Sub 'если выделено больше одной ячейки Set dataRng = Range(Cells(7, 2), Cells(ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1, _ ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1)) ' диапазон данных таблицы, Cells(7, 2) - адрес (начало) диапазона данных таблицы If Not Intersect(Target, dataRng) Is Nothing Then 'если ячейка выделена в диапазоне данных таблицы Set rowRng = Intersect(dataRng, Target.EntireRow) 'строка таблицы с выделенной ячейкой в диапазоне данных таблицы ReDim saveColor(rowRng.Cells.Count) 'размерность массива = ширина таблицы + нулевой элемент массива для адреса диапазона подсветки n = 0 saveColor(n) = rowRng.Address 'адрес диапазона подсветки в нулевой элемент массива For Each celRng In rowRng 'перебор ячеек в диапазоне подсветки n = n + 1 'номер следующего элемента массива saveColor(n) = celRng.Interior.ColorIndex 'индекс заливки текущей ячейки в массив Next celRng rowRng.Interior.ColorIndex = Range("A1").Interior.ColorIndex 'заливка диапазона подсветки цветом заливки ячейки А1 Target.Interior.ColorIndex = xlNone 'выделенная ячейка без заливки End If End Sub
Sub restoreFill() 'проверка включения подсветки, если подсветка была включена, то восстановление первоначальной (до подсветки) заливки в этой строке Dim c As Integer Dim cel_InRng As Range ' ячейки в диапазоне подсветки rowRng If (Not Not saveColor) <> 0 Then 'если массив не пустой (так проверяется массив, объявленный как Dim saveColor() ), т.е. диапазон подсветки был определен ранее c = 0 For Each cel_InRng In Range(saveColor(0)) 'перебор ячеек в диапазоне, указанном в нулевом элементе массива c = c + 1 'номер следующего элемента массива cel_InRng.Interior.ColorIndex = saveColor(c) 'заливка ячеек цветами, сохраненными в массиве Next cel_InRng Erase saveColor 'удаление массива Else Exit Sub End If End Sub
[/vba] В модуль книги: [vba]
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ActiveSheet.Name = "Имя листа с таблицей" Then Call Sheets("Имя листа с таблицей").restoreFill End Sub
[/vba] В стандартный модуль: [vba]
Код
Public saveColor() ' адрес подсвечиваемого диапазона и сохраненные цвета заливки подсвечиваемых ячеек таблицы до подсветки
[/vba] Проверил его на своем файле - работает, но: - почему то выделение идет инвертированным цветом, а не заданным в ячейке а1 - цвет выделенных ячеек после выделения меняется на иной (см. файл) Помогите пожалуйста устранить эти проблемы А также как его доработать чтобы выделение работало на всех листах файлаmitox
Попробовал сам второй раз поразбираться как умею. Понял что макрос работает на всех листах если скопировать на эти листы макросы, но тогда вопрос: Для чего эта часть вставлена в модуль? [vba]
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ActiveSheet.Name = "Имя листа с таблицей" Then Call Sheets("Имя листа с таблицей").restoreFill End Sub
[/vba]
Ну и как избавиться от инвертирования цвета и почему цвет изменяется на иной после ухода с ячейки?
Пжалста - подскажите
Попробовал сам второй раз поразбираться как умею. Понял что макрос работает на всех листах если скопировать на эти листы макросы, но тогда вопрос: Для чего эта часть вставлена в модуль? [vba]
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ActiveSheet.Name = "Имя листа с таблицей" Then Call Sheets("Имя листа с таблицей").restoreFill End Sub
[/vba]
Ну и как избавиться от инвертирования цвета и почему цвет изменяется на иной после ухода с ячейки?
Так понял что этот модуль видимо предотвращает сохранение цвета в последней выделенной ячейке при сохранении и закрытии файла. Как его переписать что бы он работал для всех листов книги?
Так понял что этот модуль видимо предотвращает сохранение цвета в последней выделенной ячейке при сохранении и закрытии файла. Как его переписать что бы он работал для всех листов книги?mitox