• 公開日:
  • 更新日:

エクセルで1ヶ月分の日付のシートを作成する方法

Excelで作業日報や経費報告などのフォーマットを作成した際、このシートを同じレイアウトで1ヶ月分(30枚・31枚など)増やすのは手間がかかります。

1ヶ月分のシート全部にレイアウトを1つ1つコピペすることを想像すると、途方に暮れるのではないでしょうか。

この記事では、Excelで1ヶ月分の日付のシートを一瞬で作成・コピペできるVBAをご紹介します。

エクセルで1ヶ月分の日付のシートを作成する方法

以下では、Excelで1ヶ月分の日付のシートを作成する方法について解説します。

開発タブの表示

開発タブの表示

Excelで1ヶ月分の日付のシートを作成するには、Visual Basicの機能がある開発タブを表示させる必要があります。

Excelで開発タブを表示させる方法については、以下の記事を参照してください。

エクセルの開発タブを表示する方法

1ヶ月の日付シートの作成方法

Excelで1ヶ月分の日付シートを作成する方法について解説します。

シートの1枚目

Sheet1に2023年11月1日の作業日報が記載されているフォーマットがあります。

ここでは、VBAを使って1ヶ月分(11/1~11/30)までのシートを一括で作成する方法をご紹介します。

Visual Basicを選択する

開発タブ、②Visual Basicの順に選択します。

標準モジュールを選択する

「Microsoft Visual Basic for Applications」ダイアログボックスが表示されました。

挿入タブ、②標準モジュールの順に選択します。

VBAコードを入力する

標準モジュールが表示されました。以下のコードをコピー&ペーストして貼り付けます

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