使用 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
我目前正在做一个项目,我想在 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