昨日パソコンの中身を整理していたところ、昔作った1か月分のエクセルシートを作成するマクロを発見しました。
そういえば、数年前、仕事の必要から作成した記憶があります。
私はもう使うことはありませんが、削除する前にブログにアップして共有します。
1か月分のシート作成
業務で1か月分のシートを作成する機会は、頻繁に出てくると思います。
- 業務日報
- 勤務日誌
- 売上日報
などです。
今回は、売上日報ということにしています。
毎日の商品別の売上とその合計額です。
10月なら31枚シートが必要になります。
原稿を31回コピーしても作成できますが、それでは非効率です。
また、日付もシートごとに変える必要があります。
これを毎月行うのはちょっと面倒です。
原稿
繰り返しのコピー作業は、マクロが得意とするところです。
一度作成してしまえば、実行には1分もかかりません。
この原稿から1か月分のシート(10月なら31枚)を作ります。
原稿はこちらです。
売上日報.xlsx

完成形
完成形はこちらです。
右側は見切れていますが、31枚のシートが作成されています。
また、D1セルにはシートごとに日付が表示されています。

1か月分のシートを作るVBA
作成したVBAは下のとおりです。
こちらを先ほどのエクセル原稿にマクロとして貼り付ければ動作するはずです。
作成した1か月分のシートが入ったブックは、指定したフォルダに保存されます。
原稿ブックは、変更されることなくそのまま閉じられます。
使い方と、注意点です。
- 作成する「年」と「月」はプロンプトが表示されます。
- 保存フォルダは「C:\日誌\」としています。
変更するには、10行目の「savePath = “C:\日誌\”」部分を修正します。 - 日付はD1セルに入力されます。
ここでの日付は、シートの色分け(土曜日は青、日曜日は赤)にも使用しています。
他のセルに入力する場合は、マクロの62~64行目の「D1」部分を変更します。 - D1セルの書式設定は、「yyyy/mm/dd (aaa)」としています。
曜日が不要であれば(aaa)部分を削除するなど、適宜変更できます。 - VBAを含め、このブログにより生じた一切の損害について責任を負うものではありません。
Option Explicit
Sub 売上日報作成()
On Error GoTo ErrHandler
Application.ScreenUpdating = False
' 保存先フォルダ(必要に応じて変更)
Dim savePath As String
savePath = "C:\日誌\"
If Dir(savePath, vbDirectory) = "" Then MkDir savePath
' マクロが入ったブックとテンプレートシート(先頭シート)を参照
Dim wbMacro As Workbook
Set wbMacro = ThisWorkbook
Dim template As Worksheet
Set template = wbMacro.Worksheets(1)
' 入力(西暦・月)
Dim yearInput As Long
Dim monthInput As Long
Dim tmp As String
tmp = InputBox("作成年(西暦)を入力してください", "作成年入力", Year(Date))
If Trim(tmp) = "" Then GoTo CleanExit
If Not IsNumeric(tmp) Then MsgBox "年は数値で入力してください。": GoTo CleanExit
yearInput = CLng(tmp)
tmp = InputBox("作成月を入力してください(1~12)", "作成月入力", Month(Date))
If Trim(tmp) = "" Then GoTo CleanExit
If Not IsNumeric(tmp) Then MsgBox "月は数値で入力してください。": GoTo CleanExit
monthInput = CLng(tmp)
If monthInput < 1 Or monthInput > 12 Then MsgBox "月は1~12で指定してください。": GoTo CleanExit
If MsgBox("作成年月: " & yearInput & "年" & Format(monthInput, "00") & "月 を作成します。よろしいですか?", _
vbYesNo + vbQuestion, "作成確認") <> vbYes Then GoTo CleanExit
' 当該月の日数を取得
Dim daysInMonth As Long
daysInMonth = Day(DateSerial(yearInput, monthInput + 1, 0))
' 新規ブック作成(空白シート付き)
Dim newWB As Workbook
Set newWB = Workbooks.Add(xlWBATWorksheet)
Dim dayIdx As Long
Dim newWS As Worksheet
Dim sheetName As String
For dayIdx = 1 To daysInMonth
' テンプレートをコピー
template.Copy After:=newWB.Sheets(newWB.Sheets.Count)
Set newWS = newWB.Sheets(newWB.Sheets.Count)
' シート名(例:0401)
sheetName = Format(monthInput, "00") & Format(dayIdx, "00")
On Error Resume Next
newWS.Name = sheetName
On Error GoTo ErrHandler
' D1 に日付を入力、土日ならタブ色を変更
newWS.Range("D1").Value = DateSerial(yearInput, monthInput, dayIdx)
Select Case Weekday(newWS.Range("D1").Value)
Case vbSunday: newWS.Tab.ColorIndex = 3 '赤
Case vbSaturday: newWS.Tab.ColorIndex = 41 '青
Case Else: newWS.Tab.ColorIndex = xlColorIndexNone
End Select
Next dayIdx
' 最初の空白シートを削除
Application.DisplayAlerts = False
If newWB.Sheets(1).Range("A1").Value = "" And newWB.Sheets.Count > daysInMonth Then
newWB.Sheets(1).Delete
End If
Application.DisplayAlerts = True
' 先頭シートをアクティブに設定
newWB.Sheets(1).Activate
' ファイル名(西暦)を.xlsxで保存
Dim fileName As String
fileName = savePath & "日誌(" & yearInput & "年" & Format(monthInput, "00") & "月).xlsx"
newWB.SaveAs fileName:=fileName, FileFormat:=xlOpenXMLWorkbook
MsgBox "保存しました:" & vbCrLf & fileName, vbInformation
newWB.Close SaveChanges:=False
CleanExit:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました: " & Err.Number & " - " & Err.Description, vbCritical
Resume CleanExit
End Sub
本日のまとめ
VBAの貼り付け方などについては、本やブログで多数紹介されているので割愛します。
また、マクロがうまく動作しないようであれば、ChatGPTなどに相談すれば教えてくれるはずです。
今回は、パソコンのフォルダから見つけた昔作ったVBAを紹介しました。
プログラムは作成するのが少し手間ですが、一度作れば大幅に省力化ができます。
業務効率化の一つとしてご活用ください。