所以我有一个数据跨越A2到AF17的电子表格,我隐藏了大多数列,现在只有列:I,AB,AD,AF显示,其中列I是我想要的范围作为轴标签范围,和列AF作为值范围。
我编写了以下代码来创建一个图形,该图形动态地使用范围直到最后一个非空行为值:
Private Sub CommandButton2_Click()
Dim MyEmbeddedChart As Chart
Set MyEmbeddedChart = Sheets("Analysis").Shapes.AddChart(Width:=634, Height:=250).Chart
With MyEmbeddedChart
.ChartType = xlBarClustered
.ChartStyle = 339
.SetSourceData Source:=Sheets("Analysis").Range("AF2", Cells(Rows.Count, 1).End(xlUp))
.Legend.Delete
.Axes(xlValue).Delete
.Axes(xlValue).MajorGridlines.Format.Line.Visible = msoFalse
.ApplyDataLabels
End With
End Sub
现在即使生成的图形自动将列I显示为轴标签范围,也只是因为列I现在是最左边的可见列。也就是说,实际上源数据范围是A2:AF17,轴标签范围实际上是A2:AD17。一旦我取消隐藏列,自然轴标签就搞砸了。
即使当前图表符合我的目的,但它绝对不是理想的。那么如何将源数据精确设置为第一列作为轴标签范围,将列AF设置为值范围,同时继续使用最后一个非空行方法?
我对VBA还是比较新的,感谢任何帮助。
答案 0 :(得分:0)
我更喜欢使用ChartObject
代替Chart
,我发现在所有属性下面嵌套比使用Chart.Parent
更容易。
以下代码将创建您的图表,然后为Series
添加Range
Range
(完全限定Values
),列“I”为Range
XValues
(X轴)。{/ p>
<强>代码强>
Option Explicit
Private Sub CommandButton2_Click()
Dim MyEmbeddedChart As ChartObject
Dim Sht As Worksheet
Set Sht = Worksheets("Analysis")
Set MyEmbeddedChart = Sht.ChartObjects.Add(100, 100, 634, 250)
With MyEmbeddedChart
With .Chart
.ChartType = xlBarClustered
.ChartStyle = 339
.Legend.Delete
.Axes(xlValue).Delete
.Axes(xlValue).MajorGridlines.Format.Line.Visible = msoFalse
.ApplyDataLabels
End With
' this is for one series , you need to do this for every series collection
With .Chart.SeriesCollection.NewSeries
.Name = "ser" & MyEmbeddedChart.Chart.SeriesCollection.Count
.Values = Sht.Range("AF2", Sht.Cells(Sht.Rows.Count, "AF").End(xlUp))
.XValues = Sht.Range("I2", Sht.Cells(Sht.Rows.Count, "I").End(xlUp))
End With
End With
End Sub