/*Google AdSense自動広告*/

2019年11月30日土曜日

Excel VBAでグラフの範囲をグラフタイトル+複数列(配列)で設定する

以前Excel VBAでグラフをタイトルで操作するコードを書きました(→記事

今回は、バラバラに並んだ項目名から、そのグラフに必要な列を検索し、グラフの範囲指定を自動化します。

実務では、Alteryxでビッグデータから作った表の項目が、毎回違う場合でも、同じフォーマットに出力するために作りました。やっぱりまだExcelのグラフの方がフレキシブルで綺麗なので。

こんな表から、



定型フォーマットのグラフ一覧へ、データをセットするコードです。



1. ユーザー定義クラス graphInSheet



  1. Public graphSet As Dictionary
  2. Private targetSheet As Worksheet
  3. Public Function setSheet(mySheet As Worksheet)
  4. Set targetSheet = mySheet
  5. With targetSheet
  6. Set graphSet = New Dictionary
  7. Dim chart
  8. For Each chart In targetSheet.ChartObjects
  9. graphSet.Add chart.chart.ChartTitle.Text, chart.Name
  10. Next
  11. End With
  12. End Function
  13. Public Function setSourceData(GraphTitle, setRange As Range)
  14. With targetSheet
  15. Dim currentChart As chart
  16. Set currentChart = .ChartObjects(graphSet(GraphTitle)).chart
  17. currentChart.setSourceData Source:=setRange
  18. End With
  19. End Function
  20. Public Function setCategoryMinMax(GraphTitle, MinScale, MaxScale)
  21. With targetSheet
  22. Dim currentChart As chart
  23. Set currentChart = .ChartObjects(graphSet(GraphTitle)).chart
  24. currentChart.Axes(xlCategory).MinimumScale = MinScale
  25. currentChart.Axes(xlCategory).MaximumScale = MaxScale
  26. End With
  27. End Function

2. メインコード「RangeをUnionする」



  1. Public Sub setDataToGraph()
  2. Dim payment, payments
  3. payments = Array("現金", "カード", "PayPay")
  4. '今回はグラフとデータを別にしましたが、同じシートでも可
  5. Dim graphs As New graphInSheet
  6. graphs.setSheet ThisWorkbook.Worksheets("graph")
  7.  
  8. Dim dataSheet As Worksheet
  9. Set dataSheet = ThisWorkbook.Worksheets("data")
  10. Dim region
  11. For Each region In graphs.graphSet
  12. Dim dataColumns As New Dictionary
  13. Dim setRange As Range, lastRow
  14. With dataSheet
  15. '横軸(項目に対して固定)を設定
  16. lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
  17. Set setRange = .Range(.Cells(1, 1), .Cells(lastRow, 1))
  18. '各グラフに必要な項目の列を収集
  19. dataColumns.RemoveAll
  20. For Each payment In payments
  21. dataColumns.Add .Rows(1).Find(region & "_" & payment).Column, Null
  22. Next
  23. '列からRangeの集合を作成し、グラフにセット
  24. Dim setColumn
  25. For Each setColumn In dataColumns
  26. Set setRange = Union(setRange, .Range(.Cells(1, setColumn), _
  27. .Cells(lastRow, setColumn)))
  28. Next
  29. End With
  30. graphs.setSourceData region, setRange
  31. Next
  32. End Sub


一番左の横軸となる列を範囲指定し、そのRangeへUnionで必要な列を追加していきます。できあがったRangeをChartObjectにsetSourceDataで入れればいいのですが、グラフのタイトルでなく、「Chart12」などとExcelで決められたオブジェクト名で指定するのが不便なため、ユーザー定義クラスでシート中の全グラフを保持しておきます。

ただし、グラフタイトルが被るとうまく動作しませんので、別の方法を考えなければいけません(結局Chart番号??)。


0 件のコメント:

コメントを投稿