【问题标题】:Pivot chart formats数据透视图格式
【发布时间】:2019-09-18 13:59:44
【问题描述】:

VBA 知识渊博的人,

我有一个数据透视图,我写了一个 sub 来格式化系列表示。此图表包含四个系列并连接到切片器。

问题在于格式不适用于某些切片器的按钮,因为其中一种系列格式消失了。这个系列格式应该是一条灰线;数据点在那里,但没有线条和填充颜色。

我已经调试了这个东西并用手表检查了发生了什么,但一切都很好并且运行正常。当我 F8 宏时,在系列不起作用之后,我尝试使用鼠标强制图形线上的颜色并且它起作用。

您对我应该在哪里寻找问题有什么建议吗?您的数据透视图也会出现这种情况吗?

我写了这段代码:

Dim srs_name As String   
Dim srs As Integer


ActiveSheet.ChartObjects("Diagramm 7").Activate

         'formatting Shipped Qty series
srs_name = "Shipped qty"
On Error Resume Next
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlColumnStacked
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(255, 192, 0)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(255, 192, 0)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
End If

         'formatting Order series
srs_name = "Order"
On Error Resume Next
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlColumnStacked
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(91, 155, 213)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(91, 155, 213)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
End If

        'formatting Sales series
srs_name = "Sales"
On Error Resume Next
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlLine
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(165, 165, 165)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(165, 165, 165)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
End If

       'formatting Transport series
srs_name = "Transport"
On Error Resume Next
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlColumnStacked
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(237, 125, 49)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(237, 125, 49)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
Else
End If

       'formatting a 5th series, if needed
srs = ActiveSheet.ChartObjects("Diagramm 7").Chart.SeriesCollection.Count
If srs > 4 Then
    ActiveChart.SeriesCollection(5).ChartType = xlArea
    ActiveChart.SeriesCollection(5).Format.Fill.ForeColor.RGB = RGB(222, 235, 247)
    ActiveChart.SeriesCollection(5).Format.Line.ForeColor.RGB = RGB(222, 235, 247)
    ActiveChart.SeriesCollection(5).AxisGroup = 1
End If



【问题讨论】:

  • 如果您注释掉On Error Resume Next 的这些实例,您会收到错误消息吗?如果是这样,消息是什么,是哪一行抛出的?
  • 你好,@BigBen,当我注释掉这些实例时,我没有收到任何错误。
  • @SSGrace 您使用On Error Resume Next 的方式是最糟糕的做法(它隐藏了所有错误消息,但错误仍然存​​在,如果您的代码中出现问题,您永远不会注意到)。切勿单独使用。有关更多信息,您可能会受益于阅读VBA Error Handling – A Complete Guide
  • 嗨,@Pᴇʜ,我不知道,但我会从现在开始看,谢谢你的信息!
  • 除了on-error-resume-next,你还有什么建议吗@Pᴇʜ?

标签: excel vba format excel-charts pivot-chart


【解决方案1】:

已解决:我只需要添加一个 ActiveChart.SeriesCollection(srs_name).Format.Line.Visible = True 行。

它是这样得到的:

Dim srs_name As String   
Dim srs As Integer

ActiveSheet.ChartObjects("Diagramm 7").Activate

         'formatting Shipped Qty series
srs_name = "Shipped qty"
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlColumnStacked
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(255, 192, 0)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(255, 192, 0)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
End If

         'formatting Order series
srs_name = "Order"
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlColumnStacked
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(91, 155, 213)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(91, 155, 213)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
End If

        'formatting Sales series
srs_name = "Sales"
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlLine
    ActiveChart.SeriesCollection(srs_name).Format.Line.Visible = True
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(165, 165, 165)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(165, 165, 165)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
End If

       'formatting Transport series
srs_name = "Transport"
If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then
    ActiveChart.SeriesCollection(srs_name).ChartType = xlColumnStacked
    ActiveChart.SeriesCollection(srs_name).Format.Fill.ForeColor.RGB = RGB(237, 125, 49)
    ActiveChart.SeriesCollection(srs_name).Format.Line.ForeColor.RGB = RGB(237, 125, 49)
    ActiveChart.SeriesCollection(srs_name).AxisGroup = 1
Else
End If

       'formatting a 5th series, if needed
srs = ActiveSheet.ChartObjects("Diagramm 7").Chart.SeriesCollection.Count
If srs > 4 Then
    ActiveChart.SeriesCollection(5).ChartType = xlArea
    ActiveChart.SeriesCollection(5).Format.Fill.ForeColor.RGB = RGB(222, 235, 247)
    ActiveChart.SeriesCollection(5).Format.Line.ForeColor.RGB = RGB(222, 235, 247)
    ActiveChart.SeriesCollection(5).AxisGroup = 1
End If


【讨论】:

    【解决方案2】:

    如果系列名称不存在,我认为If Not ActiveChart.SeriesCollection(srs_name) Is Nothing Then 会抛出异常。相反,我推荐一个函数来测试SeriesExists

    另外我建议不要使用ActivateActiveChart(参见How to avoid using Select in Excel VBA)。而是按名称指定图表。

    请注意,您不需要计算系列的数量来测试是否有 5ᵗʰ 一个。您可以使用SeriesExists(MyChart, 5) 进行测试。

    我推荐如下内容:

    Option Explicit
    
    Public Sub FormatCharts()
        Dim ws As Worksheet
        Set ws = ActiveSheet 'better something like ThisWorkbook.Worksheets("Tabelle 1")
    
        Dim MyChart As Chart
        Set MyChart = ws.ChartObjects("Diagramm 7").Chart
    
        Dim srs_name As String
    
        'formatting Shipped Qty series
        srs_name = "Shipped qty"
        If SeriesExists(MyChart, srs_name) Then
            With MyChart.SeriesCollection(srs_name)
                .ChartType = xlColumnStacked
                .Format.Fill.ForeColor.RGB = RGB(255, 192, 0)
                .Format.Line.ForeColor.RGB = RGB(255, 192, 0)
                .AxisGroup = 1
            End With
        End If
    
       'formatting Order series
        srs_name = "Order"
        If SeriesExists(MyChart, srs_name) Then
            With MyChart.SeriesCollection(srs_name)
                .ChartType = xlColumnStacked
                .Format.Fill.ForeColor.RGB = RGB(91, 155, 213)
                .Format.Line.ForeColor.RGB = RGB(91, 155, 213)
                .AxisGroup = 1
            End With
        End If
    
        'formatting Sales series
        srs_name = "Sales"
        If SeriesExists(MyChart, srs_name) Then
            With MyChart.SeriesCollection(srs_name)
                .ChartType = xlLine
                .Format.Line.Visible = True
                .Format.Fill.ForeColor.RGB = RGB(165, 165, 165)
                .Format.Line.ForeColor.RGB = RGB(165, 165, 165)
                .AxisGroup = 1
            End With
        End If
    
        'formatting Transport series
        srs_name = "Transport"
        If SeriesExists(MyChart, srs_name) Then
            With MyChart.SeriesCollection(srs_name)
                .ChartType = xlColumnStacked
                .Format.Fill.ForeColor.RGB = RGB(237, 125, 49)
                .Format.Line.ForeColor.RGB = RGB(237, 125, 49)
                .AxisGroup = 1
            End With
        End If
    
        'formatting a 5th series, if needed
         If SeriesExists(MyChart, 5) Then 
            With MyChart.SeriesCollection(5)
                .ChartType = xlArea
                .Format.Fill.ForeColor.RGB = RGB(222, 235, 247)
                .Format.Line.ForeColor.RGB = RGB(222, 235, 247)
                .AxisGroup = 1
            End With
        End If
    End Sub
    
    Private Function SeriesExists(InChart As Chart, SeriesName As Variant) As Boolean
        Dim TestSeries As Series
        On Error Resume Next
        Set TestSeries = InChart.SeriesCollection(SeriesName)
        On Error GoTo 0
        SeriesExists = Not TestSeries Is Nothing
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多