エクセル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 件のコメント:
コメントを投稿