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 ")












ディスカッション
コメント一覧
まだ、コメントがありません