Условное форматирование Excel с подсветкой строк, когда от 3 до 10 самых последних значений в строке превышают предел - PullRequest
0 голосов
/ 25 марта 2019

Я создал большую электронную таблицу, содержащую около 80 000 ячеек с массивом условного форматирования, выделяющим различные точки интереса.Два из этих условных форматов включают большие массивы, которые вызывают замедление файла.Я ищу способ сделать это более эффективным.

Таблица читается слева направо с датами с 1 января по 31 декабря вдоль вершины и вниз с различными элементами и пределами, указанными в соответствующей строке надалеко сразу после 31 декабря.Порядок дат предотвращает сортировку данных заранее.

Ниже приведен начальный корень формулы.Это затем реплицируется, чтобы решить проблему и вызвать проблему.Он просматривает несортированную строку для непустых ячеек, выбирает верхнее число значений X и сравнивает их с пределом в Col $ NG.Он игнорирует столбцы описания со ссылкой на строку -5 и предоставляет 0, чтобы избежать ошибки #NUM при недостаточных значениях для LARGE ().

IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),1)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),1)))-5)>$NG2)

Это первая из 2 формул условного форматирования, которая предназначена длявыделите строку, когда 2 из 3 самых последних (крайних справа) значений превышают предел в $ NG2.

=IF(COUNT($F2:$NF2)<2,"",SUM(IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),1)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),1)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),2)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),2)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),3)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),3)))-5)>$NG2))>=2)

Опять повторяем корневую формулу 10 раз, чтобы поймать 3 из 10самые дальние правые значения превышают лимит.

=IF(COUNT($F2:$NF2)<2,"",SUM(IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),1)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),1)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),2)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),2)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),3)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),3)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),4)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),4)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),5)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),5)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),6)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),6)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),7)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),7)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),8)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),8)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),9)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),9)))-5)>$NG2),IF(ISERROR(INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),10)))-5)>$NG2),0,INDEX($F2:$NF2,SUMPRODUCT((LARGE(($F2:$NF2<>"")*COLUMN($F2:$NF2),10)))-5)>$NG2))>=3)

Я рассмотрел функцию VBA xlToLeft с Do To 2 или 3, но изо всех сил пытался реплицировать идентификатор столбца переменной в совпадении индекса.

1 Ответ

0 голосов
/ 23 апреля 2019

В случае, если это кому-нибудь пригодится в качестве справки:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim a, w, x, y, z As Integer
Dim b As Range

w = 0
x = Target.Row()
'Bypass limits column
y = Range("NG" & x).Column()
'Set column value while bypassing blanks
If Cells(x, y - 1) <> "" Then
    y = y - 1
Else
    y = Cells(x, y).End(xlToLeft).Column
End If
z = 0
a = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row
Set b = Range("F2:NF" & a)

If Not Target.Cells.Count > 1 Then
    If Not Application.Intersect(b, Range(Target.Address)) Is Nothing Then
        Do Until y = 5 Or z = 2 Or w >= 3
            If Cells(x, y) >= 0 Then
                If Cells(x, y) > Range("NG" & x) Then
                    z = z + 1
                End If
            End If
            w = w + 1
            If Cells(x, y - 1) <> "" Then
                y = y - 1
            Else
                y = Cells(x, y).End(xlToLeft).Column
            End If
        Loop
        If z < 2 And y > 5 Then
            Do Until y = 5 Or z = 3 Or w >= 10
                If Cells(x, y) >= 0 Then
                    If Cells(x, y) > Range("NG" & x) Then
                        z = z + 1
                    End If
                End If
                w = w + 1
                If Cells(x, y - 1) <> "" Then
                    y = y - 1
                Else
                    y = Cells(x, y).End(xlToLeft).Column
                End If
            Loop
        End If
        If z = 2 And w <= 3 Then
            With Range("A" & x, "E" & x).Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .Color = 12874308
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
            With Range("A" & x, "E" & x).Font
                .Color = -2
                .TintAndShade = 0
            End With
            Range("A" & x, "E" & x).Font.Bold = True
        End If
        If z = 3 And w >= 3 Then
            With Range("A" & x, "E" & x).Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .Color = 7434613
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
            With Range("A" & x, "E" & x).Font
                .Color = -13533715
                .TintAndShade = 0
            End With
            Range("A" & x, "E" & x).Font.Bold = True
        End If
        If z <= 2 And w > 3 Then
            If Range("A" & x).Font.Bold = True Then
                With Range("A" & x, "E" & x).Font
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                End With
                With Range("A" & x, "E" & x).Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
                Range("A" & x, "E" & x).Font.Bold = False
            End If
        End If
    End If
End If
End Sub
...