Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Макрос на замену условного форматирования реальным, Нужно отладить макрос (некорректно работает, если условное форматирование задано формулой)
 
Спасибо, Вашей надстройкой пытался пользоваться - очень долго меняет форматы, поэтому решил попытаться найти альтернативные варианты.
Макрос на замену условного форматирования реальным, Нужно отладить макрос (некорректно работает, если условное форматирование задано формулой)
 
Добрый день!

На иностранном форуме нашел полезный макрос на замену условного форматирования реальным, но он некорректно работает, когда условное форматирование задано формулой. Для примера приложил файл:
1) Лист 1 (УФ задано формулой) - макрос закрашивает все ячейки, не зависимо от того, выполняется ли условие или нет.
2) Лист 2 (УФ задано стандартной функцией excel) - макрос все корректно делает.
Сам макрос ниже, посмотрите пожалуйста, надеюсь, что появятся какие-то идеи как это отладить:
Код
' PGC Nov 06
' Delinks formats from conditions in cells with conditional formatting.
' The cells keep the format that was enabled with the conditional formatting
' but as normal format. Background and Font Colour
' Oct 07
' Added Borders, Font Style, Underline and Strikethrough
' Patejl Feb 12
' Fixed Excel 2007 compatibility issues

Sub ConditionalFormatDelink(rRng As Range)
Dim vConditionsSyntax, rCell As Range, rCFormat As Range, iCondition As Integer
Dim sFormula As String, vCSyntax, vOperator, iBorder As Integer, vBorders
Dim firstRow As Long, firstColumn As Long, firstCell As Range, conditionArea As Range

vBorders = Array(xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlEdgeBottom)

' Syntax for "Value is" Conditions
vConditionsSyntax = Array( _
    Array(xlEqual, "CellRef = Condition1"), _
    Array(xlNotEqual, "CellRef <> Condition1"), _
    Array(xlLess, "CellRef < Condition1"), _
    Array(xlLessEqual, "CellRef <= Condition1"), _
    Array(xlGreater, "CellRef > Condition1"), _
    Array(xlGreaterEqual, "CellRef >= Condition1"), _
    Array(xlBetween, "AND(CellRef >= Condition1, CellRef <= Condition2)"), _
    Array(xlNotBetween, "OR(CellRef < Condition1, CellRef > Condition2)") _
)

' Get cells with format
On Error GoTo EndSub
Set rCFormat = rRng.SpecialCells(xlCellTypeAllFormatConditions)

On Error Resume Next
For Each rCell In rCFormat ' Loops through all the cells with conditional formatting
    If Not IsError(rCell) Then ' skips cells with error
        rCell.Activate
        With rCell.FormatConditions
            For iCondition = 1 To .Count ' loops through all the conditions
                
                'Locate the first cell in the AppliesTo area (used as a reference for sFormula)
                firstRow = .Item(iCondition).AppliesTo.Row
                firstColumn = .Item(iCondition).AppliesTo.Column
                
                If .Item(iCondition).AppliesTo.Areas.Count > 1 Then
                    For Each conditionArea In .Item(iCondition).AppliesTo.Areas
                        If conditionArea.Row < firstRow Then firstRow = conditionArea.Row
                        If conditionArea.Column < firstColumn Then firstColumn = conditionArea.Column
                    Next conditionArea
                End If

                Set firstCell = Cells(firstRow, firstColumn)
                
                sFormula = .Item(iCondition).Formula1
                Err.Clear
                vOperator = .Item(iCondition).Operator
                If Err <> 0 Then ' "Formula Is"
                    Err.Clear
                Else ' "Value Is"
                    For Each vCSyntax In vConditionsSyntax ' checks all the condition types
                        If .Item(iCondition).Operator = vCSyntax(0) Then
                            ' build the formula equivalent to the condition
                            sFormula = Replace(vCSyntax(1), "Condition1", Evaluate(sFormula))
                            sFormula = Replace(sFormula, "CellRef", rCell.Address)
                            sFormula = Replace(sFormula, "Condition2", Evaluate(.Item(iCondition).Formula2))
                            Exit For
                        End If
                    Next vCSyntax
                End If
                
                'Uncomment when needed: Fix formula (Czech list separator -> US list separator)
                'sFormula = Replace(sFormula, ",", ".")
                'sFormula = Replace(sFormula, ";", ",")
                
                'Shift formula (relate it to the first cell of the AppliesTo area)
                sFormula = Application.ConvertFormula(Formula:=sFormula, fromReferenceStyle:=xlA1, toReferenceStyle:=xlR1C1, RelativeTo:=firstCell)
                sFormula = Application.ConvertFormula(Formula:=sFormula, fromReferenceStyle:=xlR1C1, toReferenceStyle:=xlA1, RelativeTo:=rCell)
                
                If Evaluate(sFormula) Then
                    ' The cell has a condition = True. Delink the format from the conditional formatting
                    
                    ' Background
                    If Not IsNull(.Item(iCondition).Interior.ColorIndex) Then _
                        rCell.Interior.Color = .Item(iCondition).Interior.Color
                    
                    ' Font
                    If Not IsNull(.Item(iCondition).Font.ColorIndex) Then _
                        rCell.Font.Color = .Item(iCondition).Font.Color
                    If Not IsNull(.Item(iCondition).Font.FontStyle) Then _
                        rCell.Font.FontStyle = .Item(iCondition).Font.FontStyle
                    If Not IsNull(.Item(iCondition).Font.Strikethrough) Then _
                        rCell.Font.Strikethrough = .Item(iCondition).Font.Strikethrough
                    If Not IsNull(.Item(iCondition).Font.Underline) Then _
                        rCell.Font.Underline = .Item(iCondition).Font.Underline
                    
                    ' Borders
                    With .Item(iCondition)
                        For iBorder = 1 To 4
                            If .Borders(iBorder).LineStyle <> xlNone Then
                                rCell.Borders(vBorders(iBorder - 1)).LineStyle = .Borders(iBorder).LineStyle
                                rCell.Borders(vBorders(iBorder - 1)).ColorIndex = .Borders(iBorder).ColorIndex
                                rCell.Borders(vBorders(iBorder - 1)).Weight = .Borders(iBorder).Weight
                            End If
                        Next iBorder
                    End With
                    
                    'Exit on StopIfTrue
                    If .Item(iCondition).StopIfTrue Then Exit For
                End If
            Next iCondition
        End With
    End If
    rCell.FormatConditions.Delete ' deletes the cell's conditional formatting
Next rCell
EndSub:
End Sub
Sub BreakCF()
   Call ConditionalFormatDelink(Range("A1:K40"))
End Sub
Закрасить ячейки на пересечении определенных данных в строке и столбце, условное форматирование
 
Все, сам додумался, спасибо большое!
В неправильном направлении я думал: добавил в Вашу формулу условие для отбора колонок.
Если вдруг кому-то пригодится - прикрепил файл с решением.
Закрасить ячейки на пересечении определенных данных в строке и столбце, условное форматирование
 
В настройке "Применяется к" можно указать либо конкретный диапазон, либо конкретную колонку, как Вы и сделали. Вопрос в том, можно ли не привязываться к конкретному диапазону, а прописать условие "Применяется к" таким образом, чтобы диапазон необходимой колонки определялся тем, что колонка содержит значение "КК1"? То есть, в таком случае, условное форматирование найдет колонку, где в загаловке стоит "КК1" и применит это правило ко всей этой колонке. Это возможно сделать?  
Закрасить ячейки на пересечении определенных данных в строке и столбце, условное форматирование
 
lavronin, большое спасибо! Да, так.

Есть еще один вопрос по этой же ситуации, если можете, помогите пожалуйста:
В графе "Применяется к" в правилах, Вы указали определенный диапазон ячеек. Возможно ли прописать "Применяется к" таким образом, чтобы правило применялось только к колонке, которая содержит значение "КЕк1"?
Закрасить ячейки на пересечении определенных данных в строке и столбце, условное форматирование
 
Здравствуйте!

Столкнулся со следующей проблемой:
Не получается закрасить ячейки, которые находятся на стыке строки содержащей определенную информацию со столбцом содержащую определенную информацию.
Пытаюсь это сделать с помощью условного форматирования, но что-то никак пока не выходит. На форуме через поиск ответа найти не смог, извините, если тема повторяется.

Если говорить на конкретном примере, то вот что хочу сделать:
В строках есть номенклатура, которая входит в определенный формат (в моем примере это 1, 2, 3). В столбцах есть магазины (КЕк1, КК1).
Магазин КЕк1 входит в формат 1, но не входит в формат 2 и 3, соответственно нужно, чтобы ячейки на пересечении столбца (содержащего КЕк1) и строчек с форматом 2 и 3, закрасились красным. Магазин КК1 входит в формат 2, но не входит в формат 1 и 3, соответственно нужно, чтобы ячейки на пересечении столбца (содержащего КК1) и строки с форматом 1 и 3, закрасились красным. В файле "закрасил" что хотелось бы получить на выходе.
Подскажите, возможно ли это сделать с помощью условного форматирования? Если нет, то есть ли какой-то альтернативный вариант?

Заранее спасибо!
Суммирование по группировке, Подскажите с помощью какой формулы это можно сделать
 
Karataev, 1с делает (по чему группировать конечно я вбиваю в настройки).
Суммирование по группировке, Подскажите с помощью какой формулы это можно сделать
 
Михаил, большое спасибо! Попытаюсь понять как работает формула.
Karataev, создавал не вручную - вытаскивал из 1с, потом функцией ВПР добавлял данные из другого отчета - вот и получилось, что по вновь добавленным данным нет сумм по группировке.
Суммирование по группировке, Подскажите с помощью какой формулы это можно сделать
 
Здравствуйте!

Столкнулся со следующей проблемой:
Есть ряд групп и подгрупп в каждой из которых есть разное количество строк. Нужно, чтобы по сгруппированным строкам посчитало сумму. Искал ответ в поиске - не нашел, извините если повторяюсь с вопросом.
Во вложении файл для примера - желтым отметил ячейки в которых хотел бы, чтобы отображалась сумма. То есть, в графе "Группа 1" нужна чтобы показывало сумму подгрупп 1,2,3,4,5. А в "подгруппа 1,2,3,4,5" суммировала все строки, которые входят в них.
Подскажите пожалуйста как это сделать с помощью формулы, так как таких групп очень много и суммировать вручную формулой СУММ() очень затратно по времени.
Страницы: 1
Наверх