- 公開日:
- 更新日:
エクセルで1ヶ月分の日付のシートを作成する方法
Excelで作業日報や経費報告などのフォーマットを作成した際、このシートを同じレイアウトで1ヶ月分(30枚・31枚など)増やすのは手間がかかります。
1ヶ月分のシート全部にレイアウトを1つ1つコピペすることを想像すると、途方に暮れるのではないでしょうか。
この記事では、Excelで1ヶ月分の日付のシートを一瞬で作成・コピペできるVBAをご紹介します。
エクセルで1ヶ月分の日付のシートを作成する方法
以下では、Excelで1ヶ月分の日付のシートを作成する方法について解説します。
開発タブの表示
Excelで1ヶ月分の日付のシートを作成するには、Visual Basicの機能がある開発タブを表示させる必要があります。
Excelで開発タブを表示させる方法については、以下の記事を参照してください。
1ヶ月の日付シートの作成方法
Excelで1ヶ月分の日付シートを作成する方法について解説します。
Sheet1に2023年11月1日の作業日報が記載されているフォーマットがあります。
ここでは、VBAを使って1ヶ月分(11/1~11/30)までのシートを一括で作成する方法をご紹介します。
①開発タブ、②Visual Basicの順に選択します。
「Microsoft Visual Basic for Applications」ダイアログボックスが表示されました。
①挿入タブ、②標準モジュールの順に選択します。
標準モジュールが表示されました。以下のコードをコピー&ペーストして貼り付けます。
Sub CreateWorkReport()
Dim First_Sht As Worksheet
Dim Months As Long
Dim Mydate As Date
Dim i As Long
Dim ShtName As String
'最初のシートを変数格納
Set First_Sht = ActiveSheet
'最初の日付
Mydate = First_Sht.Range("B4").Value
'一か月が何日間あるか計算
Months = DateAdd("m", 1, Mydate) - Mydate
'一か月の日数ループ
For i = 1 To Months
If i = 1 Then
'最初のシートは、シート名を変更するのみ
First_Sht.Name = Format(Mydate, "m月d日")
Else
'シート作成し、シート名を日付にする
First_Sht.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = Format(Mydate, "m月d日")
ActiveSheet.Range("B4").Value = Mydate
End If
'列幅を自動調整
ActiveSheet.Columns("B:B").AutoFit
'日付を1日プラス
Mydate = DateAdd("d", 1, Mydate)
Next i
MsgBox "完了"
End Sub
このVBAコード「CreateWorkReport」は、Excel内で作業日報のシートを自動的に1ヶ月分作成するものです。
最初にアクティブなシート(Sheet1)のB4セルの日付を基に、その月の日数(11月なら30日)を計算します。その後、その月の日数だけ、各日付に対応するシートを作成します。
最初のSheet1ではシート名を日付(11月1日)に変更し、2日目(11月2日)以降のシートでは新たにシートを追加し、シート名とB4セルの日付を次々と設定します。
さらに、B列の列幅を自動調整して日付が「#######」として表示されるのを防ぎます。
これにより、日付シートの名前および内容が正しく表示されるようになります。全てのシートが作成された後、メッセージボックスで「完了」と表示されることで、シートの生成が終了したことがユーザーに通知されます。
①ファイルタブ、②「(ファイル名).xlsxの上書き保存」の順に選択します。
「Microsoft Excel」ダイアログボックスが表示されました。
いいえボタンを押します。
「名前を付けて保存」ダイアログボックスが表示されました。①保存したいフォルダー(例: デスクトップ)を選択します。
②ファイル名(例: CreateWorkReport)を入力し、③ファイルの種類のプルダウンから「Excel マクロ有効ブック」を選択し、④保存ボタンを押します。
①開発タブ、②マクロの順に選択します。
「マクロ」ダイアログボックスが表示されました。
①マクロ名(CreateWorkReport)を選択し、②実行ボタンを押します。
11月1日から11月30日までのシートが瞬時に表示されました。
シート(11月30日)の日付(B4セル)を確認すると「2023/11/30」になっており、シート名と連動していることがわかりました。
「Sheet1」のシートも「11月1日」に変更されていました。
「11月1日」シートを選択すると、日付も「2023/11/1」になっていたことが確認できました。
ボタンから1ヶ月分の日付のシートを作成したい場合
Sheet1にボタンを用意し、そのボタンを押した際に1か月分の日付のシートを作成するコードを紹介します。
以下は、Sheet1の特定のセル(例:B4)に最初の日付(2023年11月1日)を入力し、ボタンを押すと1ヶ月分の日付のシートが作成されるコードです。
標準モジュールに貼り付けて保存ください。
Sub CreateWorkReport()
Dim First_Sht As Worksheet
Dim Sheet1 As Worksheet
Dim Months As Long
Dim Mydate As Date
Dim i As Long
' シート1を設定
Set Sheet1 = ThisWorkbook.Sheets("Sheet1")
' 最初の日付をシート1から取得
Mydate = Sheet1.Range("B4").Value
' 一か月が何日間あるか計算
Months = Day(DateSerial(Year(Mydate), Month(Mydate) + 1, 0))
' 一か月の日数ループ
For i = 1 To Months
' 最初のシート(新規作成またはシート2)を設定
If i = 1 Then
Set First_Sht = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
First_Sht.Name = Format(Mydate, "m月d日")
Else
' シートをコピーし、シート名を日付に設定
First_Sht.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
ActiveSheet.Name = Format(Mydate, "m月d日")
ActiveSheet.Range("B4").Value = Mydate
End If
'列幅を自動調整
ActiveSheet.Columns("B:B").AutoFit
' 日付を1日プラス
Mydate = DateAdd("d", 1, Mydate)
Next i
MsgBox "完了"
End Sub
次にSheet1に実行するボタンを用意します。
開発タブ、挿入の順に選択し、ActiveXコントロールの中から「コマンドボタン」を選択します。
シート上にコマンドボタンを描画します。ボタンをダブルクリックし、VBAエディタが開いたら、以下のようにCreateWorkReportが動作するように紐づけます。
Private Sub CommandButton1_Click()
' CreateWorkReportプロシージャを実行する
CreateWorkReport
End Sub
以上でSheet1のボタンを押すと、1ヶ月分の日付のシートが作成されます。
テンプレートを複製して新しいシートを作成する
テンプレートをもとに1か月分の日付のシートを作成するコードを紹介します。
Sheet1に最初の日付を入力し、ボタンを配置します。ボタンは上記と同じコマンドボタンをご用意ください。
Sheet2にテンプレートとなるワークシートを置きます。
ボタン押下で、Sheet2の内容を複製し、3シート目から月末日までのシートを作成します。
Sub CreateWorkReport()
Dim TemplateSheet As Worksheet
Dim TargetSheet As Worksheet
Dim StartDate As Date
Dim TotalDays As Long
Dim i As Long
' シート1から開始日を取得
StartDate = ThisWorkbook.Sheets("Sheet1").Range("B4").Value
' 一ヶ月の日数を計算
TotalDays = Day(DateSerial(Year(StartDate), Month(StartDate) + 1, 0))
' テンプレートシートを設定
Set TemplateSheet = ThisWorkbook.Sheets("Sheet2")
' 一か月分のシートを作成
For i = 1 To TotalDays
' テンプレートシートをコピー
TemplateSheet.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set TargetSheet = ActiveSheet
' コピーしたシートの名前を設定
TargetSheet.Name = Format(StartDate, "m月d日")
' コピーしたシートの特定のセルに日付を設定
TargetSheet.Range("B4").Value = StartDate
' 日付を1日進める
StartDate = DateAdd("d", 1, StartDate)
Next i
MsgBox "完了"
End Sub