- Creating a 2d stacked column chart with priority
- Task 1 Task 2 Task 3 <- x-axis
- A 100 B 400 B 510 <- This row is position 1
- B 200 A 200 A 300 <- This row is position 2
- ^-Legend
- 'Run this macro from the sheet containing your data, after highlightling the data.
- Sub Macro3()
- 'The below code assumes that you have already selected
- 'the columns containing your data and that the first column,
- 'and every 2nd column after that contains your legend keys.
- Dim rng As Range
- Set rng = Selection
- Dim colNum As Integer
- Dim rowNum As Integer
- Dim strLegend As String
- Dim rowStart As Integer
- Dim colStart As Integer
- Dim strSeries As String
- Dim i As Integer
- Dim seriesNum As Integer
- Dim shtName As String
- rowStart = rng.Row
- colStart = rng.Column
- shtName = ActiveSheet.Name & "!"
- 'Creates an empty chart...
- ActiveSheet.Shapes.AddChart.Select
- '...of type StackedColumn.
- ActiveChart.ChartType = xlColumnStacked
- seriesNum = 0
- 'Select all the cells that match the legend in the first column.
- For rowNum = 0 To rng.Rows.Count - 1
- strLegend = Cells(rowStart + rowNum, colStart).Value
- strSeries = "=" & shtName & Cells(rowStart + rowNum, colStart + 1).Address
- For colNum = 2 To rng.Columns.Count - 1 Step 2
- For i = 0 To rng.Rows.Count - 1
- If Cells(rowStart + i, colStart + colNum).Value = strLegend Then
- strSeries = strSeries & "," & shtName & Cells(rowStart + i, colStart + colNum + 1).Address
- Exit For
- End If
- Next
- Next
- 'Create a new series.
- ActiveChart.SeriesCollection.NewSeries
- seriesNum = seriesNum + 1
- 'Set the legend.
- ActiveChart.SeriesCollection(seriesNum).Name = strLegend
- 'Set the X axis labels to nothing, so the default is used.
- ActiveChart.SeriesCollection(seriesNum).XValues = ""
- 'Set the series data.
- ActiveChart.SeriesCollection(seriesNum).Values = strSeries
- Next
- 'An extra series gets added automatically???
- 'This code removes it.
- If ActiveChart.SeriesCollection.Count > rng.Rows.Count Then
- ActiveChart.SeriesCollection(rng.Rows.Count + 1).Delete
- End If
- End Sub
- A | 100 | B | 400 | B | 510
- B | 200 | A | 200 | A | 300