エクセルのグラフをVBAでコントロールする方法

A列に日付け、B列に3桁程度の数字、C列に小数点の割合が入っているシートがあります。
これをX軸をA列。B列を左のY軸で表示。C列を右列のY軸で表示したいのです。
単なるサンプルではなく、オブジェクトモデルを意識した解説をしていただけないでしょうか。もしくは丁寧に解説されているサイトがあればお願いします。
というのも、今後、グラフを増やすことが十分にありそうなので、わかってVBAを書きたいのです。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/06/17 23:40:22
  • 終了:2010/06/18 13:37:34

ベストアンサー

id:SALINGER No.4

SALINGER回答回数3454ベストアンサー獲得回数9692010/06/18 12:12:46

ポイント84pt

VBAのChartに関することは、上手くまとまっているサイトがあまりないですね。

それはExcelのバージョンにより、グラフは機能が追加される部分が多く、

それに合せVBAも追加変更されるので網羅的に解説しているサイトを作りづらいせいだと推測します。

例えば、2007以降のShaps.AddChartが2003で使えなかったり面倒だったりします。


>これがX軸になるのはなぜなのでしょう?

データソースで指定したセル範囲で、左から最右の数値以外のセルまでがX列となり、

それ以外の列がデータ系列となるように自動的処理されるからです。

ここでは日付もシリアル値ではなく数値以外として処理されデータ系列にはなりません。

その為2軸のグラフなどをVBAで作成するときには明示的に軸を指定することになります。


SetSourceDataによるデータ範囲の指定は、上記のような自動的な処理になるので

軸の変更など細かな指定をする場合はNewSeriesでデータ系列を作成して個々に設定することになります。


2軸のグラフを作成するのに参考になるのは、こちら

http://www.k1simplify.com/vba/tipsleaf/graph05.html


各データ系列はSeriesCollectionで指定できますので、

ChartTypeプロパティ グラフの種類

XValuesプロパティ X軸となる範囲。これは一つのデータ系列で指定すればいいです。

Valuesプロパティ データ範囲

AxisGroupプロパティ 第2軸にする場合はxlSecondaryか2を指定。


コメント欄のコードを書き直してみると。

Sub Macro1()
    Dim endRow As Long
    Dim myChart
    Dim Drange As Range
    Dim Trange As Range
    Dim Rrange As Range
    
    'ここではmyChartにChartを指定しています。
    Set myChart = ActiveSheet.ChartObjects.Add(100, 100, 300, 200).Chart
    
    myChart.ChartType = xlLine
    With Worksheets(1)
        endRow = .Cells(Rows.Count, "A").End(xlUp).Row
        Set Drange = Range(.Cells(1, 1), .Cells(endRow, 1))
        Set Trange = Range(.Cells(1, 2), .Cells(endRow, 2))
        Set Rrange = Range(.Cells(1, 3), .Cells(endRow, 3))
    End With
    
    myChart.SeriesCollection.NewSeries
    With myChart.SeriesCollection(1)
        .XValues = Drange
        .Values = Trange
    End With
    
    myChart.SeriesCollection.NewSeries
    With myChart.SeriesCollection(2)
        .Values = Rrange
        .AxisGroup = xlSecondary
    End With
    
    '2軸の最小最大を指定
    myChart.Axes(xlValue, xlSecondary).MinimumScale = 0
    myChart.Axes(xlValue, xlSecondary).MaximumScale = 1

End Sub
id:ttakao

ありがとうございます。まさに求めていた答えです。

コメントで追加質問するかもしれませんが、よろしくお願いします。

2010/06/18 13:36:09

その他の回答(3件)

id:hanako393 No.1

hanako393回答回数1142ベストアンサー獲得回数872010/06/18 07:04:46

ポイント5pt

http://www.moug.net/tech/exvba/0021.htm

ここを参考にしてください。

グラフをウイザードで作成して、

生成されたVBAのソースをみればわかりますよ。

最初のURLと生成されたVBAソースを照らし合わせて

自分なりに納得するしかないですね。

>オブジェクトモデルを意識した解説

最初のURLで十分オブジェクトモデルを意識してます。

id:ttakao

mougはまっさきに見てるんですが、ちょっとモデルがわからないです。一種の逆引きサンプルみたいなところですからね。コメントに具体的コードを示しました。

2010/06/18 10:00:39
id:koriki-kozou No.2

koriki-kozou回答回数480ベストアンサー獲得回数792010/06/18 00:54:55

ポイント1pt

ExcelVBAでグラフを書ければいいということであれば、マクロ記録したものを使えばVisualBasicEditerのインテリセンスでプロパティなども出てくるし、そんなことを求めているのではないという事だとすると、下記が望みの資料だと思う


プログラミングの概念

http://msdn.microsoft.com/ja-jp/library/cc427436.aspx

オブジェクト (Chで始まるオブジェクトがチャート関連)

http://msdn.microsoft.com/ja-jp/library/cc427458.aspx


インデックスページ

Office Web コンポーネント Visual Basic リファレンス

http://msdn.microsoft.com/ja-jp/library/cc427434.aspx

id:ttakao

チャートの面倒な処理はウィザードを使うより、VBAで書いたほうがラクだという意見もあります。

インテリセンスで出てくるプロパティが全部意味がわかっていれば、こういう質問はしません。

たしかに、おっしゃるような正規のマニュアルをぜーんぶ読んで理解すればいいのでしょう。

それならば、他の方がご紹介くださっているmorgのようなサイトは存在価値がないということなのでしょうか。

ちょっと簡単に知りたいという質問はいけませんかね?

2010/06/18 10:05:49
id:koriki-WeKan No.3

koriki-WeKan回答回数342ベストアンサー獲得回数202010/06/18 12:12:15

ポイント5pt

過去の質問に書いてある。

http://q.hatena.ne.jp/1161656720

id:ttakao

ご指摘ありがとうございます。見ました。

この質問は、ひとつの軸の指定ですよね。

できれば、もうひとつの軸の指定方法を知りたいです。secondary axisとかいうのを指定するようですが、違うかも。。。

2010/06/18 13:34:48
id:SALINGER No.4

SALINGER回答回数3454ベストアンサー獲得回数9692010/06/18 12:12:46ここでベストアンサー

ポイント84pt

VBAのChartに関することは、上手くまとまっているサイトがあまりないですね。

それはExcelのバージョンにより、グラフは機能が追加される部分が多く、

それに合せVBAも追加変更されるので網羅的に解説しているサイトを作りづらいせいだと推測します。

例えば、2007以降のShaps.AddChartが2003で使えなかったり面倒だったりします。


>これがX軸になるのはなぜなのでしょう?

データソースで指定したセル範囲で、左から最右の数値以外のセルまでがX列となり、

それ以外の列がデータ系列となるように自動的処理されるからです。

ここでは日付もシリアル値ではなく数値以外として処理されデータ系列にはなりません。

その為2軸のグラフなどをVBAで作成するときには明示的に軸を指定することになります。


SetSourceDataによるデータ範囲の指定は、上記のような自動的な処理になるので

軸の変更など細かな指定をする場合はNewSeriesでデータ系列を作成して個々に設定することになります。


2軸のグラフを作成するのに参考になるのは、こちら

http://www.k1simplify.com/vba/tipsleaf/graph05.html


各データ系列はSeriesCollectionで指定できますので、

ChartTypeプロパティ グラフの種類

XValuesプロパティ X軸となる範囲。これは一つのデータ系列で指定すればいいです。

Valuesプロパティ データ範囲

AxisGroupプロパティ 第2軸にする場合はxlSecondaryか2を指定。


コメント欄のコードを書き直してみると。

Sub Macro1()
    Dim endRow As Long
    Dim myChart
    Dim Drange As Range
    Dim Trange As Range
    Dim Rrange As Range
    
    'ここではmyChartにChartを指定しています。
    Set myChart = ActiveSheet.ChartObjects.Add(100, 100, 300, 200).Chart
    
    myChart.ChartType = xlLine
    With Worksheets(1)
        endRow = .Cells(Rows.Count, "A").End(xlUp).Row
        Set Drange = Range(.Cells(1, 1), .Cells(endRow, 1))
        Set Trange = Range(.Cells(1, 2), .Cells(endRow, 2))
        Set Rrange = Range(.Cells(1, 3), .Cells(endRow, 3))
    End With
    
    myChart.SeriesCollection.NewSeries
    With myChart.SeriesCollection(1)
        .XValues = Drange
        .Values = Trange
    End With
    
    myChart.SeriesCollection.NewSeries
    With myChart.SeriesCollection(2)
        .Values = Rrange
        .AxisGroup = xlSecondary
    End With
    
    '2軸の最小最大を指定
    myChart.Axes(xlValue, xlSecondary).MinimumScale = 0
    myChart.Axes(xlValue, xlSecondary).MaximumScale = 1

End Sub
id:ttakao

ありがとうございます。まさに求めていた答えです。

コメントで追加質問するかもしれませんが、よろしくお願いします。

2010/06/18 13:36:09
  • id:ttakao
    質問が500文字までなので、コードを掲載できなかったので、少し書きます。
    以下のようなコードでグラフは出ます。
    MyChart.Chart.ChartType = xlLine

    With Worksheets(DataSheet)
    EndRow = .Cells(Rows.Count, "A").End(xlUp).Row
    Set Drange = Range(.Cells(1, 1), .Cells(EndRow, 1))
    Set Trange = Range(.Cells(1, 2), .Cells(EndRow, 2))
    Set Rrange = .....
    End With

    MyChart.Chart.SetSourceData Source:=Union(Drange, Trange)

    しかし、ここでDrangeは日付を含んでいます。これがX軸になるのはなぜなのでしょう?
    Rrangeにグラフのレンジを指定しても、別グラフにはならないです。

    chartオブジェクトのデータソースと軸の関係が、とくにわからないところです。

    よろしくお願いします。
  • id:koriki-kozou
    koriki-kozou 2010/06/18 15:28:46
    >インテリセンスで出てくるプロパティが全部意味がわかっていれば、こういう質問はしません。

    勘違いさせたようだけど、インテリセンスで出てきたプロパティを調べるための一つの道筋を示しただけ
    記録させて作ったものをベースにして、必要な箇所のプロパティについて調べてVBAで量産という流れは実作業でよく使う手
    (オブジェクトモデルを意識した解説という言葉に注目しすぎて、先に行き過ぎたらしい。ごめん)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません