まずは手動でグラフを作成します
データを選択し、挿入のグラフから作成したいグラフを選びます。
X軸,Y軸の設定に問題があれば、適宜修正します。
グラフタイトルは、セルと連動させます。タイトルを選択し、右クリックでテキストの編集を選択後に、上のFx右隣の入力バーに「=」を入力後、セルをクリックします。
これで、X軸データ、Y軸データ、タイトルは、セルの内容と連動して、グラフは変化します。
試しに、どこかのセルの情報を書き換えて、確認してみてください。
仮にデータ数を減らした場合、表示がどう変わるかも確認してみましょう。
この状態でグラフを選択し、右クリック、データの選択を選んでグラフの参照範囲を確認します。
グラフの参照範囲は変わっていないことが確認できます。
そして、グラフの参照範囲に対してデータ量が少なくても、問題なく表示されることが確認できます。注意事項としては、グラフの参照範囲に影響を与える行の挿入や行の削除は行えません。
このシートをテンプレートとして扱い、「シートをコピー」、「シート名の変更」、「グラフが参照しているセルにデータを書き込む」ことで、マクロでグラフを作成することができます。一番データ量が多くなるケースに合わせて、テンプレートのグラフを作成しておきます。
以下は、例になりますが、グラフを含むテンプレートシートを複製し、リネーム後に、CSVファイルを開き、データを取得し、グラフが参照しているセルにデータを書き込み、別ブックへグラフのシートをコピーして保存するマクロになります。
グラフを作成後に、グラフの参照セルの内容を削除した下記のシートをテンプレートとして扱います。
別のシートに、ファイル参照ボタン(下記図では、「CSVファイルの指定」ボタン)とCSVファイルパスを入力するセル(下記図では、セルB4)、フォルダ参照ボタン(下記図では「グラフの出力先」)と出力フォルダパスを入力するセル(下記図では、セルB8)を準備し、ファイル名のセル(下記図では、セルD10)も準備します。
ファイル名のセルD10は、「=YEAR(TODAY())&TEXT(MONTH(TODAY()),"00")&".xlsx"」としています。このファイル名はセルから指定せず、CSVファイル名に「グラフ」の文字列を連結して作成してもいいと思います。
一応解説しておくと、エクセル関数 TODAY()で今日の日付のシリアル値を取得し、YEAR()やMONTH()に使用すると、年や月の数値情報を受け取れます。TEXTは表示形式の設定として、2桁を指定しています。一桁の場合、頭に0がつき、2桁になります。
CSVファイルを選択するファイル参照は、上記の記事「ファイル参照」を確認してください。
出力先フォルダを選択するフォルダ参照は、上記の記事「フォルダ参照」を確認してください。
Sub 開始ボタン_Click()
Dim NewBook As Workbook
Dim NewSheet As Worksheet
Dim filename As String
Dim FileSysObj As New FileSystemObject
'tempシートをコピー
Worksheets("temp").Copy Before:=Worksheets("temp")
Set NewSheet = ActiveSheet
filename = Range("B4").Value
'シート名の設定(CSVファイル名の先頭4文字)
NewSheet.Name = Left(FileSysObj.GetFileName(filename), 4)
'CSVデータの取り込み
Call ReadCSV(NewSheet)
Set NewBook = Workbooks.Add
'セルから保存フォルダとファイル名を取得して連結
NewBook.SaveAs Range("B8").Value & "\" & Range("D10").Value
'シートコピー
Call CopyGraphSheet_BooktoBook(ThisWorkbook, NewSheet.Name, NewBook)
'警告を抑止
Application.DisplayAlerts = False
'シート削除
NewSheet.Delete
'警告を抑止解除
Application.DisplayAlerts = True
'作成したエクセルブックを閉じる
NewBook.Save
NewBook.Close
'メモリ解放
Set NewBook = Nothing
Set NewSheet = Nothing
Set FileSysObj = Nothing
End Sub
テンプレートシート(シート名Temp)をコピーし、CSVファイルのファイル名から文字列を取り出して、コピーしたシート名を変更します。
関数ReadCSVの中で、CSVファイルを開き、データを取り出して、閉じています。
新しくブックを新規作成し、セルから出力先フォルダパスとファイル名を受け取って、一旦保存します。
関数CopyGraphSheet_BooktoBookを呼び出して、作成されたシートをコピーします。
コピー元シートを削除し、新規のブックは保存して閉じます。
Function FcTitleRow() As Long
FcTitleRow = 2
End Function
Function Fc日付列数() As Long
Fc日付列数 = 1
End Function
Function Fc株価列数() As Long
Fc株価列数 = 2
End Function
Sub ReadCSV(Sht As Worksheet)
Dim filename As String
Dim csvBook As Workbook
Dim StockDateRngs As Range
Dim Rng As Range
Dim wtRow As Long
'タイトルの書き出し(銘柄Code シート名)
Sht.Range("B1").Value = "銘柄Code " & Sht.Name
'書き出し位置行数
wtRow = FcTitleRow + 1
If filename <> "Cancel" Then
'ファイルが選択された場合
Set csvBook = Workbooks.Open(Worksheets("ReadCSV").Range("B4").Value)
'CSVファイルファイルの日付列を取得(表題を除いたデータのみ)
With csvBook.Worksheets(1).UsedRange
Set StockDateRngs = csvBook.Worksheets(1).Range(.Item(FcTitleRow, 1), .Item(.Count))
Set StockDateRngs = StockDateRngs.Columns(1)
End With
'CSVファイルの日付列でループ(表題を除いたデータのみ)
For Each Rng In csvBook.Worksheets(1).Range(StockDateRngs.Address)
'日付列数 株価列数
Sht.Cells(wtRow, Fc日付列数).Value = Rng.Value
Sht.Cells(wtRow, Fc株価列数).Value = Rng.Offset(0, 1).Value
wtRow = wtRow + 1
Next
End If
csvBook.Close
Set csvBook = Nothing
Set StockDateRngs = Nothing
Set Rng = Nothing
End Sub
B1セルがグラフタイトルと連動しているため、B1セルにグラフタイトルを書き込みます。
CSVファイルを開き、データを取得しています。CSVファイルの内容は下記のような構成です。
A列とB列のデータだけを写しています。(Rng.Offset(0, 1).Valueの部分がB列のデータです。)
CopySheet_BooktoBook()については、別ページの「別ファイルへシートの複製」を参照してください。