代码之家  ›  专栏  ›  技术社区  ›  Deepak

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

  •  2
  • Deepak  · 技术社区  · 8 年前

    我需要在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 回复  |  直到 8 年前
        1
  •  1
  •   Robin Mackenzie    8 年前

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

    图表始终位于 K1 根据 rngChartTopLeft 变量-可根据需要进行调整。

    代码假设它在一个工作表模块中运行(因此 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
    
        2
  •  0
  •   Nikolaos Polygenis    8 年前

    请检查以下代码:

    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