使用VBA格式化图表数据标签

我正在开发一个有很多图表的仪表板,随着这些图表上显示的数据的变化,数字的格式也会变化。 现在,我遇到了一个问题,试图从数据所基于的电子表格中检索预期的格式代码,在图表中的所有系列中循环。 以下是目前的代码:

Sub FixLabels(whichchart As String) Dim cht As Chart Dim i, z As Variant Dim seriesname, seriesfmt As String Dim seriesrng As Range Set cht = Sheets("Dashboard").ChartObjects(whichchart).Chart For i = 1 To cht.SeriesCollection.Count If cht.SeriesCollection(i).name = "#N/D" Then cht.SeriesCollection(i).DataLabels.ShowValue = False Else cht.SeriesCollection(i).DataLabels.ShowValue = True seriesname = cht.SeriesCollection(i).name Debug.Print seriesname 

有了这个,我可以检索不会导致错误的de系列的名称,并隐藏所做的系列。 到现在为止还挺好。 现在开始格式化:有一列存储了这个工作簿的所有可能的序列名,左边一列是我的格式化代码,整型数字是“int”,“#,#”是具有重要小数的数字,以及百分比的“%”。 这些以纯文本forms存储。 所以代码的最后一点看起来像:

 Select Case seriesfmt Case "int" Cht.SeriesCollection(i).DataLabels.NumberFormat = "#" Case "#,#" Cht.SeriesCollection(i).DataLabels.NumberFormat = "#,###" Case "%" Cht.SeriesCollection(i).DataLabels.NumberFormat = "#.0%" End Select End If Next i 

最后真正的问题在这里:介于两者之间。 我无法检索系列格式! 我最好的猜测是:

 With Sheets("CxC").Range("K22:K180") seriesfmt = .Find(seriesname).Offset(0, -1).Value End With 

我有错误,告诉我With块没有定义。 我尝试了几个组合的相同的命令,有或没有With方法,有和没有Set方法,我尝试了WorksheetFunction匹配,无济于事。 任何帮助解决这个问题是非常令人沮丧的!

您可以通过其Formula属性爬升到一系列源范围。

由于它具有以下格式:

 =SERIES(,,sheetname!sheetRange,) 

那么你对它的“第三元素”感兴趣,如果你把它分割成一个数组,用“,”作为分隔符

所以你可以编码:

 Sub FixLabels(whichchart As String) Dim cht As Chart Dim i As Long With Sheets("Dashboard").ChartObjects(whichchart).Chart '<--| reference your chart For i = 1 To .SeriesCollection.Count '<--| loop through all series With .SeriesCollection(i) '<--| reference current series If .Name = "#N/D" Then .DataLabels.ShowValue = False Else .HasDataLabels = True '<--| be sure labels are "activated" .DataLabels.ShowValue = True '<--| show data labels .DataLabels.NumberFormat = GetFormat(Split(.Formula, ",")(2)) '<-- set data label format End If End With Next i End With End Sub Function GetFormat(dataSource As Variant) As String With Range(dataSource).Cells(1, 1) '<-- reference the first cell of the data source Select Case True Case InStr(.Text, "%") > 0 GetFormat = "#.0%" Case Int(CDbl(.Text)) = CDbl(.Text) GetFormat = "#" Case Else GetFormat = "#,###" End Select End With End Function