| 
    
     |  | ▼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
 
 とすれば、埋め込みグラフをおく場所とサイズを合わせて指定して
 グラフが作成できます。
 
 
 |  |