ワークシートとグラフ

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