|
▼hige さん:
> グラフの作成で、
>
> Charts.Add
> ActiveChart.ChartType = xlLine
> ActiveChart.SetSourceData Source:=***, PlotBy:=xlColumns
>
> のような感じでVBAを記録しますよね。このデータ範囲の***のところに、
>
> Range(Cells(n,1),Cells(n+10,2))
>
> のように、Cells を使うとエラーになるみたいなのですが、
> どうすれば良いのでしょうか?
【事実1】標準モジュールで、Rangeとか Cells とかの親(シート)を
省略すると、ActiveSheet が省略されたものと解釈されます。
> Range(Cells(n,1),Cells(n+10,2))
は、(省略しないで書くと)
ActiveSheet.Range( _
ActiveSheet.Cells(n,1), _
ActiveSheet.Cells(n+10,2))
ということなのです。
【事実2】 Excelオブジェクトには2つの種類のSheetがあります。
1つ目は Worksheet (ワークシート)
2つ目は Chart(グラフシート)です。
【事実3】Excelグラフには2つの種類のグラフがあります。
1つ目は「グラフシート」のグラフ Chart です。
Chart(グラフシートのこと)を作る命令は Charts.Add です。
もう一つは「ワークシート」上の埋め込みグラフChartObject です。
埋め込みグラフを作る命令は ActiveSheet.ChartObjects.Add です。
ところが、Worksheet上に埋め込みグラフを作るばあいでも、
「グラフウィザード」を使って作成すると、マクロ記録にあるように
グラフシートを作ってから、描画し、それを元のワークシートに移動
するという <2 Step>処理をして作っています。
以上のことから、
> Charts.Add
> ActiveChart.SetSourceData _
> Source:=Range(Cells(n,1),Cells(n+10,2))
が、
なぜエラーになるのかを説明すると、
まず
> Charts.Add
→で、新規にグラフシートを作ります
このとき「アクティブなシート」は
今作ったChart(グラフシート)を指しています。
つぎに、
> ActiveChart.SetSourceData _
> Source:=Range(Cells(n,1),Cells(n+10,2))
この構文の意味は
《ActiveChart(グラフシートのグラフ)に、
Range(Cells(n,1),Cells(n+10,2))という範囲をSetせよ》
ということで、
【事実2】より いまアクティブなシートはActiveChartですから
【事実1】より RangeとCellsのまえに省略されている「今アクティブ
になっている親シート(すなわちActiveChart)を省略しないで
記述すると、この1行は こうなります。
> ActiveChart.SetSourceData Source:= _
> ActiveChart.Range( _
> ActiveChart.Cells(n,1),ActiveChart.Cells(n+10,2))
このように、省略されているシートを明示的に書き出してみると、
《アクティブなシートであるActiveChartのセル(n,1)〜セル(n+10,2)の
範囲を元データ範囲とせよ》と命令していることになり、ActiveChart
には Cellsとか Range なんて無いので、エラーになります。
マクロ記録をそのまま実行してもエラーにならないのは
>> Charts.Add
>> ActiveChart.SetSourceData _
>> Source:=Sheets("Sheet1").Range("A2:B12")
のように、Rangeのまえに明示的にシートが修飾されているからですね。
それと同じように、
> ActiveChart.SetSourceData _
> Source:=Sheets("Sheet1").Range( _
> Sheets("Sheet1").Cells(n,1),Sheets("Sheet1").Cells(n+10,2))
のように記述すれば、エラーにはならないはずです。
(↑だと、コードが長く、また読みにくくなるので)
通常は元データ範囲をあらわすRange型の変数をひとつ用意しておいて
Dim SrcRange As Range
With Worksheets("Sheet1")
Set SrcRange = .Range((.Cells(n,1), .Cells(n+10,2))
End With
としておいてから、グラフを作成します。
> Charts.Add
> ActiveChart.SetSourceData Source:=SrcRange, PlotBy:=xlColumns
のように。
また、
Sheet1上に、埋め込みグラフを作成なら、
Dim SrcRange As Range
With Worksheets("Sheet1")
Set SrcRange = .Range((.Cells(n,1), .Cells(n+10,2))
With .ChartObjects.Add(左, 上, 幅, 高さ).Chart
.ChartType = xlLine
.SetSourceData SrcRange, xlColumns
End With
End With
とすれば、埋め込みグラフをおく場所とサイズを合わせて指定して
グラフが作成できます。
|
|