FancyDolphin
FancyDolphin

Reputation: 457

Creating a 2d stacked column chart with priority

What I'm trying to do is create a 2d stacked chart where the position of my series means something like where they are in a queue (position 1 - being the upermost section of the stacked column is last to get served and position 2- is the bottom section of the stacked column will be first up).

I've formatted my data to looks like this (but this can be easily changed if the solution needs it to be):

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

The issue I'm having is that I want all tasks on the same chart and excel isn't recognizing at every x the position of A and B. It simply is assuming from Column 1 that Row 2 is A and Row 3 is B and is not adjusting in each subsequent column based on the A/B keys. I'm wondering if there's a way to do this.

As a recap, is it possible to get a 2d stacked chart with multiple x-values that recognizes the position of your legend keys (whether it should be at the top or bottom of the column) at each unique x-value. Any solution either VBA or in-sheet formula I haven't had any luck with.Thanks in advance.

Upvotes: 1

Views: 1220

Answers (1)

Stewbob
Stewbob

Reputation: 16899

'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

This code requires that your legend values and number values each be in separate columns like shown below. The labels 'Task 1', etc. are not used in this example.

A | 100 | B | 400 | B | 510 
B | 200 | A | 200 | A | 300

Upvotes: 2

Related Questions