Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13726 / 76738 ←次へ | 前へ→

【68515】Re:教えてください
発言  kanabun  - 11/3/13(日) 0:50 -

引用なし
パスワード
   ▼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

とすれば、埋め込みグラフをおく場所とサイズを合わせて指定して
グラフが作成できます。
0 hits

【68500】教えてください hige 11/3/11(金) 8:55 質問
【68501】Re:教えてください kanabun 11/3/11(金) 9:39 発言
【68513】Re:教えてください hige 11/3/12(土) 23:05 お礼
【68515】Re:教えてください kanabun 11/3/13(日) 0:50 発言
【68518】Re:教えてください hige 11/3/13(日) 12:43 お礼
【68502】Re:教えてください Yuki 11/3/11(金) 10:08 発言
【68514】Re:教えてください hige 11/3/12(土) 23:08 お礼

13726 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free