使用 VBA 在 Excel 中自动创建图表

Automate creation of graphs in Excel using VBA

我目前正在做一个项目,我想在 Excel 中自动创建图表。我在一个 sheet 中有数据表,我已经设法使用 VBA 从所有表中创建图表。由于 sheet 可能会持续更新更多表,因此我想扩展我的宏以便能够识别这一点。我想我需要一套 sheet 的规则。 Fx 如果我在 A 列的单元格中添加一个新标题并为其着色,它知道我什么时候 运行 这次它应该添加另一个图表的宏。我还需要一个带有某种“代码”名称的单元格,它应该适用于哪种类型的图表。 我的宏固定到我目前在 sheet 中的表,并且我将其设为动态以防我添加更多列(当我添加 2022、2023 等时)。我很想知道是否有人以前尝试过这个或者对如何解决这个问题有合格的建议 非常感谢!

    Sheets("tables").Select

    Dim xData As Range

    Range("C78", Range("C78").End(xlToRight)).Select
    Set xData = Selection.Cells
    
'---table1---
    Range("B79").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWorkbook.Names.Add Name:="table1Data", RefersToR1C1:= _
        "=Uddybet!R79C2:R82C7"
    ActiveWorkbook.Names("table1Data").Comment = ""

    ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
    ActiveChart.SetSourceData Source:=Range("table1Data")
    ActiveChart.FullSeriesCollection(1).XValues = xData
    ActiveChart.ChartTitle.Text = "1"

'---table2---
    Dim colCount As Byte
    
    Range("B79", Range("B79").End(xlToRight)).Select
    colCount = Selection.Cells.Count + 2
    
    Dim table2Data As Range
    
    Selection.Offset(0, colCount).Select
    Range(Selection, Selection.End(xlDown)).Select
    Set table2Data = Selection.Cells

    ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
    ActiveChart.SetSourceData Source:=table2Data
    ActiveChart.FullSeriesCollection(1).XValues = xData
    ActiveChart.ChartTitle.Text = "2"
    ActiveChart.Axes(xlValue).MaximumScale = 0.16
    
'---table3---
    Dim table3Data As Range
    
    table2Data.Select
    
    Selection.Offset(0, colCount).Select
    Range(Selection, Selection.End(xlDown)).Select
    Set table3Data = Selection.Cells

    ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
    ActiveChart.SetSourceData Source:=table3Data
    ActiveChart.FullSeriesCollection(1).XValues = xData
    ActiveChart.ChartTitle.Text = "3"
    ActiveChart.Axes(xlValue).MaximumScale = 0.18

'---table4---  
    Dim table4Data As Range
    
    table3Data.Select
    
    Selection.Offset(0, colCount).Select
    Range(Selection, Selection.End(xlDown)).Select
    Set table4Data = Selection.Cells

    ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
    ActiveChart.SetSourceData Source:=table4Data
    ActiveChart.FullSeriesCollection(1).XValues = xData
    ActiveChart.ChartTitle.Text = "4"
    ActiveChart.Axes(xlValue).MaximumScale = 0.2
   
End Sub

我认为最好的方法是开始:

  • 将范围转换为 table objects,又名列表objects。
  • 创建一个table来控制打印哪些图表,这里命名为 'TableChartControl',这里还有图表的类型,图表 标题和是否打印。

使用此解决方案,您可以根据需要添加任意数量的 table,并且只创建所需的图表!

Sub PrintCharts()
    Dim ws As Worksheet: Set ws = Sheets("Tables")
    Dim olControl As ListObject: Set olControl = ws.ListObjects("TableChartControl")
    Dim ol As ListObject
    Dim olCol As Byte
    Dim olColRng As Range, olRng As Range
    Dim aCell As Range
    
    Dim xt As Object
    Dim xtTypeValue As String
    Dim xtType As XlChartType
    Dim xtTitle As String
    
    ' clear table filters
    If olControl.AutoFilter.FilterMode Then olControl.AutoFilter.ShowAllData
    
    ' filter chart to be printed
    olCol = olControl.ListColumns("Print").Index
    olControl.Range.AutoFilter field:=olCol, Criteria1:="yes"
    
    ' check for visible rows
    On Error Resume Next
    Dim olRowsVisible As Integer
    olRowsVisible = olControl.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Count
    On Error GoTo 0
    
    ' copy only if any rows visible
    If olRowsVisible = 0 Then Exit Sub
    
    ' list of charts to be created
    olCol = olControl.ListColumns("TableName").Index
    Set olColRng = olControl.ListColumns(olCol).DataBodyRange.SpecialCells(xlCellTypeVisible)
            
    ' print charts
    For Each aCell In olColRng
        ' Select table
        Set ol = ws.ListObjects(aCell.Value)
        Application.GoTo ol.Range

        xtTypeValue = aCell.Offset(0, olControl.ListColumns("XlChartType").Index - 1).Value
        xtTitle = aCell.Offset(0, olControl.ListColumns("ChartTitle").Index - 1).Value
        
        ' type of chart
        Select Case xtTypeValue
            Case "xlLineMarkers": xtType = xlLineMarkers
            Case "xlLine": xtType = xlLine
            Case "xlColumnClustered": xtType = xlColumnClustered
            Case "xlColumnStacked": xtType = xlColumnStacked
        End Select

        ' Create chart
        ' https://docs.microsoft.com/en-us/office/vba/api/excel.xlcharttype
        Set xt = ws.Shapes.AddChart2
        With xt.Chart
            .ChartType = xtType
            .ChartTitle.Caption = xtTitle
        End With
    Next aCell
    
    ' clear table filter
    If olControl.AutoFilter.FilterMode Then olControl.AutoFilter.ShowAllData
    
    ' clear
    Set xt = Nothing
    Set ol = Nothing
    Set olControl = Nothing
End Sub