【问题标题】:Color Pivot Table data depending on column header compared to row data颜色数据透视表数据取决于列标题与行数据相比
【发布时间】:2021-08-18 15:31:56
【问题描述】:

我有一个数据透视表,其中没有天数作为列,类别作为行,

编辑:-我想强调 4 个条件

  1. 所有符合在线条件且等于 2 天的值(一种颜色为“橙色”)
  2. 所有符合在线条件且超过 2 天的值(用一种颜色“红色”表示)
  3. 任何标题下超过 5 天的所有单元格(另一种颜色“黄色”)
  4. 只要标题超过 5 天,标题本身就会以“黄色”突出显示

因此我想根据列值突出显示单元格值(基于大于 6 天的条件) 和行值(突出显示在线的行)

这可能吗?在 vba 或 excel 中??

我想要的输出如下。

【问题讨论】:

  • 出现在您之前的问题中并就那里的答案提供一些反馈如何? stackoverflow.com/questions/68660937/…
  • @TimWilliams,我错误地更新了问题中的反馈,而不是每个单独的答案。两个答案都有效,每个答案之间相差 0.4 秒。可能是设置计时器的错误,出于同样的原因,我没有选择答案。因为两者都运作良好
  • @Tim Williams 对这个问题有什么建议吗??
  • 有助于添加“之后”屏幕截图,以便更清楚您的意思。
  • @Tim Williams,为清楚起见,编辑了条件并添加了截图。请检查

标签: excel vba


【解决方案1】:

理想情况下,您首先自己尝试一下,我们会帮助您修复您的代码,但是因为这对我来说是一个有用的练习......

Sub Tester()

    Dim pt As PivotTable, pf As PivotField, pi As PivotItem, d, clr As Long
    Dim rngTwoDays As Range, rngFiveDays As Range, rwOnline As Range, c As Range
    
    Set pt = ActiveSheet.PivotTables(1)
    pt.TableRange1.Interior.ColorIndex = xlNone 'uncolor
    
    'some code for figuring out what's what in terms of ranges etc
    Debug.Print "*** Row Fields ***"
    PrintInfo pt.RowFields
    Debug.Print "*** Column Fields***"
    PrintInfo pt.ColumnFields
    'done figuring out...
    
    'Start coloring
    
    ' x days labels >=5days
    Set pf = pt.PivotFields("WC")
    For Each pi In pf.PivotItems
        d = Val(pi.Name) 'days number only
        If d >= 5 Then pi.LabelRange.Resize(2).Interior.Color = vbYellow
        If d = 5 Then Set rngFiveDays = pi.DataRange 'for next block
        If d = 2 Then Set rngTwoDays = pi.DataRange  'for next block
    Next pi
    
    'the rest
    Set pf = pt.PivotFields("Order Category")
    For Each pi In pf.PivotItems
        For Each c In pi.DataRange.Cells
            If c.Value > 0 Then
                clr = -1 'reset
                Select Case pi.Name
                    Case "Online"
                        If c.Column >= rngTwoDays.Column Then
                            clr = IIf(Not Application.Intersect(c, rngTwoDays) Is Nothing, _
                                      XlRgbColor.rgbOrange, vbRed)
                        End If
                    Case Else
                        If c.Column >= rngFiveDays.Column Then clr = vbYellow
                End Select
                If clr > -1 Then c.Interior.Color = clr
            End If
        Next c
    Next pi
End Sub

'utility sub for printing field information
Sub PrintInfo(fldsCol As Object)
    Dim pf As PivotField, pi As PivotItem
    For Each pf In fldsCol
        Debug.Print pf.Position, pf.Name
        For Each pi In pf.PivotItems
            Debug.Print , pi.Position, pi.Name, pi.LabelRange.Address, pi.DataRange.Address
        Next pi
    Next pf
End Sub

【讨论】:

  • 我在动态生成 13 个数据透视表中使用了您的代码,其中 9 个数据透视表具有对您的代码有利的条件,但其中只有 5 个已完全着色,其他 4 个已部分着色彩色的。
  • 我正在更新图片作为问题的答案
  • 我也在更新调试代码。请检查
  • 我给出的答案是针对您发布的示例的-我不希望它一定适用于具有不同布局的数据透视表...至于 Debug.Print 输出-它列出的所有内容列出可用的行/列字段、它们的位置和数据范围(表中的“值”对应于该字段下的每个项目),以及标签所在的位置。您可以在代码中使用该信息为您想要的区域着色。
  • 布局保持不变,我在您的代码中编辑的内容是数据透视表名称(已使其成为动态)&pt.PivotFields("WC") 这也是我通过让变量赋予其动态的枢轴名称。行字段和列字段保持不变。但出于某种原因,对于某些枢轴,stock values 不会突出显示。确实很好奇。你能给我一些指示,比如我必须做些什么来适应我的场景吗??
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 2015-11-30
  • 2020-06-18
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
相关资源
最近更新 更多