Страницы: 1
RSS
как в ВБА получить цвет ячейки, установленный условным форматированием?
 
.
 
к сожалению conditional formatting это то что application делает для тебя, правда точне будет сказать за тебя. И поскольку в данном случае подразумевается что application умнее user, на кухню conditional formatting user не допускается.  
 
Всё что известно от разрабочиков это то что CF вычисляется после пересчёта ячеек, но как злыдня app это делает - тайна велика есь.  
 
Поэтому остаётся только вручную (by VBA кншна) пересчитывать свойства formatcondition  
как это делается можно посмотреть по аглицки на  
http://www.cpearson.com/excel/CFColors.htm  
но делается это явно не в радость.....  
 
ps. Если англ не знаешь на странице есть коды VBA всех необходимых функций, копируешь в модуль и эксперементируешь.  
 
С уважением DL
 
к сожалению conditional formatting это то что application делает для тебя, правда точне будет сказать за тебя. И поскольку в данном случае подразумевается что application умнее user, на кухню conditional formatting user не допускается.  
 
Всё что известно от разрабочиков это то что CF вычисляется после пересчёта ячеек, но как злыдня app это делает - тайна велика есь.  
 
Поэтому остаётся только вручную (by VBA кншна) пересчитывать свойства formatcondition  
как это делается можно посмотреть по аглицки на  
http://www.cpearson.com/excel/CFColors.htm  
но делается это явно не в радость.....  
 
ps. Если англ не знаешь на странице есть коды VBA всех необходимых функций, копируешь в модуль и эксперементируешь.  
 
С уважением DL
 
{quote}{login=слэн}{date=03.03.2008 02:47}{thema=как в ВБА получить цвет ячейки, установленный условным форматированием?}{post}.{/post}{/quote}А не проще проверить в ВБА сами условия условного форматирования? Ежели какое из них выполняется, то такой цвет и есть.
 
и как? (если, допустим, они разные для разных ячеек)  
считываю formatconditions.formula - дальше?  
формул там 3..  
в общем не очень красиво получается..  
но если нельзя по-другому, то так и придется.
 
Мысль у меня такая: условное форматирование - это следствие, может выполнять заливку средствами ВБА? Тогда и искать ничего не придется. Может расскажешь более общую задачу, из которой вытекает частная, описанная в сабже?
 
{quote}{login=Лузер}{date=03.03.2008 11:20}{thema=}{post}Мысль у меня такая: условное форматирование - это следствие, может выполнять заливку средствами ВБА? Тогда и искать ничего не придется. Может расскажешь более общую задачу, из которой вытекает частная, описанная в сабже?{/post}{/quote}  
 
выложить не могу - весит 35метров  
но смысл такой:  
есть планировки квартир, есть план типового этажа и план застройки.  
привлекательность квартир зависит от многих факторов(всего 21 фактор). каждый фактор приведен к нормальному виду(от 0 до 1), заданы весовые коэффициенты(приоритеты). В результате получается оценка.  
по оценкам строится таблица, в которой квартиры отсортированы по убыванию(оценок)+ выделены цветом три диапазона - каждый содержит оценки, отличающиеся от максимума этого диапазона не более, чем на 5%. - вот это и сделано условным форматированием.  
 
приоритеты можно задавать интерактивно - соответственно перестраивается таблица. (все сделано формулами)  
далее хотелось бы по щелчку на какой-либо квартире открывать план этажа и получать там эти квартиры, раскрашенными в те же цвета, что и в таблице + выбранная должна обратить на себя внимание(миганием или выноской - еще не решил). В дальнейшем - щелчок по квартире должен открывать ее укрупненную планировку.
 
{quote}{login=Лузер}{date=03.03.2008 11:20}{thema=}{post}Мысль у меня такая: условное форматирование - это следствие, может выполнять заливку средствами ВБА? Тогда и искать ничего не придется. Может расскажешь более общую задачу, из которой вытекает частная, описанная в сабже?{/post}{/quote}  
 
выложить не могу - весит 35метров  
но смысл такой:  
есть планировки квартир, есть план типового этажа и план застройки.  
привлекательность квартир зависит от многих факторов(всего 21 фактор). каждый фактор приведен к нормальному виду(от 0 до 1), заданы весовые коэффициенты(приоритеты). В результате получается оценка.  
по оценкам строится таблица, в которой квартиры отсортированы по убыванию(оценок)+ выделены цветом три диапазона - каждый содержит оценки, отличающиеся от максимума этого диапазона не более, чем на 5%. - вот это и сделано условным форматированием.  
 
приоритеты можно задавать интерактивно - соответственно перестраивается таблица. (все сделано формулами)  
далее хотелось бы по щелчку на какой-либо квартире открывать план этажа и получать там эти квартиры, раскрашенными в те же цвета, что и в таблице + выбранная должна обратить на себя внимание(миганием или выноской - еще не решил). В дальнейшем - щелчок по квартире должен открывать ее укрупненную планировку.
 
формат(все три штуки) заданы формулой?  
Если формулой то можешь выложить эти формулы?
 
формат(все три штуки) заданы формулой?  
Если формулой то можешь выложить эти формулы?
 
Если по формуле возвращающей логическое значение  
 
'получение номера формата  
If Rng.FormatConditions.Count = 0 Then  
   ActiveCondition = 0  
Else  
   For Ndx = 1 To Rng.FormatConditions.Count  
       Set FC = Rng.FormatConditions(Ndx)  
       Select Case FC.Type  
......  
       Case xlExpression  
           If Application.Evaluate(FC.Formula1) Then  
              ActiveCondition = Ndx  
              Exit Function  
           End If  
.....  
   Next Ndx  
End If  
 
'получение цветов  
AC = ActiveCondition 'Номер используемого условного формата  
If AC = 0 Then  
'цвета исходного формата  
'шрифт      
      FontColorIndex = Rng.Font.ColorIndex  
'заливка  
      InteriorColorIndex = Rng.Interior.ColorIndex  
Else  
'цвет условного формата  
'шрифт      
      FontColorIndex= Rng.FormatConditions(AC).Font.ColorIndex  
'заливка  
      InteriorColorIndex = Rng.FormatConditions(AC).Interior.ColorIndex  
End If
 
спасибо, я читал эту ссылку.  
 
прикрепляю облегченный файл
 
спасибо, я читал эту ссылку.  
 
прикрепляю облегченный файл
 
{quote}{login=слэн}{date=04.03.2008 01:13}{thema=}{post}спасибо, я читал эту ссылку.  
 
прикрепляю облегченный файл{/post}{/quote}  
 
итак есть две проблемы  
1)нужно перевести формулу УФ с русского языка на английский  
2)вместо строка() используемого в УФ подставлять номер строки ячейки имеющей условный формат  
 
Решать можно в двух напрвлниях  
1)я не знаю существует ли прямой метод перевода формулы как строки с русского на английский  
из "=ÑÌÅÙ($A$52;ÑÒÐÎÊÀ()-37;0;1;1)<=0.05"  
получить "=OFFSET($A$52,ROW()-37,0,1,1)<=0.05"  
единственное что можно использовать  
Range("A1").FormulaLocal = valstr 'руский  
valstr = Range("A1").Formula 'англ  
то есть прдётся использовать какие то дополнительные ячейки  
в той же строке где исп условный формат (либо заменять "СТРОКА()" на правильный номер строки).  
но тогда проще это сделать напрямую формулой =ЕСЛИ( формулаусловногоформата, .....)  
 
2)использовать ползовательскиефункции возвращающие требуемое логическое значение. то есть условный формат  
будет иметь вид = пользфункц1(параметры)  
тогда возможно можно будет использовать Application.Evaluate(FC.Formula1)
 
{quote}{login=слэн}{date=04.03.2008 01:13}{thema=}{post}спасибо, я читал эту ссылку.  
 
прикрепляю облегченный файл{/post}{/quote}  
 
итак есть две проблемы  
1)нужно перевести формулу УФ с русского языка на английский  
2)вместо строка() используемого в УФ подставлять номер строки ячейки имеющей условный формат  
 
Решать можно в двух напрвлниях  
1)я не знаю существует ли прямой метод перевода формулы как строки с русского на английский  
из "=ÑÌÅÙ($A$52;ÑÒÐÎÊÀ()-37;0;1;1)<=0.05"  
получить "=OFFSET($A$52,ROW()-37,0,1,1)<=0.05"  
единственное что можно использовать  
Range("A1").FormulaLocal = valstr 'руский  
valstr = Range("A1").Formula 'англ  
то есть прдётся использовать какие то дополнительные ячейки  
в той же строке где исп условный формат (либо заменять "СТРОКА()" на правильный номер строки).  
но тогда проще это сделать напрямую формулой =ЕСЛИ( формулаусловногоформата, .....)  
 
2)использовать ползовательскиефункции возвращающие требуемое логическое значение. то есть условный формат  
будет иметь вид = пользфункц1(параметры)  
тогда возможно можно будет использовать Application.Evaluate(FC.Formula1)
 
в общем ничего универсального не получилось..  
пойду другим путем - конкретным :)
 
в общем ничего универсального не получилось..  
пойду другим путем - конкретным :)
 
{quote}{login=слэн}{date=05.03.2008 11:36}{thema=}{post}в общем ничего универсального не получилось..  
пойду другим путем - конкретным :){/post}{/quote}  
 
универсальное использовать формулы ваших условныхформатов в пустых соседних ячейках  
Если в одной ячейки использовать ЕСЛИ значениями 1 или 2 или 3  
Сам условный формат назначать по значению ячейки задающей условный формат.  
А если используется три дополнительных ячейки чья заливка совпадает с цветами условного формата если значение в ячейке истина, то вобще получение цвета условного формата сведётся к получению цвета заливки той ячейки где истина
 
{quote}{login=слэн}{date=05.03.2008 11:36}{thema=}{post}в общем ничего универсального не получилось..  
пойду другим путем - конкретным :){/post}{/quote}  
 
универсальное использовать формулы ваших условныхформатов в пустых соседних ячейках  
Если в одной ячейки использовать ЕСЛИ значениями 1 или 2 или 3  
Сам условный формат назначать по значению ячейки задающей условный формат.  
А если используется три дополнительных ячейки чья заливка совпадает с цветами условного формата если значение в ячейке истина, то вобще получение цвета условного формата сведётся к получению цвета заливки той ячейки где истина
 
в пояснение к моему косноязычию прилагаю файл.  
 
в файле есть макрос экспорта формул условного формата в формулы ячеек  
!!но нужно следить за следующими вещами использованием в формулах условного формата данных основаных на адресе ячейки с УФ. Это ф-ии столбец строка и любая относительная адресация. В этом случае результат экспортированных формул и формул УФ может различаться!!  
 
текст макроса  
Sub test1()  
Dim Rng, CC, FF As Range  
Dim Ndx As Long  
Dim FC As FormatCondition  
Dim Temp As Variant  
Dim Temp2 As Variant  
Dim valstr As String  
Dim output As String  
 
 
Set Rng = Range("A37:A50")  
For Each CC In Rng  
If CC.FormatConditions.Count = 0 Then  
   AC = 0  
Else  
   For Ndx = 1 To Rng.FormatConditions.Count  
       Set FC = CC.FormatConditions(Ndx)  
           If FC.Type = xlExpression Then  
           valstr = FC.Formula1  
           Set FF = CC.Offset(0, 3 + Ndx)  
           FF.FormulaLocal = valstr  
           FF.Interior.ColorIndex = FC.Interior.ColorIndex  
           End If  
   Next Ndx  
End If  
Next CC  
End Sub
 
в пояснение к моему косноязычию прилагаю файл.  
 
в файле есть макрос экспорта формул условного формата в формулы ячеек  
!!но нужно следить за следующими вещами использованием в формулах условного формата данных основаных на адресе ячейки с УФ. Это ф-ии столбец строка и любая относительная адресация. В этом случае результат экспортированных формул и формул УФ может различаться!!  
 
текст макроса  
Sub test1()  
Dim Rng, CC, FF As Range  
Dim Ndx As Long  
Dim FC As FormatCondition  
Dim Temp As Variant  
Dim Temp2 As Variant  
Dim valstr As String  
Dim output As String  
 
 
Set Rng = Range("A37:A50")  
For Each CC In Rng  
If CC.FormatConditions.Count = 0 Then  
   AC = 0  
Else  
   For Ndx = 1 To Rng.FormatConditions.Count  
       Set FC = CC.FormatConditions(Ndx)  
           If FC.Type = xlExpression Then  
           valstr = FC.Formula1  
           Set FF = CC.Offset(0, 3 + Ndx)  
           FF.FormulaLocal = valstr  
           FF.Interior.ColorIndex = FC.Interior.ColorIndex  
           End If  
   Next Ndx  
End If  
Next CC  
End Sub
 
вот это идея!    
относительные ссылки - преодолимое препятствие  
вопрос с поиском на листе свободного места..  
можно открывать новый лист, потом удалять - это добавит проблем с адресацией, но тоже разрешимо..  
 
 
я уже сделал свое дело :)) мавр может уходить.. переделывать лениво..  
 
но вообще идею можно доработать - необязательно в offset  добавлять ndx - все можно делать в одной и той же ячейке - после вставки формулы сразу проверять ее значение - если истина, то выход, цвет берется из formatconditons.item(ndx).interior. относительные ссылки пересчитывать, например: строка()=строка(cc.addres ). R[-1]C[1]=cc.offset(-1,1).addres
 
в общем идея хорошая.
 
вот это идея!    
относительные ссылки - преодолимое препятствие  
вопрос с поиском на листе свободного места..  
можно открывать новый лист, потом удалять - это добавит проблем с адресацией, но тоже разрешимо..  
 
 
я уже сделал свое дело :)) мавр может уходить.. переделывать лениво..  
 
но вообще идею можно доработать - необязательно в offset  добавлять ndx - все можно делать в одной и той же ячейке - после вставки формулы сразу проверять ее значение - если истина, то выход, цвет берется из formatconditons.item(ndx).interior. относительные ссылки пересчитывать, например: строка()=строка(cc.addres ). R[-1]C[1]=cc.offset(-1,1).addres
 
в общем идея хорошая.
 
Решал проблему через автофильтр, фильтровал по цвету в потом смотрел какие ячейки остались.  
 
Dim RNG_flt, iFilterRange As Range 'RNG_flt - диапазон автофильтра, iFilterRange - диапазон оставшийся после применения автофильтра  
Dim WS As Worksheet 'WS - лист в книге  
Dim i As integer 'i - номер столбца в диапазоне фильтрования  
...  
       RNG_flt.AutoFilter Field:=i, Criteria1:=RGB(255, 0, 0), Operator:=xlFilterCellColor  
          If WS.AutoFilter.Range.Columns(i).SpecialCells(xlVisible).Count > 1 Then  
             With WS  
               With .AutoFilter.Range.Columns(i)  
                    Set iFilterRange = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlVisible)  
                      iFilterRange.value = "красный цвет"  
               End With  
             End With  
          End If  
       WS.ShowAllData
Страницы: 1
Читают тему
Наверх