VBA图表:将最后一个非空行作为源数据进行范围调整

时间:2017-02-22 17:58:33

标签: excel vba excel-vba charts

所以我有一个数据跨越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还是比较新的,感谢任何帮助。

1 个答案:

答案 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