添加和删​​除VBA创建的条形图行

时间:2017-11-03 09:18:28

标签: excel vba excel-vba excel-2010

我需要在Excel VBA中创建条形图。我使用下面的代码,但是当我添加或删除行时,它无法正常工作。

我需要固定范围(K1)上的图表。因为当我第二次计算时,它会创建另一个图表。

如何更改代码以防止在调整数据源时添加新图表?

enter image description here

Private Sub CommandButton2_Click()
    Sheets("Sheet7").Range("F2:H12").Select
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.ChartType = xlBarClustered
    ActiveChart.SetSourceData Source:=Range("Sheet7!$F$2:$H$12")
    ActiveChart.SeriesCollection(1).Name = "=Sheet7!$G$1"
    ActiveChart.SeriesCollection(2).Name = "=Sheet7!$H$1"
End Sub

2 个答案:

答案 0 :(得分:1)

在下面的示例代码中,它会检查是否已存在名为TheChart的图表,如果没有,则会创建一个新图表。您现在可以添加和删除行,图表应该会更新。此外,如果您在底部添加新行并点击该按钮,则会重新绘制TheChart而不创建新行。

根据K1变量,图表始终位于rngChartTopLeft的左上角 - 如果需要,您可以对其进行调整。

代码假定它在Sheet模块中运行(因此Set ws = Me),如果您在标准模块中运行它,则可以使用Set ws = ThisWorkbook.Worksheets("your_sheet")设置工作表。

Option Explicit

Private Sub CommandButton1_Click()

    Dim ws As Worksheet
    Dim chto As ChartObject
    Dim rngChartTopLeft As Range
    Dim rngData As Range

    ' assumes the code is in a sheet object
    Set ws = Me

    ' top left of chart
    Set rngChartTopLeft = ws.Range("K1")

    ' create chart or get existing chart
    If ws.ChartObjects.Count = 0 Then
        Set chto = ws.ChartObjects.Add( _
            Left:=rngChartTopLeft.Left, _
            Width:=500, _
            Top:=rngChartTopLeft.Top, _
            Height:=500)
        chto.Name = "TheChart"
    Else
        Set chto = ws.ChartObjects("TheChart")
    End If

    ' set chart type
    chto.Chart.ChartType = xlBarClustered

    ' get data range per last row of data
    Set rngData = ws.Range("F2:G" & ws.Cells(ws.Rows.Count, "G").End(xlUp).Row)

    ' set new chart range
    chto.Chart.SetSourceData rngData

End Sub

答案 1 :(得分:0)

请检查以下代码:

Option Explicit

Private Sub CommandButton1_Click()
Dim mychart As Shape
Dim lastrow As Long


lastrow = Sheet7.Cells(Rows.Count, "F").End(xlUp).Row

For Each mychart In ActiveSheet.Shapes

If mychart.Name = "CommandButton1" Then GoTo exit_

mychart.Delete

exit_:

Next

Sheets("Sheet7").Range("F2:H" & lastrow).Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlBarClustered
ActiveChart.SetSourceData Source:=Range("Sheet7!$F$2:$H$" & lastrow)
ActiveChart.SeriesCollection(1).Name = "=Sheet7!$G$1"
ActiveChart.SeriesCollection(2).Name = "=Sheet7!$H$1"

End Sub