'How to automate making charts for every N number of cells and rows in Excel?
I am working with a large data set that contains around 17k values and I need to make a chart for every 29 values. For instance if the data set is of 58 values, I need to make a chart for every 29 values and thus make two charts.
I have written the following code to make the charts:
'''
Sub Charts()
'
' Charts Macro
'
'
Range("D3:D32").Select
ActiveSheet.Shapes.AddChart2(227, xlLine).Select
ActiveChart.SetSourceData Source:=Range("Sheet1!$D$3:$D$32")
Application.CutCopyMode = False
Application.CutCopyMode = False
ActiveChart.FullSeriesCollection(1).Name = "=""Marginal Costs"""
ActiveChart.FullSeriesCollection(1).XValues = "=Sheet1!$C$3:$C$32"
Range("D32:D61").Select
ActiveSheet.Shapes.AddChart2(227, xlLine).Select
ActiveChart.SetSourceData Source:=Range("Sheet1!$D$32:$D$61")
Application.CutCopyMode = False
Application.CutCopyMode = False
ActiveChart.FullSeriesCollection(1).Name = "=""Marginal Costs"""
ActiveChart.FullSeriesCollection(1).XValues = "=Sheet1!$C$32:$C$61"
End Sub
'''
This is quite a tedious step for 17k values.
Can someone please suggest an easier way of making charts for the data? I would be deeply grateful for the same.
Solution 1:[1]
Use a For/Next Loop with Step size of 29.
Option Explicit
Sub ChartsMacro()
Const SIZE = 29
Dim ws As Worksheet, cht As Chart, c, sTitle As String
Dim lastrow As Long, r As Long, n As Long, L As Long, T As Long
Dim t0 As Single: t0 = Timer
Application.ScreenUpdating = False
Set ws = ActiveSheet
With ws
lastrow = .Cells(.Rows.Count, "C").End(xlUp).Row
For r = 3 To lastrow Step SIZE
n = n + 1
Application.StatusBar = "Chart " & n
' position and title chart
sTitle = "Chart " & n & " (" & r & " to " & r + SIZE & ")"
L = .Range("F" & r + 1).Left
T = .Range("F" & r + 1).Top
.Range("C" & r).Resize(, 10).Borders(xlEdgeTop).Color = vbBlack
' create chart
Set cht = .Shapes.AddChart2(227, xlLine, Left:=L, Top:=T).Chart
cht.SetSourceData Source:=.Range("D" & r).Resize(SIZE + 1)
cht.ChartTitle.Text = sTitle
cht.FullSeriesCollection(1).Name = "=""Marginal Costs"""
cht.FullSeriesCollection(1).XValues = .Range("C" & r).Resize(SIZE + 1)
Next
End With
Application.ScreenUpdating = True
Application.StatusBar = "Done"
MsgBox n & " Charts created in " & Format(Timer - t0, "0.0") & " secs"
End Sub
Solution 2:[2]
Nested for loop is how I've handled similar problems in the past. Something like
For i=1 to 17k/29
create chart
for k=1 to 29
range = i*k
data = range
Assuming your data is sequential and in same range each time you just have to figure out the actual steps for a single set then let it go.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | CDP1802 |
Solution 2 | Basbadger |