我正在开发一个具有大量图表的仪表板,并且随着这些图表上显示的数据发生变化,数字的格式也会发生变化。在我现在的这一点上,我遇到了一个问题,试图从循环遍历图表中所有系列的数据所基于的电子表格中检索预期的格式代码。 这是迄今为止的代码:
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”,对于整数,“#,#”表示具有重要小数的数字,以及百分比的“%”。它们以纯文本形式存储。所以代码的最后一点看起来像:
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 Match,无济于事。解决这个问题的任何帮助都是非常令人沮丧的!
答案 0 :(得分:3)
您可以通过其Formula
属性爬上一系列源范围。
因为它的格式为:
=SERIES(,,sheetname!sheetRange,)
然后你对#34;第三元素"感兴趣,如果你把它分成一个数组","作为分隔符
所以你可以编码:
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