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

我需要在Excel VBA中创build条形图。 我使用下面的代码,但是当我正在添加或删除一个行它不工作。

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

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

在这里输入图像说明

 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 

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

图表始终位于K1的左上angular,根据rngChartTopLeftvariables – 您可以根据需要进行调整。

该代码假定它运行在一个工作表模块中(因此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 

请检查下面的代码:

 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