【初心者向け】日別集計と折線グラフをシート名保存するマクロの作り方

 

「毎月、担当者別・日別に集計して、グラフを作って…手間がかかって大変!」

そんなあなたに朗報です。

本記事では、Excel VBAで元データを自動でコード別に集計し、日別折れ線グラフまで作成&シート別にブック保存してくれるマクロをご紹介します。

初心者でもすぐ使えるように、使い方の3ステップや注意点をわかりやすく解説しています。

繰り返しの作業から解放されたい方、ぜひこのマクロで業務の効率化を体験してみてください!

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

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

 

 

目次

初心者向けマクロの作り方|日別集計と折線グラフをシート名保存|どんなときに便利?

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

 

たとえば

・集計表、グラフを作成したあと、担当者別や部署別に配布するので、シートごとにわけてブックを作成したい。

・ひとつのブックから配布ごとに分けて保存する時間を取られたくない!

そんなあなたにピッタリなのが、この「日別集計と折線グラフをシート名で保存するマクロ」です。

ファイルを選んで集計ボタンを押すだけで、自動で集計+折れ線グラフ+シート別にブック作成。

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

 

初心者向けマクロの作り方|日別集計と折線グラフをシート名保存|できること

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

 

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

 

初心者向けマクロの作り方|日別集計と折線グラフをシート名保存|使い方はたったの3ステップ

 

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

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

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

 

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

 

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

 

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

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

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

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

 

②対象Excelフォーマット

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

 

③トラブル対策

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

 

初心者向けマクロの作り方|日別集計と折線グラフをシート名保存|よく変更が行われる箇所

変更箇所(追加) 内容 たとえば、このように変更
保存先のフォルダを指定 newWb.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook savePath を変更すればOK

 

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

シートごとにコード別日別集計&折線グラフを作成する【検証済】マクロコード一式(フォーム+標準モジュール+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.     Call コード別シートを個別ブックに保存(filePath)
  86.     
  87.     MsgBox "集計&折れ線グラフ作成が完了しました", vbInformation
  88. EndProc:
  89.     Application.ScreenUpdating = True
  90.     Application.DisplayAlerts = True
  91. End Sub
  92. Private Function シート存在チェック(wb As Workbook, codeKey As Variant) As Boolean
  93.     Dim ws As Worksheet
  94.     For Each ws In wb.Sheets
  95.         If ws.Name = codeKey Then
  96.             シート存在チェック = True
  97.             Exit Function
  98.         End If
  99.     Next
  100.     シート存在チェック = False
  101. End Function
  102. Public Sub 折れ線グラフを作成する(filePath As String)
  103.     Dim wb As Workbook
  104.     Dim ws As Worksheet
  105.     Dim lastRow As Long
  106.     Dim chartObj As ChartObject
  107.     Dim chartRange As Range
  108.     Set wb = Workbooks.Open(filePath)
  109.     Application.ScreenUpdating = False
  110.     Application.DisplayAlerts = False
  111.     For Each ws In wb.Worksheets
  112.         ' 「集計元」シート(最初のシート)はスキップする(必要に応じて変更可能)
  113.         If ws.Index = 1 Then GoTo NextSheet
  114.         ' 最終行の取得(A列を基準)
  115.         lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
  116.         ' データが2行以上あるか確認
  117.         If lastRow < 2 Then GoTo NextSheet
  118.         ' グラフ範囲の指定(A列:日付、B列:合計金額)
  119.         Set chartRange = ws.Range("A1:B" & lastRow)
  120.         ' グラフ作成
  121.         Set chartObj = ws.ChartObjects.Add(Left:=300, Top:=10, Width:=500, Height:=300)
  122.         With chartObj.Chart
  123.             .ChartType = xlLine
  124.             .SetSourceData Source:=chartRange
  125.             .HasTitle = True
  126.             .ChartTitle.Text = "日別売上推移"
  127.             .Axes(xlCategory).HasTitle = True
  128.             .Axes(xlCategory).AxisTitle.Text = "日付"
  129.             .Axes(xlValue).HasTitle = True
  130.             .Axes(xlValue).AxisTitle.Text = "合計金額"
  131.             .SeriesCollection(1).ApplyDataLabels
  132.         End With
  133. NextSheet:
  134.     Next ws
  135.     wb.Save
  136.     wb.Close SaveChanges:=True
  137.     Application.ScreenUpdating = True
  138.     Application.DisplayAlerts = True
  139. End Sub
  140. Public Sub コード別シートを個別ブックに保存(filePath As String)
  141.     Application.ScreenUpdating = False
  142.     Application.DisplayAlerts = False
  143.     
  144.     Dim wb As Workbook
  145.     Set wb = Workbooks.Open(filePath)
  146.     Dim folderPath As String
  147.     folderPath = Left(filePath, InStrRev(filePath, "\")) ' フォルダのパス
  148.     Dim ws As Worksheet
  149.     For Each ws In wb.Worksheets
  150.         If ws.Index <> 1 Then
  151.         ' 最初のシートは「元データ」とみなしてスキップ
  152.             ' 新しいブックを作成
  153.             Dim newWb As Workbook
  154.             Set newWb = Workbooks.Add(xlWBATWorksheet)
  155.         
  156.             ' 最初のシートに元のシートの内容をコピー
  157.             ws.Cells.Copy Destination:=newWb.Sheets(1).Cells(1, 1)
  158.             newWb.Sheets(1).Name = ws.Name
  159.             
  160.             ' ★ 横軸(例:A列)が日付の場合、表示形式を「yyyy/m/d」に
  161.             newWb.Sheets(1).Columns(1).NumberFormat = "yyyy/m/d"
  162.         
  163.             ' ★ 外部リンクがあれば削除(セキュリティ警告回避)
  164.             Dim link As Variant
  165.             On Error Resume Next ' リンクがない場合のエラー対策
  166.             For Each link In newWb.LinkSources(Type:=xlLinkTypeExcelLinks)
  167.                 newWb.BreakLink Name:=link, Type:=xlLinkTypeExcelLinks
  168.             Next link
  169.             On Error GoTo 0
  170.             
  171.             ' 保存パス作成
  172.             Dim savePath As String
  173.             savePath = folderPath & ws.Name & ".xlsx"
  174.         
  175.             ' 上書き保存
  176.             Application.DisplayAlerts = False
  177.             newWb.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
  178.             newWb.Close SaveChanges:=False
  179.             Application.DisplayAlerts = True
  180.         End If
  181.     Next ws
  182.     wb.Close SaveChanges:=False
  183.     
  184.     Application.ScreenUpdating = True
  185.     Application.DisplayAlerts = True
  186. 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.     Call コード別シートを個別ブックに保存(filePath)
  86.     
  87.     MsgBox "集計&折れ線グラフ作成が完了しました", vbInformation
  88. EndProc:
  89.     Application.ScreenUpdating = True
  90.     Application.DisplayAlerts = True
  91. End Sub
  92. Private Function シート存在チェック(wb As Workbook, codeKey As Variant) As Boolean
  93.     Dim ws As Worksheet
  94.     For Each ws In wb.Sheets
  95.         If ws.Name = codeKey Then
  96.             シート存在チェック = True
  97.             Exit Function
  98.         End If
  99.     Next
  100.     シート存在チェック = False
  101. End Function
  102. Public Sub 折れ線グラフを作成する(filePath As String)
  103.     Dim wb As Workbook
  104.     Dim ws As Worksheet
  105.     Dim lastRow As Long
  106.     Dim chartObj As ChartObject
  107.     Dim chartRange As Range
  108.     Set wb = Workbooks.Open(filePath)
  109.     Application.ScreenUpdating = False
  110.     Application.DisplayAlerts = False
  111.     For Each ws In wb.Worksheets
  112.         ' 「集計元」シート(最初のシート)はスキップする(必要に応じて変更可能)
  113.         If ws.Index = 1 Then GoTo NextSheet
  114.         ' 最終行の取得(A列を基準)
  115.         lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
  116.         ' データが2行以上あるか確認
  117.         If lastRow < 2 Then GoTo NextSheet
  118.         ' グラフ範囲の指定(A列:日付、B列:合計金額)
  119.         Set chartRange = ws.Range("A1:B" & lastRow)
  120.         ' グラフ作成
  121.         Set chartObj = ws.ChartObjects.Add(Left:=300, Top:=10, Width:=500, Height:=300)
  122.         With chartObj.Chart
  123.             .ChartType = xlLine
  124.             .SetSourceData Source:=chartRange
  125.             .HasTitle = True
  126.             .ChartTitle.Text = "日別売上推移"
  127.             .Axes(xlCategory).HasTitle = True
  128.             .Axes(xlCategory).AxisTitle.Text = "日付"
  129.             .Axes(xlValue).HasTitle = True
  130.             .Axes(xlValue).AxisTitle.Text = "合計金額"
  131.             .SeriesCollection(1).ApplyDataLabels
  132.         End With
  133. NextSheet:
  134.     Next ws
  135.     wb.Save
  136.     wb.Close SaveChanges:=True
  137.     Application.ScreenUpdating = True
  138.     Application.DisplayAlerts = True
  139. End Sub
  140. Public Sub コード別シートを個別ブックに保存(filePath As String)
  141.     Application.ScreenUpdating = False
  142.     Application.DisplayAlerts = False
  143.     
  144.     Dim wb As Workbook
  145.     Set wb = Workbooks.Open(filePath)
  146.     Dim folderPath As String
  147.     folderPath = Left(filePath, InStrRev(filePath, "\")) ' フォルダのパス
  148.     Dim ws As Worksheet
  149.     For Each ws In wb.Worksheets
  150.         If ws.Index <> 1 Then
  151.         ' 最初のシートは「元データ」とみなしてスキップ
  152.             ' 新しいブックを作成
  153.             Dim newWb As Workbook
  154.             Set newWb = Workbooks.Add(xlWBATWorksheet)
  155.         
  156.             ' 最初のシートに元のシートの内容をコピー
  157.             ws.Cells.Copy Destination:=newWb.Sheets(1).Cells(1, 1)
  158.             newWb.Sheets(1).Name = ws.Name
  159.             
  160.             ' ★ 横軸(例:A列)が日付の場合、表示形式を「yyyy/m/d」に
  161.             newWb.Sheets(1).Columns(1).NumberFormat = "yyyy/m/d"
  162.         
  163.             ' ★ 外部リンクがあれば削除(セキュリティ警告回避)
  164.             Dim link As Variant
  165.             On Error Resume Next ' リンクがない場合のエラー対策
  166.             For Each link In newWb.LinkSources(Type:=xlLinkTypeExcelLinks)
  167.                 newWb.BreakLink Name:=link, Type:=xlLinkTypeExcelLinks
  168.             Next link
  169.             On Error GoTo 0
  170.             
  171.             ' 保存パス作成
  172.             Dim savePath As String
  173.             savePath = folderPath & ws.Name & ".xlsx"
  174.         
  175.             ' 上書き保存
  176.             Application.DisplayAlerts = False
  177.             newWb.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
  178.             newWb.Close SaveChanges:=False
  179.             Application.DisplayAlerts = True
  180.         End If
  181.     Next ws
  182.     wb.Close SaveChanges:=False
  183.     
  184.     Application.ScreenUpdating = True
  185.     Application.DisplayAlerts = True
  186. End Sub

 

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

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

 

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

 

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

 

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

 

 

作成したマクロを実行

 

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

 

マクロ実行でシートごとにコード別日別集計(新規ブックに保存する)
チェック①

 

マクロ実行でシートごとにコード別日別集計(新規ブックに保存する)
チェック②

 

 

マクロ実行でシートごとにコード別日別集計(新規ブックに保存する)
チェック③

 

 

マクロ実行でシートごとにコード別日別集計(新規ブックに保存する)
チェック④

 

 

マクロ実行でシートごとにコード別日別集計(新規ブックに保存する)
チェック⑤

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

マクロの条件について

 

初心者向けマクロの作り方|日別集計と折線グラフをシート名保存であなたの作業はもっと楽になる

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

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

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

 

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

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

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

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

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

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

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

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