【初心者向け】コード別の日別集計と折線グラフ自動マクロの作り方

 

「毎日の集計作業、もっとラクにできないかな…」

そんなお悩み、Excelマクロで一発解決できます!

本記事では、コードごと(担当者、得意先、商品など)ごとに日別集計を行い、さらに自動で折れ線グラフも作成してくれるExcel VBAマクロをご紹介します。

初心者でも安心して使える「フォーム付き」の設計で、集計・グラフ作成・保存まで全自動。

「Excelマクロって難しそう」と感じていたあなたにこそ、試してほしい内容です!

ぜひご自身の作業に合わせて使ってみてください。

 

 

目次

初心者向けマクロの作り方|コード別の日別集計と折線グラフ作成はどんなときに便利?

Excelシートに同じ表形式のデータが大量にあるとき、「コードごとに別のシートに分けて、集計表とグラフを作成して保存したい…」ということはありませんか?

 

たとえば

・毎日の売上や作業データを「コードごと(担当者、得意先、商品など)」に「日別で」集計したい

・見やすい「折れ線グラフ」も自動で作って、上司にすぐ報告したい

・手作業での集計やグラフ作成に時間を取られたくない!

そんなあなたにピッタリなのが、この「コードごとに自動でシートを分けて集計とグラフを自動作成するマクロ」です。

ファイルを選んで集計ボタンを押すだけで、自動で集計+折れ線グラフも作成。

Excel初心者の方でも安心して使えます。

 

初心者向けマクロの作り方|コード別の日別集計と折線グラフ作成できること

1枚のシートにまとめられたデータから、指定したコード列、日付列、金額列をもとに、コードごと日付、金額で集計し、コードごとにシートを分けて転記。そして、転記した内容をもとに折れ線グラフを作成

 

手作業不要!「マクロ実行」だけですぐに完成します。

 

初心者向けマクロの作り方|コード別の日別集計と折線グラフ作成の使い方はたったの3ステップ

 

1. 元データをExcelに準備する。

2. マクロを起動(フォームから対象のExcelとコード列を指定)

3. 各コードごとのシートが自動で作成されます。

 

もう、手作業でフィルタしてコピー&ペーストした後、集計する必要はありません。

 

初心者向けマクロの作り方|コード別の日別集計と折線グラフ作成|押さえるべき3つのポイント

 

①モジュール構成を覚えよう

「ThisWorkbook」→ 起動時にフォーム表示

「UserForm」→ フォームの見た目と操作

「標準モジュール」→ 実際の分割処理

 

②対象Excelフォーマット

コード列を統一しておく(たとえば、担当者コードはA列に統一する、日付列はB列、金額列はC列など)

 

③トラブル対策

マクロを実行する前に、対象のExcelファイルをバックアップする(別フォルダにコピーをとる)

 

初心者向けマクロの作り方|コード別の日別集計と折線グラフ作成|よく変更が行われる箇所

変更箇所(追加) 内容 たとえば、このように変更
グラフの種類を変更したい 標準モジュール(Module1) .ChartType = xlLine を別の種類に変更(例:xlColumnで棒グラフ)
グラフの位置を変えたい Set chartObj = ws.ChartObjects.Add(Left:=300, Top:=10, Width:=500, Height:=300) .Left や .Top の数値を調整
グラフにタイトルをつけたい .HasTitle = Trueのあとに  .ChartTitle.Text = "タイトル名"

 

初心者向けマクロの作り方|コード別の日別集計と折線グラフ作成【検証済】コード

シートごとにコード別日別集計&折線グラフを作成する【検証済】マクロコード一式(フォーム+標準モジュール+ThisWorkbook)を紹介します。

 

ThisWorkbook モジュール

xlsmファイルを開いたときに自動でフォームを表示するコードです。

 

  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.      UserForm1.Show vbModeless
  4. End Sub
  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.      UserForm1.Show vbModeless
  4. End Sub

 

 

フォーム

フォームのデザイン

オブジェクト名 種類 キャプション
変更しない Label 対象Excelファイル
txtFile TextBox 空白
btnBrowse CommandButton ファイル選択
変更しない Label コード列(例:A)
txtCodeCol TextBox 空白
変更しない Label 日付列(例:A)
txtDateCol TextBox 空白
変更しない Label 金額列(例:A)
txtAmountCol TextBox 空白
btnAggregate CommandButton 集計&グラフ
btnClose CommandButton 終了

 

フォームのコード(UserForm1)

 

  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     ' Excelウィンドウを最小化し、フォームを前面に出す
  4.     Application.WindowState = xlMinimized
  5.     Me.StartUpPosition = 1 ' 画面中央
  6.     Me.Show vbModeless
  7. End Sub
  8. Private Sub btnBrowse_Click()
  9.     Dim fd As FileDialog
  10.     Set fd = Application.FileDialog(msoFileDialogFilePicker)
  11.     With fd
  12.         .Title = "Excelファイルを選択してください"
  13.         .Filters.Clear
  14.         .Filters.Add "Excelファイル", "*.xlsx; *.xlsm; *.xls"
  15.         If .Show = -1 Then
  16.             txtFile.Text = .SelectedItems(1)
  17.         End If
  18.     End With
  19. End Sub
  20. Private Sub btnAggregate_Click()
  21.     If txtFile.Text = "" Or txtCodeCol.Text = "" Or txtDateCol.Text = "" Or txtAmountCol.Text = "" Then
  22.         MsgBox "ファイルと各列をすべて指定してください", vbExclamation
  23.         Exit Sub
  24.     End If
  25.     If txtCodeCol.Text = txtDateCol.Text Then
  26.         MsgBox "コード列と日付列に同じ値は指定できません", vbExclamation
  27.         Exit Sub
  28.     End If
  29.     If txtCodeCol.Text = txtAmountCol.Text Then
  30.         MsgBox "コード列と金額列に同じ値は指定できません", vbExclamation
  31.         Exit Sub
  32.     End If
  33.     If txtDateCol.Text = txtAmountCol.Text Then
  34.         MsgBox "日付列と金額列に同じ値は指定できません", vbExclamation
  35.         Exit Sub
  36.     End If
  37.     Application.ScreenUpdating = False
  38.     
  39.     Dim colLetter As String
  40.     colLetter = UCase(txtCodeCol.Text) ' 大文字に統一
  41.     ' 列記号が正しいかと、2行目のセルに値があるか確認
  42.     Dim wb As Workbook
  43.     Set wb = Workbooks.Open(txtFile.Text)
  44.     Dim srcWs As Worksheet
  45.     Set srcWs = wb.Sheets(1) ' 最初のシートを対象に
  46.     Dim checkValue As Variant
  47.     On Error Resume Next
  48.     checkValue = srcWs.Range(colLetter & "2").Value
  49.     On Error GoTo 0
  50.     ' コード列記号の妥当性チェック
  51.     If Not IsValidColumnLetter(colLetter) Then
  52.         MsgBox "コード列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  53.         Application.ScreenUpdating = True ' MsgBox後に復元
  54.         wb.Close SaveChanges:=False
  55.         Exit Sub
  56.     End If
  57.     If IsEmpty(checkValue) Or checkValue = "" Then
  58.         MsgBox "範囲外のコード列指定になっています。" & vbCrLf & _
  59.                "指定したコード列の2行目に値がありません。", vbExclamation
  60.         Application.ScreenUpdating = True ' MsgBox後に復元
  61.         wb.Close SaveChanges:=False
  62.         Exit Sub
  63.     End If
  64.     colLetter = UCase(txtDateCol.Text) ' 大文字に統一
  65.     ' 日付列記号の妥当性チェック
  66.     If Not IsValidColumnLetter(colLetter) Then
  67.         MsgBox "日付列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  68.         Application.ScreenUpdating = True ' MsgBox後に復元
  69.         wb.Close SaveChanges:=False
  70.         Exit Sub
  71.     End If
  72.     colLetter = UCase(txtAmountCol.Text) ' 大文字に統一
  73.     ' 金額列記号の妥当性チェック
  74.     If Not IsValidColumnLetter(colLetter) Then
  75.         MsgBox "金額列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  76.         Application.ScreenUpdating = True ' MsgBox後に復元
  77.         wb.Close SaveChanges:=False
  78.         Exit Sub
  79.     End If
  80.     Application.ScreenUpdating = True
  81.     ' 実行
  82.     Call 集計処理(txtFile.Text, UCase(txtCodeCol.Text), UCase(txtDateCol.Text), UCase(txtAmountCol.Text))
  83. End Sub
  84. Private Sub btnClose_Click()
  85.     Application.WindowState = xlNormal
  86.     ThisWorkbook.Save
  87.     Application.Quit
  88. End Sub
  89. Function IsValidColumnLetter(colLetter As String) As Boolean
  90.     On Error GoTo ErrHandler
  91.     Dim rng As Range
  92.     Set rng = Worksheets(1).Range(colLetter & "1")
  93.     IsValidColumnLetter = True
  94.     Exit Function
  95. ErrHandler:
  96.     IsValidColumnLetter = False
  97. End Function

 

標準モジュール(Module1)

 

  1. Option Explicit
  2. Public Sub 集計処理(filePath As String, codeCol As String, dateCol As String, amountCol As String)
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     
  6.     Dim wb As Workbook
  7.     Dim ws As Worksheet
  8.     Dim lastRow As Long
  9.     Dim codeDict As Object: Set codeDict = CreateObject("Scripting.Dictionary")
  10.     Dim codeColNum As Long
  11.     Dim dateColNum As Long
  12.     Dim amountColNum As Long
  13.     
  14.     Set wb = Workbooks.Open(filePath)
  15.     Set ws = wb.Sheets(1)
  16.     ' 列番号取得
  17.     codeColNum = Range(codeCol & "1").Column
  18.     dateColNum = Range(dateCol & "1").Column
  19.     amountColNum = Range(amountCol & "1").Column
  20.     lastRow = ws.Cells(ws.Rows.Count, codeColNum).End(xlUp).row
  21.     ' ソート
  22.     ws.Sort.SortFields.Clear
  23.     ws.Sort.SortFields.Add Key:=ws.Cells(2, codeColNum), Order:=xlAscending
  24.     ws.Sort.SortFields.Add Key:=ws.Cells(2, dateColNum), Order:=xlAscending
  25.     With ws.Sort
  26.         .SetRange ws.Range("A1", ws.Cells(lastRow, ws.Cells(1, Columns.Count).End(xlToLeft).Column))
  27.         .header = xlYes
  28.         .Apply
  29.     End With
  30.     ' コードごとにデータ格納
  31.     Dim i As Long
  32.     For i = 2 To lastRow
  33.         Dim code As String, dt As String, amt As Double
  34.         code = Trim(ws.Cells(i, codeColNum).Value)
  35.         dt = Format(ws.Cells(i, dateColNum).Value, "yyyy/mm/dd")
  36.         amt = ws.Cells(i, amountColNum).Value
  37.         
  38.         If code <> "" And dt <> "" And IsNumeric(amt) Then
  39.             If Not codeDict.exists(code) Then
  40.                 codeDict.Add code, CreateObject("Scripting.Dictionary")
  41.             End If
  42.             
  43.             With codeDict(code)
  44.                 If .exists(dt) Then
  45.                     .Item(dt) = .Item(dt) + amt
  46.                 Else
  47.                     .Add dt, amt
  48.                 End If
  49.             End With
  50.         End If
  51.     Next i
  52.     ' シート作成
  53.     Dim codeKey As Variant
  54.     For Each codeKey In codeDict.Keys
  55.         If シート存在チェック(wb, codeKey) Then
  56.             MsgBox "コード [" & codeKey & "] のシートはすでに存在します。処理を中止します。", vbInformation
  57.             wb.Close SaveChanges:=False
  58.             GoTo EndProc
  59.         End If
  60.         
  61.         Dim newWS As Worksheet
  62.         Set newWS = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count))
  63.         newWS.Name = codeKey
  64.         
  65.         ' ヘッダー
  66.         newWS.Range("A1") = "日付"
  67.         newWS.Range("B1") = "合計金額"
  68.         
  69.         ' データ出力
  70.         Dim row As Long: row = 2
  71.         Dim dtKey As Variant
  72.         For Each dtKey In codeDict(codeKey).Keys
  73.             newWS.Cells(row, 1).Value = dtKey
  74.             newWS.Cells(row, 2).Value = codeDict(codeKey)(dtKey)
  75.             row = row + 1
  76.         Next dtKey
  77.         
  78.         newWS.Cells.EntireColumn.AutoFit
  79.     Next codeKey
  80.     wb.Save
  81.     wb.Close SaveChanges:=True
  82.     
  83.     Call 折れ線グラフを作成する(filePath)
  84.     
  85.     MsgBox "集計&折れ線グラフ作成が完了しました", vbInformation
  86. EndProc:
  87.     Application.ScreenUpdating = True
  88.     Application.DisplayAlerts = True
  89. End Sub
  90. Private Function シート存在チェック(wb As Workbook, codeKey As Variant) As Boolean
  91.     Dim ws As Worksheet
  92.     For Each ws In wb.Sheets
  93.         If ws.Name = codeKey Then
  94.             シート存在チェック = True
  95.             Exit Function
  96.         End If
  97.     Next
  98.     シート存在チェック = False
  99. End Function
  100. Public Sub 折れ線グラフを作成する(filePath As String)
  101.     Dim wb As Workbook
  102.     Dim ws As Worksheet
  103.     Dim lastRow As Long
  104.     Dim chartObj As ChartObject
  105.     Dim chartRange As Range
  106.     Set wb = Workbooks.Open(filePath)
  107.     Application.ScreenUpdating = False
  108.     Application.DisplayAlerts = False
  109.     For Each ws In wb.Worksheets
  110.         ' 「集計元」シート(最初のシート)はスキップする(必要に応じて変更可能)
  111.         If ws.Index = 1 Then GoTo NextSheet
  112.         ' 最終行の取得(A列を基準)
  113.         lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
  114.         ' データが2行以上あるか確認
  115.         If lastRow < 2 Then GoTo NextSheet
  116.         ' グラフ範囲の指定(A列:日付、B列:合計金額)
  117.         Set chartRange = ws.Range("A1:B" & lastRow)
  118.         ' グラフ作成
  119.         Set chartObj = ws.ChartObjects.Add(Left:=300, Top:=10, Width:=500, Height:=300)
  120.         With chartObj.Chart
  121.             .ChartType = xlLine
  122.             .SetSourceData Source:=chartRange
  123.             .HasTitle = True
  124.             .ChartTitle.Text = "日別売上推移"
  125.             .Axes(xlCategory).HasTitle = True
  126.             .Axes(xlCategory).AxisTitle.Text = "日付"
  127.             .Axes(xlValue).HasTitle = True
  128.             .Axes(xlValue).AxisTitle.Text = "合計金額"
  129.             .SeriesCollection(1).ApplyDataLabels
  130.         End With
  131. NextSheet:
  132.     Next ws
  133.     wb.Save
  134.     wb.Close SaveChanges:=True
  135.     Application.ScreenUpdating = True
  136.     Application.DisplayAlerts = True
  137. End Sub

 

初心者向けマクロの作り方|コードごとの自動集計シート作成【検証済】コードの使い方

以下手順で、シートごとにコード別日別集計&折線グラフ作成するマクロは完成します。

フォームはコードがないので、ご自身で作成することになりますが、その他のコードは、【検証済】コードをコピペすればマクロができます。※フォーム作成方法も、下記で詳しく説明しますので、ご安心ください。

 

Excel起動からユーザーフォーム作成の操作

新規 空白のブックをクリックします

 

ALT+F11で、下記開発画面になります。

 

ユーザーフォームのデザイン画面になります。

 

ツールボックスでユーザーフォームを作成します。

 

下記は、ツールボックスをドラッグで移動してサイズを変更した画面

 

下記は、ツールボックスをドラッグで移動してサイズを変更した画面

 

ツールボックスのコントロールがたくさんありますが、今回使うのは、下記の3種類(ラベル、テキストボックス、コマンドボタン)です。

 

ユーザーフォームを作成:ラベルを作る(表題)①

対象Excelファイル

ユーザーフォームを作成:ラベルを作る(表題)②

 

ユーザーフォーム作成:テキストボックスを作る(画面がら文字入力する場所)

ファイル選択

ユーザーフォーム作成:ボタンを作る(何かの動作をさせる際のボタン)①

 

ユーザーフォーム作成:ボタンを作る(何かの動作をさせる際のボタン)②

コード列(例:A)から終了まで

ユーザーフォーム作成

 

ユーザーフォーム作成でよくある操作
初心者が、やばい!間違えた。どうしようとやめちゃう操作

 

こうなったら、

 

もう一度、UserForm1画面を表示する前に・・・

 

ユーザーフォームのデザイン画面にするには、プロジェクトエクスプローラーに表示されているUserForm1をダブルクリックします。

 

Cのプロパティウィンドウのオブジェクト名を変更

txtFile

テキストボックスの名称(オブジェクト)を変更

btnBrowse

コマンドボタンの名称(オブジェクト)を変更

txtCodeCol

テキストボックスの名称(オブジェクト)を変更

txtDateCol

テキストボックスの名称(オブジェクト)を変更

txtAmountCol

テキストボックスの名称(オブジェクト)を変更

btnAggregate

コマンドボタンの名称(オブジェクト)を変更

btnClose

コマンドボタンの名称(オブジェクト)を変更

 

 

【検証済】コードをコピペ

ここから、【検証済】コードをコピペしていきます

 

【検証済】コードをコピペ:Thisworkbok①

下記、ThisWorkbookモジュールをコピーします

  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.      UserForm1.Show vbModeless
  4. End Sub

【検証済】コードをコピペ:Thisworkbok②

 

【検証済】コードをコピペ:UserForm1①

【検証済】コードをコピペ:UserForm1②

下記、フォームのコードをコピーします

 

  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     ' Excelウィンドウを最小化し、フォームを前面に出す
  4.     Application.WindowState = xlMinimized
  5.     Me.StartUpPosition = 1 ' 画面中央
  6.     Me.Show vbModeless
  7. End Sub
  8. Private Sub btnBrowse_Click()
  9.     Dim fd As FileDialog
  10.     Set fd = Application.FileDialog(msoFileDialogFilePicker)
  11.     With fd
  12.         .Title = "Excelファイルを選択してください"
  13.         .Filters.Clear
  14.         .Filters.Add "Excelファイル", "*.xlsx; *.xlsm; *.xls"
  15.         If .Show = -1 Then
  16.             txtFile.Text = .SelectedItems(1)
  17.         End If
  18.     End With
  19. End Sub
  20. Private Sub btnAggregate_Click()
  21.     If txtFile.Text = "" Or txtCodeCol.Text = "" Or txtDateCol.Text = "" Or txtAmountCol.Text = "" Then
  22.         MsgBox "ファイルと各列をすべて指定してください", vbExclamation
  23.         Exit Sub
  24.     End If
  25.     If txtCodeCol.Text = txtDateCol.Text Then
  26.         MsgBox "コード列と日付列に同じ値は指定できません", vbExclamation
  27.         Exit Sub
  28.     End If
  29.     If txtCodeCol.Text = txtAmountCol.Text Then
  30.         MsgBox "コード列と金額列に同じ値は指定できません", vbExclamation
  31.         Exit Sub
  32.     End If
  33.     If txtDateCol.Text = txtAmountCol.Text Then
  34.         MsgBox "日付列と金額列に同じ値は指定できません", vbExclamation
  35.         Exit Sub
  36.     End If
  37.     Application.ScreenUpdating = False
  38.     
  39.     Dim colLetter As String
  40.     colLetter = UCase(txtCodeCol.Text) ' 大文字に統一
  41.     ' 列記号が正しいかと、2行目のセルに値があるか確認
  42.     Dim wb As Workbook
  43.     Set wb = Workbooks.Open(txtFile.Text)
  44.     Dim srcWs As Worksheet
  45.     Set srcWs = wb.Sheets(1) ' 最初のシートを対象に
  46.     Dim checkValue As Variant
  47.     On Error Resume Next
  48.     checkValue = srcWs.Range(colLetter & "2").Value
  49.     On Error GoTo 0
  50.     ' コード列記号の妥当性チェック
  51.     If Not IsValidColumnLetter(colLetter) Then
  52.         MsgBox "コード列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  53.         Application.ScreenUpdating = True ' MsgBox後に復元
  54.         wb.Close SaveChanges:=False
  55.         Exit Sub
  56.     End If
  57.     If IsEmpty(checkValue) Or checkValue = "" Then
  58.         MsgBox "範囲外のコード列指定になっています。" & vbCrLf & _
  59.                "指定したコード列の2行目に値がありません。", vbExclamation
  60.         Application.ScreenUpdating = True ' MsgBox後に復元
  61.         wb.Close SaveChanges:=False
  62.         Exit Sub
  63.     End If
  64.     colLetter = UCase(txtDateCol.Text) ' 大文字に統一
  65.     ' 日付列記号の妥当性チェック
  66.     If Not IsValidColumnLetter(colLetter) Then
  67.         MsgBox "日付列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  68.         Application.ScreenUpdating = True ' MsgBox後に復元
  69.         wb.Close SaveChanges:=False
  70.         Exit Sub
  71.     End If
  72.     colLetter = UCase(txtAmountCol.Text) ' 大文字に統一
  73.     ' 金額列記号の妥当性チェック
  74.     If Not IsValidColumnLetter(colLetter) Then
  75.         MsgBox "金額列記号が無効です。" & vbCrLf & "A ? XFD の範囲で入力してください。", vbExclamation
  76.         Application.ScreenUpdating = True ' MsgBox後に復元
  77.         wb.Close SaveChanges:=False
  78.         Exit Sub
  79.     End If
  80.     Application.ScreenUpdating = True
  81.     ' 実行
  82.     Call 集計処理(txtFile.Text, UCase(txtCodeCol.Text), UCase(txtDateCol.Text), UCase(txtAmountCol.Text))
  83. End Sub
  84. Private Sub btnClose_Click()
  85.     Application.WindowState = xlNormal
  86.     ThisWorkbook.Save
  87.     Application.Quit
  88. End Sub
  89. Function IsValidColumnLetter(colLetter As String) As Boolean
  90.     On Error GoTo ErrHandler
  91.     Dim rng As Range
  92.     Set rng = Worksheets(1).Range(colLetter & "1")
  93.     IsValidColumnLetter = True
  94.     Exit Function
  95. ErrHandler:
  96.     IsValidColumnLetter = False
  97. End Function

【検証済】コードをコピペ:標準モジュール(Module1)

 

下記、標準モジュールをコピーします

  1. Option Explicit
  2. Public Sub 集計処理(filePath As String, codeCol As String, dateCol As String, amountCol As String)
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     
  6.     Dim wb As Workbook
  7.     Dim ws As Worksheet
  8.     Dim lastRow As Long
  9.     Dim codeDict As Object: Set codeDict = CreateObject("Scripting.Dictionary")
  10.     Dim codeColNum As Long
  11.     Dim dateColNum As Long
  12.     Dim amountColNum As Long
  13.     
  14.     Set wb = Workbooks.Open(filePath)
  15.     Set ws = wb.Sheets(1)
  16.     ' 列番号取得
  17.     codeColNum = Range(codeCol & "1").Column
  18.     dateColNum = Range(dateCol & "1").Column
  19.     amountColNum = Range(amountCol & "1").Column
  20.     lastRow = ws.Cells(ws.Rows.Count, codeColNum).End(xlUp).row
  21.     ' ソート
  22.     ws.Sort.SortFields.Clear
  23.     ws.Sort.SortFields.Add Key:=ws.Cells(2, codeColNum), Order:=xlAscending
  24.     ws.Sort.SortFields.Add Key:=ws.Cells(2, dateColNum), Order:=xlAscending
  25.     With ws.Sort
  26.         .SetRange ws.Range("A1", ws.Cells(lastRow, ws.Cells(1, Columns.Count).End(xlToLeft).Column))
  27.         .header = xlYes
  28.         .Apply
  29.     End With
  30.     ' コードごとにデータ格納
  31.     Dim i As Long
  32.     For i = 2 To lastRow
  33.         Dim code As String, dt As String, amt As Double
  34.         code = Trim(ws.Cells(i, codeColNum).Value)
  35.         dt = Format(ws.Cells(i, dateColNum).Value, "yyyy/mm/dd")
  36.         amt = ws.Cells(i, amountColNum).Value
  37.         
  38.         If code <> "" And dt <> "" And IsNumeric(amt) Then
  39.             If Not codeDict.exists(code) Then
  40.                 codeDict.Add code, CreateObject("Scripting.Dictionary")
  41.             End If
  42.             
  43.             With codeDict(code)
  44.                 If .exists(dt) Then
  45.                     .Item(dt) = .Item(dt) + amt
  46.                 Else
  47.                     .Add dt, amt
  48.                 End If
  49.             End With
  50.         End If
  51.     Next i
  52.     ' シート作成
  53.     Dim codeKey As Variant
  54.     For Each codeKey In codeDict.Keys
  55.         If シート存在チェック(wb, codeKey) Then
  56.             MsgBox "コード [" & codeKey & "] のシートはすでに存在します。処理を中止します。", vbInformation
  57.             wb.Close SaveChanges:=False
  58.             GoTo EndProc
  59.         End If
  60.         
  61.         Dim newWS As Worksheet
  62.         Set newWS = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count))
  63.         newWS.Name = codeKey
  64.         
  65.         ' ヘッダー
  66.         newWS.Range("A1") = "日付"
  67.         newWS.Range("B1") = "合計金額"
  68.         
  69.         ' データ出力
  70.         Dim row As Long: row = 2
  71.         Dim dtKey As Variant
  72.         For Each dtKey In codeDict(codeKey).Keys
  73.             newWS.Cells(row, 1).Value = dtKey
  74.             newWS.Cells(row, 2).Value = codeDict(codeKey)(dtKey)
  75.             row = row + 1
  76.         Next dtKey
  77.         
  78.         newWS.Cells.EntireColumn.AutoFit
  79.     Next codeKey
  80.     wb.Save
  81.     wb.Close SaveChanges:=True
  82.     
  83.     Call 折れ線グラフを作成する(filePath)
  84.     
  85.     MsgBox "集計&折れ線グラフ作成が完了しました", vbInformation
  86. EndProc:
  87.     Application.ScreenUpdating = True
  88.     Application.DisplayAlerts = True
  89. End Sub
  90. Private Function シート存在チェック(wb As Workbook, codeKey As Variant) As Boolean
  91.     Dim ws As Worksheet
  92.     For Each ws In wb.Sheets
  93.         If ws.Name = codeKey Then
  94.             シート存在チェック = True
  95.             Exit Function
  96.         End If
  97.     Next
  98.     シート存在チェック = False
  99. End Function
  100. Public Sub 折れ線グラフを作成する(filePath As String)
  101.     Dim wb As Workbook
  102.     Dim ws As Worksheet
  103.     Dim lastRow As Long
  104.     Dim chartObj As ChartObject
  105.     Dim chartRange As Range
  106.     Set wb = Workbooks.Open(filePath)
  107.     Application.ScreenUpdating = False
  108.     Application.DisplayAlerts = False
  109.     For Each ws In wb.Worksheets
  110.         ' 「集計元」シート(最初のシート)はスキップする(必要に応じて変更可能)
  111.         If ws.Index = 1 Then GoTo NextSheet
  112.         ' 最終行の取得(A列を基準)
  113.         lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
  114.         ' データが2行以上あるか確認
  115.         If lastRow < 2 Then GoTo NextSheet
  116.         ' グラフ範囲の指定(A列:日付、B列:合計金額)
  117.         Set chartRange = ws.Range("A1:B" & lastRow)
  118.         ' グラフ作成
  119.         Set chartObj = ws.ChartObjects.Add(Left:=300, Top:=10, Width:=500, Height:=300)
  120.         With chartObj.Chart
  121.             .ChartType = xlLine
  122.             .SetSourceData Source:=chartRange
  123.             .HasTitle = True
  124.             .ChartTitle.Text = "日別売上推移"
  125.             .Axes(xlCategory).HasTitle = True
  126.             .Axes(xlCategory).AxisTitle.Text = "日付"
  127.             .Axes(xlValue).HasTitle = True
  128.             .Axes(xlValue).AxisTitle.Text = "合計金額"
  129.             .SeriesCollection(1).ApplyDataLabels
  130.         End With
  131. NextSheet:
  132.     Next ws
  133.     wb.Save
  134.     wb.Close SaveChanges:=True
  135.     Application.ScreenUpdating = True
  136.     Application.DisplayAlerts = True
  137. End Sub

 

作成したマクロを保存します

作成したマクロを保存します①

 

作成したマクロを保存します②

 

作成したマクロを保存します③

 

作成したマクロを保存します④

 

作成したマクロを実行

 

マクロ実行前にシートごとにコード別日別集計対象のExcelをチェック

 

マクロ実行でシートごとにコード別日別集計チェック①

 

 

マクロ実行でシートごとにコード別日別集計チェック②

 

 

マクロ実行でシートごとにコード別日別集計(折れ線グラフ)チェック③

 

 

マクロ実行でシートごとにコード別日別集計(折れ線グラフ)チェック④

 

 

マクロ実行でシートごとにコード別日別集計(折れ線グラフ)チェック⑤

 

 

フォームでチェックしている項目について

フォームでチェックしている項目について①

 

 

フォームでチェックしている項目について②

 

 

フォームでチェックしている項目について③

 

 

フォームでチェックしている項目について④

 

 

フォームでチェックしている項目について⑤

 

 

フォームでチェックしている項目について⑥

 

 

フォームでチェックしている項目について⑦

 

マクロの条件について

 

初心者向けマクロの作り方|コード別の日別集計と折線グラフ作成であなたの作業はもっと楽になる

このようなマクロを使えば、集計だけでなく、グラフ化までワンクリックで完了。あなたの月末資料作成もぐっとラクになります。

「マクロって難しそう…」と思っていた方も、命令からコツコツ覚えるのも大切ですが、まずは、コピペしたマクロでExcel作業を効率化してみませんか?

ぜひ一度使ってみてください。

 

📌まずはコピペでOK。少しずつ「わかる」に近づこう

このページでは、難しいことは抜きにして「まずはコピペで業務を効率化する」ことを目的にしています。でも、使っているうちに「この命令って何をしてるんだろう?」と気になる場面も出てくるはずです。そんなときに役立つのが 「VBAエキスパート資格解説書」

基準をもってVBAの理解を深めたい方におすすめです。

👉初心者の人は、Excel VBAエキスパートベーシック解説書

👉マクロの基礎知識がある人は、Excel VBAエキスパートスタンダード解説書

初心者向けマクロの作り方|もし、ダメだ動かない。わからないなど気になることがあれば・・・

以下、お問い合わせ内容は、後日まとめて対応内容を本記事に掲載します。

メールアドレスの入力はありませんので、お気軽にお問い合わせください。