2007年11月7日水曜日

第57回目 グラフ関係(その3;グラフの追加)

○第57回目 グラフ関係(その3;グラフの追加)

 エクセル2003でグラフの操作を行なって、マクロの記録を取ってみました。

【グラフを追加する場合】
  ActiveChart.SeriesCollection.NewSeries
  ActiveChart.SeriesCollection(2).Name = "=Sheet2!R28C5"
  ActiveChart.SeriesCollection(2).XValues = "=Sheet2!R29C3:R48C3"
  ActiveChart.SeriesCollection(2).Values = "=Sheet2!R29C5:R48C5"

 前提としてはすでに一本のグラフがあり、二本目を追加した場合です。"(2)"はそういうことを表します。
 このイコールの後に、もとにしたい座標を変数で与えればいいことになります。困ったことは座標の表示が、RC方式になっていることです。
 面白い関数がありました。
 "B10:B15"を与えると、"R10C2:R15C2"に変換してくれるのです。

 Sub A1_R1C1_7()
  inputFormula = "B10:B15"
  outff = Application.ConvertFormula(Formula:=inputFormula, _
  fromReferenceStyle:=xlA1, toReferenceStyle:=xlR1C1,ToAbsolute:=xlAbsolute)
  MsgBox outff
 End Sub

 これを使えばいいですね。

 これを前提に組み立ててみましょう。
 パラメータとしては、シート名、表札の座標、横軸の座標、データ値の座標となります。この4項目が1セットとなります。必要なだけ作ってください。
 これをセルに設定します。セットが変わると次の行となります。
 パラメータの範囲を設定してマクロを動かします。
 1.パラメータの取得(追加するグラフ数も求めておきます)
 2.グラフシートへの移動
 3.既存のグラフ数の取得(g_cnt = ActiveChart.SeriesCollection.Count)
 4.座標を加工しグラフの追加
 変数として、
  x_sheet(30), x_name(30), x_midashi(30), XX(30)
 ⇒シート名、表札・横軸・データ値の座標
  xx_suu
 ⇒追加するグラフ数
 を設定します。

【補足説明】
 1.について
 よく出てくる"セル範囲の取得"の機能です。そのうちの行数が追加グラフの数となります。パラメータを配列変数に入れるのは順番さえ間違わなければ簡単です。(3つの場合の範囲の例示です)
 2.について
 シートの移動を使います。次の基本機能を参照してください。グラフシートとワークシートは近くにおいてください。デフォルト値ではグラフシートはワークシートの次となっています。
  ii_max = ActiveWorkbook.sheets.Count
  ii0 = ActiveSheet.Index
'シートの移動(シートは相対位置で指定します)
  sh_cnt = InputBox("新しいシートの場所を入れてください。… -1 , 0 , 1 …など", Default:=1, xpos:=2000, ypos:=3000)
  Sheets(ii0 + sh_cnt).Select
 3.について
 なし
 4.について
 追加するグラフの数だけ繰り返してください。
  ActiveChart.SeriesCollection.NewSeries
  ActiveChart.SeriesCollection(g_cnt + i).ChartType = xlLine
  ActiveChart.SeriesCollection(g_cnt + i).Name = "=Sheet2!R28C5"
  ActiveChart.SeriesCollection(g_cnt + i).XValues = "=Sheet2!R29C3:R48C3"
  ActiveChart.SeriesCollection(g_cnt + i).Values = "=Sheet2!R29C5:R48C5"

 例えば、"=Sheet2!R28C5"の作り方は、
  x_name(i) = Application.ConvertFormula(Formula:=x_name(i), _
  fromReferenceStyle:=xlA1, toReferenceStyle:=xlR1C1,ToAbsolute:=xlAbsolute)
 として
 "=" & x_sheet(i) & "!" & x_name(i)
 とすればいいのです。

 エクセル2007でも以上のことで大丈夫だと思うのですが、表札の座標ではなく値が入ってしまうため、後半の三行を次のようにしています。

 '=SERIES(y=ax2+bx+c!$B$1,y=ax2+bx+c!$A$2:$A$98,y=ax2+bx+c!$B$2:$B$98,1)の形式を再現
 ActiveChart.SeriesCollection.item(g_cnt + i).Formula = _
 "=SERIES(" & x_sheet(i) & "!" & x_name(i) & "," & _
 x_sheet(i) & "!" & x_midashi(i) & "," & _
 x_sheet(i) & "!" & XX(i) & "," & Str(g_cnt + i) & ")"
 (注)エクセル2007では、座標はA1方式で大丈夫です。


0 件のコメント: