Почему в умной таблице не установлен правильный цвет шрифта? - PullRequest
0 голосов
/ 09 февраля 2019

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

With Sheets("Calculation")
    For r = 9 To 10
    For c = 22 To 23
        .Cells(r, c).Select
        clr1 = .Cells(r, c).DisplayFormat.Interior.ColorIndex
        clr2 = .Cells(r, c).DisplayFormat.Font.ColorIndex
        'colorindex of exemplary cell
        .Cells(r, 21).Select
        clr3 = .Cells(r, 20).DisplayFormat.Font.ColorIndex
        v = .Cells(2, 25).Value
        If .Cells(2, 25).Value = True Then
            If clr1 > 0 Then
                .Cells(r, c).Font.ColorIndex = clr1
            Else
                .Cells(r, c).Font.Color = 16777215
            End If
        Else
            .Cells(r, c).Font.ColorIndex = clr3
        End If
    Next c
    Next r

End With

По какой-то причине, когда я восстанавливаю цвет шрифта, я установил неправильный цвет.enter image description here Если вы посмотрите на цвет шрифта в примерной ячейке: Стили ячейки / Создать стиль ячейки, тогда цвет: Текст1.Если вы посмотрите на цвет шрифта в целевой ячейке: Стили ячейки / Создать стиль ячейки, то цвет: Бежевый (rgb 128,128,0).

Что я делаю не так?

Upd.Рабочий код

Dim oSh As Worksheet
Dim rNg As Range
Set oSh = Sheets("Calculation")
Set rNg = oSh.Range("T_1_1[[Column22]:[Column23]]")
With oSh
    'bring in a variable cell format
    cLr = oSh.ListObjects("T_1_1").ListColumns(20).DataBodyRange.NumberFormat
    If .Cells(2, 25).Value = True Then
        'set "zero" formatting
        rNg.NumberFormat = ";;;"
    Else
        'apply formatting from sample
        rNg.NumberFormat = cLr
    End If
End With

1 Ответ

0 голосов
/ 09 февраля 2019

Как сделать содержимое ячейки "невидимым" с помощью NumberFormat ;;;

Чтобы скрыть содержимое ячейки, я предлагаю не менять цвета.
Вместо этого сохраняйте оригинал Range.NumberFormat и установите его на Range.NumberFormat = ";;;", который скрывает положительные значения, отрицательные значения, нулевые значения и текст, т. е. скрывает все, кроме ошибок.

Normal Color и ColorIndex

Вы всегда можете прочитать или написать стандартный цвет ячейки, например

  • Font.Color
  • Interior.Color

Значение цвета - 3цвет RGB байта, может быть установлен RGB(red byte, green byte, blue byte) и храниться в переменных Long (4 байта, представляющих байты цвета 0BGR).

ColorIndex - это значение только от 1 до 56 - сразличные результаты, в зависимости от цветовой палитры рабочей книги.

Отображаемый цвет с помощью DisplayFormat

Отображаемый цвет можно изменить с помощью условного форматирования или стиля таблицы.Он не меняет стандартный цвет, но накладывает его или виден вместо основного стандартного цвета.
Вы можете читать только наложенный цвет, но вы можете не устанавливать его напрямую для каждой ячейки:

  • DisplayFormat.Font.Color
  • DisplayFormat.Interior.Color

Если вы измените базовый .Font.Color, видимый результат зависит отшаблон наложения DisplayFormat.

DisplayFormat с помощью условного форматирования (FormatConditions)

Если вы хотите изменить цвет условного форматирования DisplayFormat, вы не можете установитьэто непосредственно в самом диапазоне ячейки, но в пределах условного (ых) форматирования (ов) для этого диапазона.Поэкспериментируйте с этим:

Private Sub DisplayColorByFormatCondition()
    Dim i As Long
    With ActiveSheet.Range("A1")
        Debug.Print "Color Info for " & .Cells.Address
        Debug.Print "Standard Font Color " & .Font.Color & _
                    " is displayed as " & .DisplayFormat.Font.Color; ""
        Debug.Print "Standard Interior Color " & .Interior.Color & _
                    " is displayed as " & .DisplayFormat.Interior.Color
        If .FormatConditions.Count = 0 Then
            Debug.Print "This cell is not part of a FormatCondition."
        Else
            For i = 1 To .FormatConditions.Count
                With .FormatConditions(i)
                    Debug.Print "Condition " & i & " sets Font Color to " & .Font.Color & _
                        "and Interior Color to " & .Interior.Color
                End With
            Next i
        End If
    End With
End Sub

DisplayFormat по стилю таблицы (ListObject.TableStyle)

Если цвет DisplayFormat является результатом стиля таблицы, поэкспериментируйте с этим:

Private Sub DisplayColorByTableStyle()
    Dim lo As ListObject
    Dim i As Long
    With ActiveSheet.Range("A1")
        Debug.Print "Color Info for " & .Cells.Address
        Debug.Print "Standard Font Color " & .Font.Color & _
                    " is displayed as " & .DisplayFormat.Font.Color; ""
        Debug.Print "Standard Interior Color " & .Interior.Color & _
                    " is displayed as " & .DisplayFormat.Interior.Color
        For Each lo In ActiveSheet.ListObjects
            If Not Intersect(lo.Range, .Cells) Is Nothing Then
                Debug.Print "Cell is part of ListObject '" & lo.Name & _
                            "' which uses TableStyle '" & lo.TableStyle & "'"
                If Not Intersect(lo.HeaderRowRange, .Cells) Is Nothing Then
                    Debug.Print "Cell is part of HeaderRowRange. Font color is set to " & _
                                lo.HeaderRowRange.DisplayFormat.Font.Color & _
                                ", Interior color is set to " & _
                                lo.HeaderRowRange.DisplayFormat.Interior.Color
                ElseIf Not Intersect(lo.DataBodyRange, .Cells) Is Nothing Then
                    Debug.Print "Cell is part of DataBodyRange. Font color is set to " & _
                                lo.DataBodyRange.DisplayFormat.Font.Color & _
                                ", Interior color is set to " & _
                                lo.DataBodyRange.DisplayFormat.Interior.Color
                    For i = 1 To lo.ListRows.Count
                        If Not Intersect(lo.ListRows(i).Range, .Cells) Is Nothing Then
                            Debug.Print "Cell is part of ListRows(" & i & "). " & _
                                        "Font color is set to " & _
                                        lo.ListRows(i).Range.DisplayFormat.Font.Color & _
                                        ", Interior color is set to " & _
                                        lo.ListRows(i).Range.DisplayFormat.Interior.Color
                        End If
                    Next i
                End If
            End If
        Next lo
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...