添加和删除由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,根据rngChartTopLeft
variables – 您可以根据需要进行调整。
该代码假定它运行在一个工作表模块中(因此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