Страницы: 1
RSS
VBA и условное форматирование
 
Доброго времени суток.  
Подскажите пожалуйста как в VBA определить ячейку, которая закрашена с помощью условного форматирования. Условное форматирование на 2 столбца с проверкой на уникальность значений в обоих столбцах.  
Заранее спасибо!
 
Как раз вчера занимался.  
 
Нашел вот что:  
http://www.cpearson.com/excel/CFColors.htm
 
Тут всё дело в постановке задачи.  
Если нужно просто обнаружить на листе ячейки, имеющие УФ, то  
Sub SelFC()  
Cells.SpecialCells(xlCellTypeAllFormatConditions).Select  
End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да, тема непростая.  
Мне еще показалось, что объектная модель у Excel 2003 и Excel 2007/Excel 2010 разная в части УФ
 
Alex_ST, то что Вы написали выделяет 2 столбца. А мне необходимо узнать позицию ячейки, которая закрашена, чтобы потом удалить заданную часть строки (в зависимости от того, в каком столбце находится выделенная ячейка) со сдвигом вверх. (Смотрите прикрепленный файл)
 
imkas,  
у меня 2003-й, поэтому .xlsx я понимаю с трудом :)  
Дмитрий большой спец. И раз он говорит, что много спрятанных граблей в обработке условий УФ через VBA, то, может, проще сделать два скрытых столбца и обрабатывать их или вообще отказаться от УФ и форматировать ячейки макросом?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Какой результат хотите получить?
 
Alex_ST, УФ стоит для визуализации и поиска несовпадений. Согласитесь, что 12000 записей просмотреть сложно:)
 
sva, необходимо, чтобы столбцы, названные как "Код товара" полностью соответствовали друг другу. Лишнее (красное) удаляется
 
Если полностью это С3=В3 и т.д. до конца, то макросом без уф  
Sub del()  
Dim i As Long  
Application.ScreenUpdating = 0  
For i = Cells(Rows.Count, 3).End(xlUp).Row To 3 Step -1  
If Cells(i, 3) <> Cells(i, 4) Then Rows(i).Delete  
Next  
Application.ScreenUpdating = 1  
End Sub
 
sva, Вы меня не совсем поняли. Всю строку удалять не надо. Надо удалить только то, что находится рядом с несовпадением. УФ показывает нам с какой стороны нужно удалить часть строки
 
Давайте на пальцах :)  
В примере закрашено D125, то что нужно удалить?
 
Давайте:))  
Если D125 то диапазон D125:J125  
Далее у нас закрашено С160 необходимо удалить А160:С160
 
кстати я нашел как найти окрашенную ячейку, но что-то у меня по кривому через цикл это работает  
Cells.FormatConditions(1).Interior.Color = vbRed
 
ммда?  
а может быть, это из-за того, что это не цвет, в который окрашена ячейка в данный момент, а цвет, в который она может быть окрашена при соблюдении первого условия УФ?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, оно не все ячейки удаляет, а только те, которые ему хочется
 
The_Prist, а можно поподробнее и с кодом. У меня Excel 2010.
 
Интересно, почему моё предложение: сделать два скрытых столбца и обрабатывать их или вообще отказаться от УФ и форматировать ячейки макросомвам не подошло, а когда Дмитрий предложил делать практически то же самое, Вы заинтересовались?  
Ну, на вкус и цвет все фломастеры разные...  
Флаг вам в руки.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Alex_ST, я пытаюсь по-разному делать. Как получится, так и сделаю:)
 
Что-то вы не догоняете...  
Дмитрий предложил сделать то же, что и ранее предлагал я: отказаться от УФ, а обрабатывать таблицу макросом.    
Под обработкой при этом, естественно, понимается не только поиск  нужных данных, но и форматирование соответствующих ячеек. Т.е. то же самое, что дало бы УФ, он сделанное макросом, а потому и избавленное от "граблей" программной обработки УФ
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Пробуйте.
 
sva, мне Excel пишет что файл поврежден. Не могли бы Вы выслать на почту andrey.lomakin@bk.ru? или написать здесь код макроса?
 
В архиве xls.
 
sva, для большого файла (12000 записей) выдает ошибку "Method 'Range' of object '_Global' failed", а для маленького, который я вам дал все работает.  
 
 
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
sva, для 1000 записей все отлично работает, а для 5000 уже нет, выдает ту же ошибку. Я VBA знаю очень плохо, поэтому не могу разобраться в чем же там ошибка. На первый взгляд все правильно. Возможно в переменной sRng не хватает места для записи всего массива?
 
Называется сэкономил :)  
Небольшое дополнение к предыдущему посту  
Нужно sRng As String, заменить на rRng as Range
 
спасибо всем участвующим. вечером приду домой попробую, т.к. зашел с телефона:)
 
Не увидел :)
 
На днях тоже столкнулся с граблями условного форматирования в 2003  
казалось простая строка вставки уф а такая проблема :)  
задача была применить условное форматирование к динамическому диапазону изменяя формулу в зависимости от тех или иных условий.  
код был соответсвенно:  
CondiFormL="=ЕСЛИ(K7>0;(I7*100)<>G7;ЛОЖЬ)"  
With .Range("f7:f"& lr)  
  If .FormatConditions.Count > 0 Then .FormatConditions.Delete  
    With .FormatConditions.Add(xlExpression, , CondiFormL)  
       .Interior.Color = 255  
    End With  
End With  
в 2010 отработало все как положено, а в 2003 началось :)  
формула в УФ зависела от активной ячейки и производила смещение адреса относительно активной ячейки, во как :)  
Заменил стиль ссылок вроде заработало, однако при увеличении диапазона в сторону увеличения данный код отказывался работать и выдавал ошибку :(, типа нельзя применить формулу к УФ и старое УФ не удалялось.  
 
Пришлось сделать так где можно диапазон с запасом, а там где нельзя    
пришлось на событие красить самому ячейки......  
 
CondiFormL="=ЕСЛИ(RC[5]>0;(RC[3]*100)<>RC[1];ЛОЖЬ)" или другая формула.
With .Range("f7:f1000")  
  If .FormatConditions.Count > 0 Then .FormatConditions.Delete  
    With .FormatConditions.Add(xlExpression, ,CondiFormL )  
       .Interior.Color = 255  
    End With  
End With  
 
Вот такие грабли были у меня с УФ.
Спасибо
 
sva, The_Prist, спасибо Вам огромное, все работает:)
Страницы: 1
Читают тему
Наверх