带有条件格式的数据透视表:我的缩进在哪里?

时间:2018-01-04 21:46:53

标签: excel vba excel-vba pivot-table

此问题是我之前提出的问题askedanswered的后续问题。 (代码,有三行修改并在此处重新发布,完全取自该帖子。)

成功获取有条件格式化数据透视表后,我的用户注意到缺少任何典型的行缩进(对于其他行字段)。因此,当我选择多个字段作为行时,我看到了:

enter image description here

而不是:

enter image description here

缺少缩进使其难以阅读。

我尝试了几件事,包括

  1. 通过数据透视表选项,设置"当处于紧凑形式缩进行标签时:4 字符"
  2. 使用VBA设置相同的值,如:

    '--- restore the indentation levels (because all the formatting above wiped it out) staffingTable.CompactRowIndent = 4

  3. 并尝试保留数据透视表格式:

    staffingTable.PreserveFormatting = True

  4. 其中没有一种能够达到所需的缩进格式。

    我已完整地包含以下代码,如果可能的话,我们将非常感谢您的工作。

    Option Explicit
    
    Sub ColorizeData()
        Dim staffingTable As PivotTable
        Dim data As Range
        Set staffingTable = ActiveSheet.PivotTables(PIVOT_TABLE_NAME)
        Set data = staffingTable.DataBodyRange
        '--- don't select the bottom TOTALS row, we don't want it colored
        Set data = data.Resize(data.rows.count - 1)
    
        '--- ALWAYS clear all the conditional formatting before adding
        '    or changing it. otherwise you end up with lots of repeated
        '    formats and conflicting rules
        ThisWorkbook.Sheets(PIVOT_SHEET_NAME).Cells.FormatConditions.Delete
        ThisWorkbook.Sheets(PIVOT_SHEET_NAME).Cells.ClearFormats
        staffingTable.DataBodyRange.Cells.NumberFormat = "#0.00"
        staffingTable.ColumnRange.NumberFormat = "mmm-yyyy"
    
        '--- the cell linked to the checkbox on the pivot sheet is
        '    supposed to be covered (and hidden) by the checkbox itself
        If Not ThisWorkbook.Sheets(PIVOT_SHEET_NAME).Range("D2") Then
            '--- we've already cleared it, so we're done
            Exit Sub
        End If
    
        '--- capture the active cell so we can re-select it after we're done
        Dim previouslySelected As Range
        Set previouslySelected = ActiveCell
    
        '--- colorizing will be based on the type of data being shown
        '    many times there will be multiple data sets shown as sums in
        '    the data area. the conditional formatting by FTEs only makes
        '    sense if we colorize the Resource or TaskName fields
        '    most of the other fields will be shown as summary lines
        '    (subtotals) so those will just get a simple and consistent
        '    color scheme
    
        Dim field As PivotField
        For Each field In staffingTable.PivotFields
            Select Case field.Caption
            Case "Project"
                If field.Orientation = xlRowField Then
                    If field.Position = 1 Then
                        staffingTable.PivotSelect field.Caption, xlFirstRow, True
                        ColorizeDataRange Selection, RGB(47, 117, 181), RGB(255, 255, 255)
                    End If
                End If
            Case "WorkCenter"
                If field.Orientation = xlRowField Then
                    If field.Position = 1 Then
                        staffingTable.PivotSelect field.Caption, xlFirstRow, True
                        ColorizeDataRange Selection, RGB(155, 194, 230), RGB(0, 0, 0)
                    End If
                End If
            Case "Resource", "TaskName"
                If field.Orientation = xlRowField Then
                    If (field.Position = 2) And PivotItemsShown(staffingTable.PivotFields("Project")) Then
                        staffingTable.PivotSelect field.Caption, xlDataOnly, True
                        ColorizeConditionally Selection
                    ElseIf field.Position = 1 Then
                        staffingTable.PivotSelect field.Caption, xlFirstRow, True
                        ColorizeConditionally Selection
                    End If
                End If
                '        Case "TaskName"
                '            If field.Orientation = xlRowField Then
                '                If field.Position = 1 Then
                '                    staffingTable.PivotSelect field.Caption, xlFirstRow, True
                '                Else
                '                    staffingTable.PivotSelect field.Caption, xlDataOnly, True
                '                End If
                '                ColorizeConditionally Selection
                '            End If
            End Select
        Next field
    
        '--- restore the indentation levels (because all the formatting above wiped it out)
        staffingTable.CompactRowIndent = 4
        staffingTable.PreserveFormatting = True
    
        '--- re-select the original cell so it looks the same as before
        previouslySelected.Select
    End Sub
    
    Private Sub ColorizeDataRange(ByRef data As Range, _
                                  ByRef interiorColor As Variant, _
                                  ByRef fontColor As Variant)
        data.interior.color = interiorColor
        data.Font.color = fontColor
    End Sub
    
    Private Sub ColorizeConditionally(ByRef data As Range)
        '--- light green for part time FTEs
        Dim dataCondition As FormatCondition
        Set dataCondition = data.FormatConditions.Add(Type:=xlCellValue, _
                                                      Operator:=xlBetween, _
                                                      Formula1:="=0.1", _
                                                      Formula2:="=0.5")
        With dataCondition
            .Font.ThemeColor = xlThemeColorLight1
            .Font.TintAndShade = 0
            .interior.PatternColorIndex = xlAutomatic
            .interior.ThemeColor = xlThemeColorAccent6
            .interior.TintAndShade = 0.799981688894314
            .SetFirstPriority
            .StopIfTrue = False
        End With
    
        '--- solid green for full time FTEs
        Set dataCondition = data.FormatConditions.Add(Type:=xlCellValue, _
                                                      Operator:=xlBetween, _
                                                      Formula1:="=0.51", _
                                                      Formula2:="=1.2")
        With dataCondition
            .Font.ThemeColor = xlThemeColorLight1
            .Font.TintAndShade = 0
            .Font.color = RGB(0, 0, 0)
            .interior.PatternColorIndex = xlAutomatic
            .interior.color = 5296274
            .SetFirstPriority
            .StopIfTrue = False
        End With
    
        '--- orange for slightly over full time FTEs
        Set dataCondition = data.FormatConditions.Add(Type:=xlCellValue, _
                                                      Operator:=xlBetween, _
                                                      Formula1:="=1.2", _
                                                      Formula2:="=1.85")
        With dataCondition
            .Font.color = RGB(0, 0, 0)
            .Font.TintAndShade = 0
            .interior.PatternColorIndex = xlAutomatic
            .interior.color = RGB(255, 192, 0)
            .SetFirstPriority
            .StopIfTrue = False
        End With
    
        '--- red for way over full time FTEs
        Set dataCondition = data.FormatConditions.Add(Type:=xlCellValue, _
                                                      Operator:=xlGreater, _
                                                      Formula1:="=1.85")
        With dataCondition
            .Font.color = RGB(255, 255, 255)
            .Font.TintAndShade = 0
            .interior.PatternColorIndex = xlAutomatic
            .interior.color = RGB(255, 0, 0)
            .SetFirstPriority
            .StopIfTrue = False
        End With
    End Sub
    

1 个答案:

答案 0 :(得分:0)

我不完全知道为什么会发生这种情况,但看起来当您清除工作表上的格式时,它会删除缩进,但它会以紧凑的形式离开表格。似乎如果你将表的格式更改为其他内容然后将其更改回紧凑形式,它将修复缩进。

在清除工作表中的格式后,在某处添加这些行:

ThisWorkbook.Sheets(PIVOT_SHEET_NAME).Cells.ClearFormats
staffingTable.RowAxisLayout xlTabularRow
staffingTable.RowAxisLayout xlCompactRow