如果图形数据中有连字符,则不显示0

时间:2015-10-28 13:08:35

标签: excel graph charts bar-chart

我有数据显示人们是否说他们在调查中有问题,例如

     Shop           Problem         Month
     Argos          Yes             January
     Argos          Yes             February
     Argos          Yes             January
     Argos          No              January
     Argos          No              January
     Argos          Yes             February
     Argos          No              February
     Argos          Yes             January
     Argos          No              February
     Argos          Yes             February
     Argos          No              February
     Argos          No              January
     Argos          Yes             February
     Argos          No              April
     Argos          No              April
     Argos          No              April
     B&Q            No              January
     B&Q            No              January
     B&Q            Yes             January

根据这些数据,我有一个计算每月问题百分比的公式,因此1月份有6次调查,其中3次表示他们遇到问题所以是50%。

此数据显示在条形图上,因此1月份显示50%,2月份显示57%,4月份显示0%。虽然我可以证明4月份使用图表上的数据标签存在0%的问题,但如果没有数据,公式将返回“ - ”,例如因为没有任何数据,它将返回“ - ”,但在图表上显示为0%。

那么有没有一种方法可以包括所有月份(1月,2月,3月和4月)并显示有几个月有0%的问题,但其他人没有数据 - 最好是通过显示数据标签为没有数据的月份的“ - ”?

值得注意的是,图表一次只显示一个商店的数据,并且用户使用下拉框选择它所依赖的商店 - 因此,作为一个例子,虽然没有数据3月份的Argos,3月可能有B& Q的数据,但4月没有B& Q的数据。

2 个答案:

答案 0 :(得分:1)

我不确定旧版本的Excel,但Excel 2013有一个数据标签选项"来自Cell"这基本上做你想要的

enter image description here

修改

所以我看了Excel 2010,我认为它没有这个功能。如果您想避免使用VBA,可以选择以下几种方法:

1。)使用缺失数据的空白值... enter image description here

2。)你也可以通过定义像这样的自定义格式来进行格式化技巧......

#0 ##。 "否定显示此&#34 ;; "零表示此&#34 ;; "所有文字都显示了这个"

这个问题是图表使用的系列值需要数值或空格,因此文本格式不会执行,而您将以零格式离开,因为文本转换为图表数据为零。

enter image description here

3。)然后,当然,你也可以选择用VBA强制它,就像这样......

Private Sub Worksheet_Calculate()
    'Loops through each chart object
    For Each obj In ActiveSheet.ChartObjects
        'This syntax can also be used to grab a specific chart without the loop
        Set sc = ActiveSheet.ChartObjects(obj.Name).Chart.SeriesCollection
        'Loops through each series per chart
        For i = 1 To sc.Count
            SetLabelsToTrueSourceValue sc.Item(i)
        Next i
    Next
End Sub
Private Sub SetLabelsToTrueSourceValue(ByRef sr As Series)
    'Get source data range addresses from formula
    Dim SourceData() As String
    A = Split(sr.Formula, ",")
    'Get actual non-formatted values from value range
    Dim Values() As Variant
    Values = Range(A(2)).Value2
    i = 1
    On Error Resume Next 'Avoid fatality if no data label present
    For Each pt In sr.Points
        pt.DataLabel.Text = Values(i, 1)
        i = i + 1
    Next
End Sub

答案 1 :(得分:0)

我已经提供了一些VBA代码来为您完成此任务。代码基于我在此处显示的表单,因此您可能需要根据自己的数据集进行调整。

enter image description here

代码如下。请密切关注注释,因为您需要编辑以适合您的特定工作簿。您可以创建一个按钮(如图所示)并将宏指定给按钮并在将图表发送到分发之前运行它,以便显示正确的数据标签。

Sub UpdateLabels()

Dim cht As ChartObject, srs As Series, pts As Point
Dim wsC As Worksheet, wsD As Worksheet

Set wsC = Sheets("sheet-chart-is-on") ' change to the correct sheet name for you
Set wsD = Sheets("sheet-data-is-on") ' change to correct sheet name for you

Set cht = wsC.ChartObjects("Chart 2") 'change to the correct chart name for you

With cht

    For Each srs In .Chart.SeriesCollection

        Dim i As Long

        i = 1

        For Each pts In srs.Points

            Dim s As String
            s = wsD.Cells(i, 8).Value ' based on data range being from H1:H7, if you need to adjust the column and or row you can do so in the Cells arguments

            If s <> "-" Then s = Format(s, "#0%") 'formats as pct, you can change this by changing what is in ""

            srs.Points(i).DataLabel.Text = s

            i = i + 1

        Next

    Next

End With

End Sub

所有这一切,将代码放在VBE中的新模块中。 Here's a small tutorial (plus more) on how to do that.