三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Excel VBA 折れ線グラフに直値の系列を追加 .NewSeriesで新系列追加

前回
ken3memo.hatenablog.com
の続きです

今回は、
折れ線グラフに直値の系列を追加
してみました。
ActiveChart.SeriesCollection.NewSeries '.NewSeriesで新系列追加
で、できました。
って、何言ってんだコイツ・・・いきなり、話すすめられても?だよね。

下記、いつもの あのあの迷っているデバッグ・解説動画です。
youtu.be
https://youtu.be/W6N6afHUulY
目次 と ソースコード
00:00 挨拶、やりたいこと
00:59 TEST1 NewSeriesで系列追加
04:00 蛇足 基準の固定線を引きたい時など?
06:55 TEST2 Array で 配列を初期化
11:03 TEST3 知恵袋の質問に答えてみた

知恵袋の質問
detail.chiebukuro.yahoo.co.jp
に、

データベースから取得した
tm, in, out
1, 3, 5
2, 7, 9
3, 5, 6

tm (時間の意) の横軸に対して
in, outの折れ線グラフを書きたい
のですが配列は3列一度に指定できるものなのか?

、ヘッダーは無いほうが良いものなのか? を教えてほしいです。よろしくお願いします。配列はaaaに入れています。



とあったので、直接グラフを書いてみました
(※セルa1:c3など範囲にデータをセットして、
  グラフを書くのが王道ですが、直接書いてみました)

サンプルの説明
TEST1
1.ActiveChart.SeriesCollection.NewSeries
.NewSeriesで新系列追加 できました。
2..Nameで系列名がセットできるみたい
ActiveChart.FullSeriesCollection(1).Name = "7月実績"

TEST2
Array で 配列を初期化して、データをセットしてみました。

TEST3
やっと、知恵袋の質問に答えてみた。

ソースコード

Option Explicit

Sub aaa()

    ActiveChart.SeriesCollection.NewSeries  '.NewSeriesで新系列追加
    
    'FullSeriesCollection(2)と追加されたのは2番目で決め打ちするのも・・まぁいっか
    '.Nameで系列名がセットできるみたい
    ActiveChart.FullSeriesCollection(4).Name = "基準"
    
    '値のセット.Values
    Dim dataVALUE2(0 To 2) As Variant  '配列も2にする、安易だね・・・
    dataVALUE2(0) = 400:    dataVALUE2(1) = 400:    dataVALUE2(2) = 400
    ActiveChart.FullSeriesCollection(4).Values = dataVALUE2


End Sub

Sub TEST()
    
    Sheets.Add 'シート追加、テストで繰り返すと重なるので落ち着くまで
    
    '折れ線グラフ xlLine 追加
    ActiveSheet.Shapes.AddChart2(-1, xlLine, 50, 50).Select
    
    '※ポイント1
    ActiveChart.SeriesCollection.NewSeries  '.NewSeriesで新系列追加
    
    'FullSeriesCollection(1)と追加されたのは1番目で決め打ちするのも・・まぁいっか
    '.Nameで系列名がセットできるみたい
    ActiveChart.FullSeriesCollection(1).Name = "7月実績"
    
    '系列1の横軸セット .XValues
    Dim dataNAME(0 To 2) As Variant
    dataNAME(0) = "東京":   dataNAME(1) = "千葉":   dataNAME(2) = "神奈川"
    ActiveChart.FullSeriesCollection(1).XValues = dataNAME
    
    '値のセット.Values
    Dim dataVALUE(0 To 2) As Variant
    dataVALUE(0) = 200:    dataVALUE(1) = 300:    dataVALUE(2) = 100
    ActiveChart.FullSeriesCollection(1).Values = dataVALUE
    
    'データラベルで値の表示 いろいろあるので調整めんどう
    ActiveChart.FullSeriesCollection(1).Select
    ActiveChart.FullSeriesCollection(1).ApplyDataLabels
    ActiveChart.FullSeriesCollection(1).DataLabels.Select
    Selection.ShowValue = True  'データラベル

'次の折れ線 系列の追加
    '※ポイント1
    ActiveChart.SeriesCollection.NewSeries  '.NewSeriesで新系列追加
    
    'FullSeriesCollection(2)と追加されたのは2番目で決め打ちするのも・・まぁいっか
    '.Nameで系列名がセットできるみたい
    ActiveChart.FullSeriesCollection(2).Name = "8月実績"
    
    '値のセット.Values
    Dim dataVALUE2(0 To 2) As Variant  '配列も2にする、安易だね・・・
    dataVALUE2(0) = 250:    dataVALUE2(1) = 150:    dataVALUE2(2) = 120
    ActiveChart.FullSeriesCollection(2).Values = dataVALUE2
    
    'データラベルで値の表示 いろいろあるので調整めんどう
    ActiveChart.FullSeriesCollection(2).Select
    ActiveChart.FullSeriesCollection(2).ApplyDataLabels
    ActiveChart.FullSeriesCollection(2).DataLabels.Select
    Selection.ShowValue = True  'データラベル

    'せっかく.Nameで系列名セットしたので、凡例を表示
    'msoElementLegendRight   101 凡例を右に表示します。
    ActiveChart.SetElement (msoElementLegendRight)

    Range("A1").Select
    MsgBox "処理終了"


End Sub

'↑事務処理能力が低いおっさん、テストプログラム作成後に
'こんな折れ線グラフは無いことに気が付く・・・
'普通は、折れ線 Yが東京・千葉・神奈川で、
'横軸 Xが 7月,8月,9月・・かな
Sub TEST2()
    
    Sheets.Add 'シート追加、テストで繰り返すと重なるので落ち着くまで
    
    Dim data系列名 As Variant  '配列が0からなので注意
    data系列名 = Array("東京", "名古屋", "大阪")
    
    Dim data実績 As Variant '"東京", "名古屋", "大阪"の実績
    data実績 = Array(Array(100, 200, 300), _
                        Array(400, 500, 0), _
                        Array(50, 700, 250))

    Dim dataX軸名 As Variant  '
    dataX軸名 = Array("7月実績", "8月実績", "9月予定")

    '折れ線グラフ xlLine 追加
    ActiveSheet.Shapes.AddChart2(-1, xlLine, 50, 50).Select
    
    '3つ折れ線グラフを追加
    Dim n As Integer
    
    For n = 1 To 3  'n=1からなので、配列0から注意・・・
        ActiveChart.SeriesCollection.NewSeries  '.NewSeriesで新系列追加
        'FullSeriesCollection(n)と追加されたのはn番目で決め打ち
        '.Nameで系列名がセットできるみたい
        ActiveChart.FullSeriesCollection(n).Name = data系列名(n - 1)
        
        '値のセット.Values
        ActiveChart.FullSeriesCollection(n).Values = data実績(n - 1)
    
        '横軸 名前セット .XValues
        ActiveChart.FullSeriesCollection(n).XValues = dataX軸名
    
        'データラベルで値の表示 いろいろあるので調整めんどう
        'ActiveChart.FullSeriesCollection(1).Select  '.Selectいらないよね。ぉぃぉぃ
        ActiveChart.FullSeriesCollection(n).ApplyDataLabels
        ActiveChart.FullSeriesCollection(n).DataLabels.Select
        Selection.ShowValue = True  'データラベル
    Next

    '凡例を表示
    'msoElementLegendRight   101 凡例を右に表示します。
    ActiveChart.SetElement (msoElementLegendRight)

    Range("A1").Select
    MsgBox "処理終了"

End Sub


'遊んでないで、知恵袋の質問に答えないと・・・
Sub TEST3()

    Sheets.Add 'シート追加、テストで繰り返すと重なるので落ち着くまで
    
    'データベースから取得した
    'tm, in, out
    '1, 3, 5
    '2, 7, 9
    '3, 5, 6
    
    Dim DATAtm As Variant  '変数名頭にD付けました
    Dim DATAin As Variant  '※変数名inだと予約語でエラーだったので
    Dim DATAout As Variant 'Dに特に意味は無い
    
    DATAtm = Array(1, 2, 3)
    DATAin = Array(3, 7, 5)
    DATAout = Array(5, 9, 6)

    'tm (時間の意) の横軸に対して
    'in, outの折れ線グラフを書きたい
    'のですが配列は3列一度に指定できるものなのか?
    '配列はaaaに入れています。
    '↑あっ、勝手にDATAtmとか、分割しちゃった・・・
    
    'まず、折れ線グラフ xlLine 追加
    ActiveSheet.Shapes.AddChart2(-1, xlLine, 50, 50).Select
    
    '系列inの処理
    ActiveChart.SeriesCollection.NewSeries  '.NewSeriesで新系列追加
    
    'FullSeriesCollection(1)と追加されたのは1番目で決め打ちするのも・・まぁいっか
    '.Nameで系列名がセットできるみたい
    ActiveChart.FullSeriesCollection(1).Name = "in"
    
    '系列1の横軸セット .XValues
    ActiveChart.FullSeriesCollection(1).XValues = DATAtm '横軸はtm単位
    
    'in値のセット.Values
    ActiveChart.FullSeriesCollection(1).Values = DATAin
    
    'データラベルで値の表示 いろいろあるので調整めんどう
    ActiveChart.FullSeriesCollection(1).ApplyDataLabels
    ActiveChart.FullSeriesCollection(1).DataLabels.Select
    Selection.ShowValue = True  'データラベル

'次の折れ線 out系列の追加
    ActiveChart.SeriesCollection.NewSeries  '.NewSeriesで新系列追加
    
    'FullSeriesCollection(2)と追加されたのは2番目で決め打ちするのも・・まぁいっか
    '.Nameで系列名がセットできるみたい
    ActiveChart.FullSeriesCollection(2).Name = "out"
    
    '値のセット.Values
    ActiveChart.FullSeriesCollection(2).Values = DATAout  'outの値
    
    'データラベルで値の表示 いろいろあるので調整めんどう
    ActiveChart.FullSeriesCollection(2).ApplyDataLabels
    ActiveChart.FullSeriesCollection(2).DataLabels.Select
    Selection.ShowValue = True  'データラベル

    'せっかく.Nameで系列名セットしたので、凡例を表示
    'msoElementLegendRight   101 凡例を右に表示します。
    ActiveChart.SetElement (msoElementLegendRight)

    Range("A1").Select
    MsgBox "処理終了"

End Sub

サンプルソースをアレンジして、
折れ線グラフを作ってみてください。

処理のヒントとなれば幸いです。



ActiveChart.SeriesCollection.Count で グラフ系列の数
ActiveChart.SeriesCollection.Count
よく見かける
.Count
でChartのSeries数がわかりそうです

Option Explicit

Sub bbb()

    Dim n As Integer
    
    Debug.Print "コレクションの数:" & ActiveChart.SeriesCollection.Count
    
    For n = 1 To ActiveChart.SeriesCollection.Count
        Debug.Print ".Name=" & ActiveChart.SeriesCollection(n).Name
    Next

End Sub

解決のヒントとなれば幸いです。


前回の動画:
www.youtube.com
Excel VBA グラフの範囲 値を直値にする セルの範囲を使わないで強引にマクロでセット
https://www.youtube.com/watch?v=UTLJ59dz4IQ
↑この動画の元です。時間のある時にこちらも見てください。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)