【问题标题】:Removing Data Labels with values of zero then reset - VBA删除值为零的数据标签然后重置 - VBA
【发布时间】:2018-10-07 11:54:22
【问题描述】:

如果单元格的值为 0%,我有一个代码可以从自定义饼图中删除数据标签。但是,由于我的代码循环以使数据发生变化,因此我完全丢失了该特定类别的标签,因此当添加一组新数据并且值不为零时,标签不再出现。我该怎么做才能在值为 0 时删除数据标签,但当值不为零时它会重新出现,基本上是重置图表的原始设置,以便所有值/类别都有数据标签。

  Sub ChartLoop()

       Range("D2").Select
        ActiveCell.Range("C1:E1").Select

    Dim myPDF As String
    Dim i As Long

        For counter = 2 To 21

            Sheets("CF").Select
            Range("'CF'!$D$" & counter & ":$F$" & counter).Select 'numbers
            Selection.Copy
            Sheets("CF-Chart").Select
            Range("B1:B3").Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                False, Transpose:=True

  'this is for removing the data labels        
        Dim iPts As Integer
        Dim nPts As Integer
        Dim aVals As Variant
        Dim srs As Series

        ActiveSheet.ChartObjects("Chart 5").Activate
            For Each srs In ActiveChart.SeriesCollection
                With srs
                    If .HasDataLabels Then
                        nPts = .Points.Count
                        aVals = .Values
                        For iPts = 1 To nPts
                            If aVals(iPts) = 0 Then
                                .Points(iPts).HasDataLabel = False
                            End If
                        Next
                    End If
                End With
            Next


           ActiveSheet.ChartObjects("Chart 5").Activate
           ActiveChart.ChartArea.Select
           myPDF = "\\stchsfs\arboari$\Profile-Data\Desktop\Export Trial1\c2-" & Sheets("CF").Range("C" & i + 2).Value2 & ".pdf"
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=myPDF, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
        i = i + 1
        Next counter

    End Sub

第一个图表是我的常规图表的样子。第二个图表是我想删除值为 0 的数据标签,但保留数据标签的类别和值为其他值 >0 的数据标签。

谢谢!

【问题讨论】:

    标签: vba excel loops charts


    【解决方案1】:

    也许会改变

    If aVals(iPts) = 0 Then
        .Points(iPts).HasDataLabel = False
    End If
    

    这个?

    If aVals(iPts) = 0 Then
        .Points(iPts).HasDataLabel = False
        .DataLabels.ShowValue = False
    Else
        .Points(iPts).HasDataLabel = True
        .DataLabels.ShowValue = True
    End If
    

    编辑 2018 年 4 月 27 日

    好的...我已经测试了这个解决方案,它对我有用。不是最优雅的,但它有效。让我知道它是否适合你 -

    ActiveSheet.ChartObjects("Chart 5").Activate
    
    With ActiveChart.SeriesCollection(1)
        For i = 1 To .Points.Count
            If .Points(i).HasDataLabel = False Then
                .Points(i).Select
                ActiveChart.SetElement (msoElementDataLabelShow)
                    If .Points(i).DataLabel.Text = 0 Then
                        .Points(i).HasDataLabel = False
                        .Points(i).DataLabel.ShowValue = False
                    End If
            ElseIf .Points(i).DataLabel.Text = 0 Then
                .Points(i).HasDataLabel = False
                .Points(i).DataLabel.ShowValue = False
            End If
        Next i
    End With
    

    【讨论】:

    • 它有效,但它完全从我的标签中删除了类别名称。我该怎么做才能将类别名称包含在标签中?
    • @amea6995 我已经编辑了上面的代码,看看是否有帮助。
    • @amea6995 实际上现在我意识到您的If 语句测试它是否已经有数据标签。可能需要进行更多重组...
    • 不幸的是,类别名称仍然没有出现,新的类别名称带回了 0 值的数据标签。
    • @amea6995 您能否添加一张您的图表是什么样子的图片,以及您希望它之后的样子?抱歉,如果不了解您到底想要完成什么,这有点难以解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多