我要做的是创建一个二维堆叠图表,其中我的系列的位置意味着他们在队列中的位置(位置1 - 堆叠列的最后部分是最后得到服务和位置2-是堆叠柱的底部将首先向上)。
我已将数据格式化为这样(但如果解决方案需要,可以轻松更改):
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
我遇到的问题是我希望同一图表上的所有任务和excel都没有在每个x处识别A和B的位置。它只是从第1列假设第2行是A和第3行是B,并且不会根据A / B键在每个后续列中进行调整。我想知道是否有办法做到这一点。
作为回顾,是否可以获得具有多个x值的二维堆叠图表,该x值可识别每个唯一x值处的图例键的位置(无论它应位于列的顶部还是底部)。任何解决方案无论是VBA还是表内公式我都没有运气。谢谢。
答案 0 :(得分:2)
'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
此代码要求您的图例值和数值各自位于不同的列中,如下所示。本例中未使用标签“任务1”等。
A | 100 | B | 400 | B | 510
B | 200 | A | 200 | A | 300