Необходимо разукрасить расписание (цвет заливки и шрифта) в зависимости от того или иного условия.
Сначала хотел сделать через Условное Форматирование, но дело в том, что расписание будут заполнять третьи лица, которые могут случайно что-нибудь вырезать/вставить и это наплодит дубликаты в правилах УФ (а когда правил и так под 30 штук, редактировать их потом сложновато). Возможность задать диапазон в УФ проименованным диапазоном сняло бы проблему, но не судьба.
Если задать форматирование через макрос, то будет сложно затем изменять форматирование ячеек.
Возникла идея иметь коды на одной странице, форматировать их вручную, а расписание закрашивать в зависимости от того как эти коды отформатированы. Насколько сложно это реализовать?
Подскажите, пожалуйста, как грамотнее разукрасить таблицу или проблема надумана и стоит использовать обычный УФ просто надавав всем по рукам )?
диапазоны: Schedule – данные. то, что надо закрашивать Codes – закодированные условные обозначения
Доброго дня,
Необходимо разукрасить расписание (цвет заливки и шрифта) в зависимости от того или иного условия.
Сначала хотел сделать через Условное Форматирование, но дело в том, что расписание будут заполнять третьи лица, которые могут случайно что-нибудь вырезать/вставить и это наплодит дубликаты в правилах УФ (а когда правил и так под 30 штук, редактировать их потом сложновато). Возможность задать диапазон в УФ проименованным диапазоном сняло бы проблему, но не судьба.
Если задать форматирование через макрос, то будет сложно затем изменять форматирование ячеек.
Возникла идея иметь коды на одной странице, форматировать их вручную, а расписание закрашивать в зависимости от того как эти коды отформатированы. Насколько сложно это реализовать?
Подскажите, пожалуйста, как грамотнее разукрасить таблицу или проблема надумана и стоит использовать обычный УФ просто надавав всем по рукам )?
диапазоны: Schedule – данные. то, что надо закрашивать Codes – закодированные условные обозначенияuser0
Макрос на событие открытия\закрытия книги, который будет форматировать ячейки в зависимости от значения. Работать будет долго. В модуль книги: [vba]
Код
Private Sub Workbook_Open() Dim rCell As Range Application.ScreenUpdating = False For Each rCell In ThisWorkbook.Sheets(1).UsedRange 'проход по всем ячейкам используемого диапазона листа 1 If rCell .Value > 0.1 Then ' Здесь ваши условия rCell .Font.Color = -16777024 ' здесь ваше форматирование rCell .Interior.Color = 12040191 ' Else - второй список условий и форматирование. И так далее. End If Next Application.ScreenUpdating = True End Sub
[/vba]
Макрос на событие открытия\закрытия книги, который будет форматировать ячейки в зависимости от значения. Работать будет долго. В модуль книги: [vba]
Код
Private Sub Workbook_Open() Dim rCell As Range Application.ScreenUpdating = False For Each rCell In ThisWorkbook.Sheets(1).UsedRange 'проход по всем ячейкам используемого диапазона листа 1 If rCell .Value > 0.1 Then ' Здесь ваши условия rCell .Font.Color = -16777024 ' здесь ваше форматирование rCell .Interior.Color = 12040191 ' Else - второй список условий и форматирование. И так далее. End If Next Application.ScreenUpdating = True End Sub
Да, в общем-то, совсем не сложно. Я так у себя давно уже девчонкам табель настроил. Sokr - это динамический диапазон с раскрашенными как нужно ячейками. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Count > 1 Or Target = Empty Then Exit Sub r0_ = 7 r1_ = Range("C" & Rows.Count).End(xlUp).Row g = Target If Not Intersect(Target, Range("D" & r0_, "IL" & r1_)) Is Nothing Then Application.ScreenUpdating = 0 Application.EnableEvents = 0 r_ = WorksheetFunction.Match(Target, [Sokr], 0) + [Sokr].Row - 1 Sheet1.Range("B" & r_).Copy Target Application.EnableEvents = 1 Application.ScreenUpdating = 1 End If On Error GoTo 0 End Sub
Да, в общем-то, совсем не сложно. Я так у себя давно уже девчонкам табель настроил. Sokr - это динамический диапазон с раскрашенными как нужно ячейками. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Count > 1 Or Target = Empty Then Exit Sub r0_ = 7 r1_ = Range("C" & Rows.Count).End(xlUp).Row g = Target If Not Intersect(Target, Range("D" & r0_, "IL" & r1_)) Is Nothing Then Application.ScreenUpdating = 0 Application.EnableEvents = 0 r_ = WorksheetFunction.Match(Target, [Sokr], 0) + [Sokr].Row - 1 Sheet1.Range("B" & r_).Copy Target Application.EnableEvents = 1 Application.ScreenUpdating = 1 End If On Error GoTo 0 End Sub
Спасибо всем откликнувшимся! Вариант от _Boroda_ самый оптимальный и удобный
Подскажите, пожалуйста, как его еще немного доработать, чтобы на листе с расписанием: 1) форматирование применялось при вставке значений из буфера в несколько ячеек. 2) форматирование снималось при удалении значения из ячейки. Возможно просто добавить в коды/сокращения пустую ячейку с форматированием по умолчаню, но у меня такой вариант не работает (
Спасибо всем откликнувшимся! Вариант от _Boroda_ самый оптимальный и удобный
Подскажите, пожалуйста, как его еще немного доработать, чтобы на листе с расписанием: 1) форматирование применялось при вставке значений из буфера в несколько ячеек. 2) форматирование снималось при удалении значения из ячейки. Возможно просто добавить в коды/сокращения пустую ячейку с форматированием по умолчаню, но у меня такой вариант не работает (user0
п. 2 да, это я слишком много стер в своем макросе. Конечно, так и нужно сделать Замените третью строку на [vba]
Код
If Target = Empty Then Target.ClearFormats: Exit Sub If Target.Count > 1 Then Exit Sub
[/vba] А вот п. 1 не очень понимаю зачем. Если нужно что-то кучей скопировать-вставить, так копируйте из листа Schedule. Тогда точно не будет ошибок ввода. А если копировать из другого места, то можно вставить что-то не из списка. Если все-таки очень хочется - то сделать конечно можно, но я бы не советовал. Может быть, именно поэтому у меня дома Ваш файл виснет и ни в какую работать не хочет.
п. 2 да, это я слишком много стер в своем макросе. Конечно, так и нужно сделать Замените третью строку на [vba]
Код
If Target = Empty Then Target.ClearFormats: Exit Sub If Target.Count > 1 Then Exit Sub
[/vba] А вот п. 1 не очень понимаю зачем. Если нужно что-то кучей скопировать-вставить, так копируйте из листа Schedule. Тогда точно не будет ошибок ввода. А если копировать из другого места, то можно вставить что-то не из списка. Если все-таки очень хочется - то сделать конечно можно, но я бы не советовал. Может быть, именно поэтому у меня дома Ваш файл виснет и ни в какую работать не хочет._Boroda_
п2. файл у меня тоже зависает после замены третьей строки.. это наверное из-за того, что эксель все пустые ячейки пытается очистить, а не одну (
п1. я просто обычно копирую и вставляю как значения, без сохранения формата, для того чтобы форматирование границ ячеек (недели, месяцы) не сбилось..
п2. файл у меня тоже зависает после замены третьей строки.. это наверное из-за того, что эксель все пустые ячейки пытается очистить, а не одну (
п1. я просто обычно копирую и вставляю как значения, без сохранения формата, для того чтобы форматирование границ ячеек (недели, месяцы) не сбилось..user0
Блин, я валенок. Application.EnableEvents = 0 после Target.ClearFormats конечно, он уходит в бесконечный цикл Ща переделаю
Во. Вроде так [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Application.ScreenUpdating = 0 Application.EnableEvents = 0 If Not Intersect(Target, Range("D" & r0_, "IL" & r1_)) Is Nothing Then n_ = Target.Cells.Count r0_ = 7 r1_ = Range("C" & Rows.Count).End(xlUp).Row For i = 1 To n_ If Not Intersect(Target(i), Range("D" & r0_, "IL" & r1_)) Is Nothing Then If Target(i) = Empty Then Target(i).ClearFormats: GoTo A r_ = WorksheetFunction.Match(Target(i), [Sokr], 0) + [Sokr].Row - 1 Sheet1.Range("B" & r_).Copy Target(i) A: End If Next i End If Application.EnableEvents = 1 Application.ScreenUpdating = 1 On Error GoTo 0 End Sub
[/vba]
Блин, я валенок. Application.EnableEvents = 0 после Target.ClearFormats конечно, он уходит в бесконечный цикл Ща переделаю
Во. Вроде так [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Application.ScreenUpdating = 0 Application.EnableEvents = 0 If Not Intersect(Target, Range("D" & r0_, "IL" & r1_)) Is Nothing Then n_ = Target.Cells.Count r0_ = 7 r1_ = Range("C" & Rows.Count).End(xlUp).Row For i = 1 To n_ If Not Intersect(Target(i), Range("D" & r0_, "IL" & r1_)) Is Nothing Then If Target(i) = Empty Then Target(i).ClearFormats: GoTo A r_ = WorksheetFunction.Match(Target(i), [Sokr], 0) + [Sokr].Row - 1 Sheet1.Range("B" & r_).Copy Target(i) A: End If Next i End If Application.EnableEvents = 1 Application.ScreenUpdating = 1 On Error GoTo 0 End Sub
Маленький вопрос, а можно как-нибудь детализировать форматирование, чтобы применялся только шрифт и цвет, не затрагивая имеющихся границ ячеек (и также при удалении)? Хотя конечно можно и вручную потом границы оформить как надо.
Огромное спасибо, теперь все работает как надо.
Маленький вопрос, а можно как-нибудь детализировать форматирование, чтобы применялся только шрифт и цвет, не затрагивая имеющихся границ ячеек (и также при удалении)? Хотя конечно можно и вручную потом границы оформить как надо.user0
Сообщение отредактировал user0 - Понедельник, 29.07.2013, 06:27