ワークシートとグラフ
Excel VBA ではグラフを描く事もできます。もしデータをシートから取得するなら Range メソッドを使うのですが、ここで問題が一つ。少なくとも Excel 2003 において、グラフがアクティブになった状態で Range メソッドを用いるとエラーになります。具体的には、以下のようなコードの2つ目のグラフ描画がうまくいきません。
' 円グラフの描画範囲指定 Set piePos = ThisWorkbook.Worksheets("グラフシート).Range(Cells(1, 12), Cells(10, 22)) ' 円グラフの表示 With ActiveSheet.ChartObjects.Add(Left:=piePos.Left, Top:=piePos.Top, Width:=piePos.Width, Height:=piePos.Height) .Chart.SetSourceData Source:=ActiveSheet.Range(Cells(12,12), Cells(21, 22)), PlotBy:=xlRows .Chart.ChartType = xlPie .Chart.Location where:=xlLocationAsObject, name:="グラフシート" .name = "円グラフ" End With ' 縦棒グラフの描画範囲指定 Set stackPos = ThisWorkbook.Worksheets("グラフシート").Range(Cells(12, 12), Cells(21, 22)) ' 縦棒グラフの表示 With ActiveSheet.ChartObjects.Add(Left:=stackPos.Left, Top:=stackPos.Top, Width:=stackPos.Width, Height:=stackPos.Height) .Chart.SetSourceData Source:=ActiveSheet.Range(Cells(12,1), Cells(21, 10)), PlotBy:=xlRows .Chart.ChartType = xlColumnStacked .Chart.Location where:=xlLocationAsObject, name:="グラフシート" .name = "縦棒グラフ" End With
ワークブックから明示的に指定したのですが Set stackPos の部分でエラー、またグラフ自体のデータソース指定すらエラーになってしまいます。
仕方がないので、グラフを描く時は範囲の指定を前もって行う方がいいようです。
' グラフの描画範囲指定 Set piePos = ThisWorkbook.Worksheets("グラフシート").Range(Cells(1, 12), Cells(10, 22)) Set stackPos = ThisWorkbook.Worksheets("グラフシート").Range(Cells(12, 12), _ Cells(21, 22)) ' グラフのデータ範囲指定 Set pieRange = ActiveSheet.Range(Cells(12,12), Cells(21, 22)) Set stackRange = ActiveSheet.Range(Cells(12,1), Cells(21, 10)) ' 円グラフの表示 With ActiveSheet.ChartObjects.Add(Left:=piePos.Left, Top:=piePos.Top, Width:=piePos.Width, Height:=piePos.Height) .Chart.SetSourceData Source:=pieRange, PlotBy:=xlRows .Chart.ChartType = xlPie .Chart.Location where:=xlLocationAsObject, name:="グラフシート" .name = "円グラフ" End With With ActiveSheet.ChartObjects.Add(Left:=stackPos.Left, Top:=stackPos.Top, Width:=stackPos.Width, Height:=stackPos.Height) .Chart.SetSourceData Source:=stackRange, PlotBy:=xlRows .Chart.ChartType = xlColumnStacked .Chart.Location where:=xlLocationAsObject, name:="グラフシート" .name = "縦棒グラフ" End With