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

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

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%的问题,但是如果没有数据,公式会返回一个“ – ”,例如3月份会返回一个“ – ”,因为没有任何数据,但是这在图表上显示为0%。

那么有没有办法可以包括所有的月份(一月,二月,三月和四月),并显示几个月有0%的问题,但没有其他数据 – 理想情况下通过数据标签一个“ – ”为没有数据的月份?

另外值得注意的是,图表一次仅显示一个商店的数据,而其所依赖的商店则由用户使用下拉框来select – 因此,作为示例,虽然在3月份没有Argos的数据,三月份可能有百安居数据,四月份则没有百安居数据。

我不确定旧版本的Excel,但是Excel 2013有一个数据标签选项“来自单元格的值”,基本上可以实现您想要的function

在这里输入图像说明


编辑

所以我看了Excel 2010,我不认为它有这个function。 如果你想避免VBA,这里有几个选项:

1.)使用缺失数据的空白值… 在这里输入图像说明

2.)您也可以通过定义像这样的自定义格式来做格式化技巧…

#0 ##。 “负面表明这一点”; “零显示这个”; “所有文字都显示这个”

问题在于图表使用的系列值需要数字值或空格,所以文本格式不会带入,而是留下零格式,因为图表数据的文本被转换为零。

在这里输入图像说明

3.)然后,当然,你也可以select使用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 

我已经提供了一些VBA代码来完成这个。 代码基于我在这里显示的工作表,所以您可能需要为自己的数据集进行调整。

在这里输入图像说明

代码如下。 请密切关注评论,因为您需要进行编辑以适合您的特定工作簿。 您可以制作一个button(如图所示),然后将macros指定给该button,然后在将图表发送到分配之前运行该button,以显示正确的数据标签。

 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中的一个新模块中。 这里有一个小教程(加上更多)如何做到这一点。