Добрый день. Не получается закончить код по четырем, хотя по сути трем, условиям для изменения цвета ячейки из заданого диапазона. Мои эксперементы приводили только к "Тришкиному кафтану" если первое, второе условие описал, то остальные рушаться. Не могу свести все в кучу. Суть проблемы: имеется столбец с датами которые нужно временно проконтролировать (условно столбец "В") в котором надо закрасить ячейки желтым за 10 дней до сегодняшней даты, после сегодняшней даты в течении 10 дней - ячейка с красной заливкой, а затем снова бесцветная. Помогите пожалуйста завершить код. Файл с моими потугами прилагаю.
Добрый день. Не получается закончить код по четырем, хотя по сути трем, условиям для изменения цвета ячейки из заданого диапазона. Мои эксперементы приводили только к "Тришкиному кафтану" если первое, второе условие описал, то остальные рушаться. Не могу свести все в кучу. Суть проблемы: имеется столбец с датами которые нужно временно проконтролировать (условно столбец "В") в котором надо закрасить ячейки желтым за 10 дней до сегодняшней даты, после сегодняшней даты в течении 10 дней - ячейка с красной заливкой, а затем снова бесцветная. Помогите пожалуйста завершить код. Файл с моими потугами прилагаю.Shylo
Логика: 1. если пусто то бесцветно. 2. Проверяем условия в select case true за десять дней до СЕГОДНЯ() красим в желт после СЕГОДНЯ()+10 дней, красим в красный после СЕГОДНЯ()+11 дней, опять бесцветно 3. остался вопрос что делать с сегодня? - по коду вижу. И действительно - УФ ведь решает.
Логика: 1. если пусто то бесцветно. 2. Проверяем условия в select case true за десять дней до СЕГОДНЯ() красим в желт после СЕГОДНЯ()+10 дней, красим в красный после СЕГОДНЯ()+11 дней, опять бесцветно 3. остался вопрос что делать с сегодня? - по коду вижу. И действительно - УФ ведь решает.Hugo
Полностью согласен, что УФ проще и быстрее, но у меня такие условия (потому и писал в ветку VBA). Hugo, через Select case тоже пытался но знаний маловато, хотя у Гарнаева и расписано все по полочкам. У меня все время не клеится свести в кучу простые проверки. Оду сделал, вторую. Третью влепил, какая то из двух первых убежала.
Полностью согласен, что УФ проще и быстрее, но у меня такие условия (потому и писал в ветку VBA). Hugo, через Select case тоже пытался но знаний маловато, хотя у Гарнаева и расписано все по полочкам. У меня все время не клеится свести в кучу простые проверки. Оду сделал, вторую. Третью влепил, какая то из двух первых убежала.Shylo
Если внести дату - всё должно быть ОК. Если текст - смотря как Эксель этот текст распознает. Я лично вносил 12/07 энтер Проверил - ошибка в коде, извиняюсь: [vba]
Код
Case Target.Value < (Fix(Now()) - 10): Target.Interior.ColorIndex = xlNone
[/vba] такая строка должна быть.
Если внести дату - всё должно быть ОК. Если текст - смотря как Эксель этот текст распознает. Я лично вносил 12/07 энтер Проверил - ошибка в коде, извиняюсь: [vba]
Код
Case Target.Value < (Fix(Now()) - 10): Target.Interior.ColorIndex = xlNone
Я себе представлял реализацию на разности и сумме (DateDiff-10 дней и DateAdd+10 дней) от текущей даты и исходя из этого прописать вышеописанные условия. Извините, но опыта маловато, может и выбрал не самый лучший вариант.
Я себе представлял реализацию на разности и сумме (DateDiff-10 дней и DateAdd+10 дней) от текущей даты и исходя из этого прописать вышеописанные условия. Извините, но опыта маловато, может и выбрал не самый лучший вариант.Shylo
Если не затруднит, объясните этот Target, мне не попадалось ни в одной книжке ого простое (понятное описание), хотя его часто используют. И вы использовали Now которая возвращает и дату и время, а почему не просто Date?
Если не затруднит, объясните этот Target, мне не попадалось ни в одной книжке ого простое (понятное описание), хотя его часто используют. И вы использовали Now которая возвращает и дату и время, а почему не просто Date?Shylo
Сообщение отредактировал Shylo - Воскресенье, 23.07.2023, 22:19
Target - это переменная, можно другое название поставить, не суть как назвать. Это будет означать тот диапазон листа, который будет обрабатываться процедурой события.
Target - это переменная, можно другое название поставить, не суть как назвать. Это будет означать тот диапазон листа, который будет обрабатываться процедурой события.Hugo
Да. Диапазон устанавливаем чтоб на лишнее не реагировать. А с переменной можно хоть так обойтись: [vba]
Код
Private Sub Worksheet_Change(ByVal ццц As Range) With ццц If .Cells.Count > 1 Then Exit Sub If Not Intersect(ццц, Range("B2:B10")) Is Nothing Then
Select Case True Case .Value = "": .Interior.ColorIndex = xlNone Case .Value < (Fix(Now()) - 10): .Interior.ColorIndex = xlNone Case .Value <= Fix(Now()): .Interior.Color = vbYellow Case .Value > (Fix(Now()) + 10): .Interior.ColorIndex = xlNone Case .Value <= (Fix(Now()) + 10): .Interior.Color = vbRed End Select End If End With End Sub
[/vba]
Да. Диапазон устанавливаем чтоб на лишнее не реагировать. А с переменной можно хоть так обойтись: [vba]
Код
Private Sub Worksheet_Change(ByVal ццц As Range) With ццц If .Cells.Count > 1 Then Exit Sub If Not Intersect(ццц, Range("B2:B10")) Is Nothing Then
Select Case True Case .Value = "": .Interior.ColorIndex = xlNone Case .Value < (Fix(Now()) - 10): .Interior.ColorIndex = xlNone Case .Value <= Fix(Now()): .Interior.Color = vbYellow Case .Value > (Fix(Now()) + 10): .Interior.ColorIndex = xlNone Case .Value <= (Fix(Now()) + 10): .Interior.Color = vbRed End Select End If End With End Sub
Потому что Now() - это дата + время. А нужна только дата, ведь например есть разница > (Fix(Now()) + 10) или > (Now() + 10) что уже не сегодня +10, а сегодня +10 + 22:53 Да даже + 1 секунда это уже выпадет из вилки в 10 дней.
Потому что Now() - это дата + время. А нужна только дата, ведь например есть разница > (Fix(Now()) + 10) или > (Now() + 10) что уже не сегодня +10, а сегодня +10 + 22:53 Да даже + 1 секунда это уже выпадет из вилки в 10 дней.Hugo