1

私がやろうとしているのは、シリーズの位置がキュー内の位置のようなものを意味する2Dスタックチャートを作成することです(位置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値を持つ2Dスタックチャートを取得することは可能ですか。VBAまたはインシート式のいずれかで私が運がなかった解決策。よろしくお願いします。

4

1 に答える 1

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
于 2012-07-12T17:50:41.307 に答える