EXCEL超初心者マクロ(12)
マクロでグラフを作成。
グラフをマクロで作成する依頼があり、備忘録も兼ねてUPします。
実は、マクロでグラフを作ったことが無く、ほぼ1から調べて作成したのでおかしな部分もあるかもしれないので、ご勘弁を。
結構手こずりました。
マクロの記録をベースにして、賢人たちのサイトをググりながら作成したのですが、なかなか思いどうりにならない。
最終的には、できたのだが、いくつか疑問が残ったままの着地で、むずかゆい感じがします。
実は、うまくマクロが動いても、繰り返すと出来上がりが変わったり、元データーの内容でも影響があった。
想像だが、グラフを作成するとき、EXCEL側で忖度をしているようで、過去の操作、データーの内容でグラフを調整しているように思います。
取り急ぎ、サンプルのように項目を指定しながらやってみた結果です。
1シートに2個のデーターがあり、別のシートにグラフを作成。
データの軸を指定してます。
'### 自分の場合、よく使う変数は、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 ")
Discussion
New Comments
No comments yet. Be the first one!