任意にデータの範囲を選択し、グラフを描画したい
質問を閲覧していただきありがとうございます。
できればみなさんのお力を貸していただきたいことがあり、質問しました。
以下にマクロ作成に用いたプログラムの仕様とコードを貼りますので、ご指摘等いただけましたら幸いです。
まず、今回のマクロの目的は
・既に存在するエクセルデータから、x軸、y軸のデータ列の長さに応じたグラフを描画するVBプログラムを書く事 です。
・可能ならば、既存のふたつのグラフを結合したものを新しく表示する
※データシートの画像は添付しましたのでご覧ください。
以上のふたつとなります。
理想形としては、
A2 ~ A1025までをx軸のデータ、B2~B1025までの実データ値としたグラフAを一つ
D2 ~ E1025までをx軸のデータ、E2~E1025までの実データ値としたグラフBを一つ
上記二つのグラフを結合したグラフを一つ
の3つのグラフが自動的に作成され、エクセルファイル上に表示されている といったような感じです。
私の書いたコードの問題点としては、
・グラフAグラフBともに「x軸と実データが正しく対応していない」
→本来両方のグラフにおいてはグラフの右端まで折れ線グラフが続いているはずですが、x軸の値にして約1000の所でデータが終わってしまっています。
・グラフBでは、D2 ~ D344, E2 ~ E344 を基にしたグラフ一つのみが描画されているはずですが、ここには何故か二つ以上の折れ線グラフがあるようにみえ、グラフB右には系列1~5までがあるように書かれています。(理想としては5個ではなく実データを示すもの一つのみ)
・ふたつのグラフの結合方法が不明
という感じです。
以下にプログラムを貼ります。
お時間ありましたら、ご指摘の程宜しくお願い致します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub グラフ描画()
chart_title1 = "グラフA"
chart_title2 = "グラフB"
'軸のタイトル
x_title = "周波数[Hz]"
y_title = "パワー"
' -------------------------グラフ作成----------------------
' グラフを描画
Dim chartObj1 As ChartObject
Set chartObj1 = ActiveSheet.ChartObjects.Add(1, 1, 300, 200)
With chartObj1.Chart
' データ範囲をセット
.SetSourceData Source:=Range(Range("B2"), _
Cells(2, 1).End(xlDown))
' x軸の項目軸範囲をセット
.SeriesCollection(1).XValues = Range(Range("A2"), _
Cells(1, 1).End(xlDown))
' オプションをセット
.ChartType = xlXYScatterSmoothNoMarkers ' 散布図
.HasTitle = True
.ChartTitle.Characters.Text = chart_title
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_title
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_title
' x軸の最大値、最小値設定
.Axes(xlCategory, xlPrimary).MinimumScale = 0
.Axes(xlCategory, xlPrimary).MaximumScale = 4500
' y軸の最大値、最小値設定
.Axes(xlValue).MinimumScale = -10
.Axes(xlValue).MaximumScale = 3
End With
Dim chartObj2 As ChartObject
Set chartObj2 = ActiveSheet.ChartObjects.Add(1, 320, 300, 200)
With chartObj2.Chart
' データ範囲をセット
.SetSourceData Source:=Range(Range("E2"), _
Cells(2, 1).End(xlDown))
' x軸の項目軸範囲をセット
.SeriesCollection(1).XValues = Range(Range("D2"), _
Cells(1, 1).End(xlDown))
' オプションをセット
.ChartType = xlXYScatterSmoothNoMarkers ' 散布図
.HasTitle = True
.ChartTitle.Characters.Text = chart_title
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_title
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_title
' x軸の最大値、最小値設定
.Axes(xlCategory, xlPrimary).MinimumScale = 0
.Axes(xlCategory, xlPrimary).MaximumScale = 4500
' y軸の最大値、最小値設定
.Axes(xlValue).MinimumScale = -10
.Axes(xlValue).MaximumScale = 3
End With
End Sub
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
お礼
>『AxisTitleクラスのTextプロパティを設定できません』ではなく? >バージョンが2010なのでしょうか。 Excel2007です。 「オブジェクトが必要です」とメッセージボックスが表示されました。 >いずれにしても、Activateに頼らないコーディングに切り替えたほうが良いです。 すいません、どうやって追加するのか試しにマクロ記録を使用したところ深みにはまりました >それにマクロ記録で .Axes(xlValue, xlPrimary).HasTitle = True 的なコードは >記録されていませんか? HasTitleはなく、以下のようなコードが記録されました。 ActiveChart.SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis) ActiveSheet.ChartObjects("グラフ 3").Activate ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "μsec" ActiveSheet.ChartObjects("グラフ 3").Activate ActiveChart.ChartArea.Select 原因がわかりました初歩的な勘違いです。 チャートオブジェクトを以下で定義できると考えていたのですが、 シート名.ChartObjects("グラフ名") 正しくは以下ですね シート名.ChartObjects("グラフ名").Chart これで「オブジェクトが必要です」は解決できましたが、 これでも別のエラーが出ました、おそらくラベルが表示されてないエラーだと思います。 教えていただいた HasTitle = True を使用して 以下のようにしたところうまくいきました、 ありがとうございました。 ChartObjects(ActiveChart.Parent.Name).Chart.Axes(xlValue, xlPrimary).HasTitle = True ChartObjects(ActiveChart.Parent.Name).Chart.SetElement (msoElementPrimaryValueAxisTitleRotated) ChartObjects(ActiveChart.Parent.Name).Chart.Axes(xlValue, xlPrimary).AxisTitle.Text = "電界強度(V/m)" ChartObjects(ActiveChart.Parent.Name).Chart.SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis) ChartObjects(ActiveChart.Parent.Name).Chart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "μsec"