EXCEL超初心者マクロ(12)
マクロでグラフを作成。

グラフをマクロで作成する依頼があり、備忘録も兼ねてUPします。
実は、マクロでグラフを作ったことが無く、ほぼ1から調べて作成したのでおかしな部分もあるかもしれないので、ご勘弁を。

結構手こずりました。

マクロの記録をベースにして、賢人たちのサイトをググりながら作成したのですが、なかなか思いどうりにならない。
最終的には、できたのだが、いくつか疑問が残ったままの着地で、むずかゆい感じがします。

実は、うまくマクロが動いても、繰り返すと出来上がりが変わったり、元データーの内容でも影響があった。

想像だが、グラフを作成するとき、EXCEL側で忖度をしているようで、過去の操作、データーの内容でグラフを調整しているように思います。

取り急ぎ、サンプルのように項目を指定しながらやってみた結果です。

1シートに2個のデーターがあり、別のシートにグラフを作成。

データの軸を指定してます。

SAMPLE14.zip

'### 自分の場合、よく使う変数は、Option Explicit(Module1)に書いてます。
'### 説明しやすいように、ここにも書いてます。
 
 Dim WK_START01
 Dim WK_START01A
 Dim WK_START01B
 Dim WK_START02
 Dim WK_START02A
 Dim WK_START02B

 Dim set_data01 As Object
 Dim mySheetName001 As Variant
 Dim mySheetName002 As Variant
 Dim CNT01
 
 MSG_FLG = MsgBox(" ◆ グラフ作成 ◆", vbYesNo)
 If MSG_FLG = vbNo Then
    Exit Sub
 End If
 mySheetName001 = "DATA"
 mySheetName002 = "GRAPH"

***クリア処理***
 '### シートフィルタ解除サブプロシジー ###
 sheet_clear
 
 '### 存在しているグラフを消します ###
 Sheets(mySheetName002).Select
 With ActiveSheet
     For CNT11 = .ChartObjects.Count To 1 Step -1
         .ChartObjects(CNT11).Delete
     Next CNT11
 End With
 
 Sheets(mySheetName001).Select
 With ActiveSheet
     For CNT11 = .ChartObjects.Count To 1 Step -1
         .ChartObjects(CNT11).Delete
     Next CNT11
 End With
     
'### 最終行 抽出
 '### 軸の最終行を抽出して、データ部の最終行を右にシフトして抽出
 '### ※1軸ずつ作っているのは、同じシーに複数ある時や、離れている時を想定

 MAXLOW1 = Cells(Rows.Count, 1).End(xlUp).Row
 Set set_data01 = Worksheets(mySheetName001).Range("A2")
 Set set_data01 = set_data01.Offset(MAXLOW1 - 1, 0)
 WK_START01 = set_data01.Address(RowAbsolute:=False, ColumnAbsolute:=False)
 Set set_data01 = set_data01.Offset(0, 1)
 WK_START01A = set_data01.Address(RowAbsolute:=False, ColumnAbsolute:=False)
 Set set_data01 = set_data01.Offset(0, 1)
 WK_START01B = set_data01.Address(RowAbsolute:=False, ColumnAbsolute:=False)
    
 MAXLOW1 = Cells(Rows.Count, 5).End(xlUp).Row
 Set set_data01 = Worksheets(mySheetName001).Range("E1")
 Set set_data01 = set_data01.Offset(MAXLOW1 - 1, 0)
 WK_START02 = set_data01.Address(RowAbsolute:=False, ColumnAbsolute:=False)
 Set set_data01 = set_data01.Offset(0, 1)
 WK_START02A = set_data01.Address(RowAbsolute:=False, ColumnAbsolute:=False)
 Set set_data01 = set_data01.Offset(0, 1)
 WK_START02B = set_data01.Address(RowAbsolute:=False, ColumnAbsolute:=False)
 
 MsgBox (WK_START01 & " / " & WK_START01A & " / " & WK_START01B)
 MsgBox (WK_START02 & " / " & WK_START02A & " / " & WK_START02B)


'### グラフ作成A 235,xlLineMarkers、→折れ線の一つ
'### グラフ作成A 10,300,500,300→開始位置、大きさ
  
 ActiveSheet.Shapes.AddChart2(235, xlLineMarkers, 10, 300, 500, 300).Select
 With ActiveChart
     .SetSourceData Source:=Range(mySheetName001 & "!B1:" & WK_START01A & ",C1:" & WK_START01B)
     .ChartTitle.Text = "経過軸のグラフ"
     .Parent.Name = "【日別】経過軸のグラフ"
     .SeriesCollection(1).XValues = Worksheets(mySheetName001).Range("A1:" & WK_START01)
     
     .FullSeriesCollection(2).Select
      With Selection.Format.Line
          .Visible = msoTrue
          .ForeColor.RGB = RGB(255, 0, 0)
          .Transparency = 0
      End With
     
     ' グラフのX軸(横軸)のタイトルを設定
     .Axes(xlCategory).HasTitle = True
     .Axes(xlCategory).AxisTitle.Characters.Text = "経過日数" '### タイトル
     .Axes(xlCategory).TickLabels.Orientation = 45 '### 文字角度

     ' グラフのY軸(縦軸)のタイトルを設定
     .Axes(xlValue).HasTitle = True
     .Axes(xlValue).AxisTitle.Characters.Text = "個数"
     .ChartType = xlLine
     
     ' グラフの作成先。
     .Location Where:=xlLocationAsObject, Name:=mySheetName002
 
 End With
 
'### グラフ作成B
 
 Sheets(mySheetName001).Select  '### 元のシートを選択 ←
 
 ActiveSheet.Shapes.AddChart2(235, xlLineMarkers, 550, 300, 500, 300).Select
 With ActiveChart
     .SetSourceData Source:=Range(mySheetName001 & "!F1:" & WK_START02A & ",G1:" & WK_START02B)
     .ChartTitle.Text = "日付のグラフ"
     .Parent.Name = "【日別】日付軸のグラフ"
     .SeriesCollection(1).XValues = Worksheets(mySheetName001).Range("E1:" & WK_START02)
     
      .FullSeriesCollection(2).Select
      With Selection.Format.Line
          .Visible = msoTrue
          .ForeColor.RGB = RGB(255, 0, 0)
          .Transparency = 0
      End With
     
     ' グラフのX軸(横軸)のタイトルを設定
     .Axes(xlCategory).HasTitle = True
     .Axes(xlCategory).AxisTitle.Characters.Text = "発送日"
     .Axes(xlCategory).TickLabels.Orientation = 45

     ' グラフのY軸(縦軸)のタイトルを設定
     .Axes(xlValue).HasTitle = True
     .Axes(xlValue).AxisTitle.Characters.Text = "個数"
     .ChartType = xlLine
     
     ' グラフの作成先。
     .Location Where:=xlLocationAsObject, Name:=mySheetName002
 End With
 
 Range("A1").Select
 
 MsgBox (" 作成END ")