【EXCEL VBA】週数を指定した曜日を取得、月毎の日を取得

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

月単位で第X週の曜日や、毎月X日といった条件を指定して日付を抽出・取得するExcel VBAマクロのサンプルコードです。

定例作業のスケジュールやカレンダー作成時に、特定の日時を自動で抽出したい場合などに活用できます。

この記事でできること

指定した期間(開始日~終了日)の中で、以下の条件に一致する日付をJ列に順次出力します。

  • 指定した祝日を除外する
  • 「第何週の何曜日(月~日、全)」に一致する日を抽出する
  • 毎月指定した「X日」に一致する日を抽出する

前提条件・シート構成の仮定

このマクロを実行するためには、Excelシート側に以下のようなセル・範囲の配置(仮定)を用意してください。

  • A4: 処理の開始日
  • B4: 処理の終了日
  • C4:C40: 除外したい祝日の日付リスト
  • D4:E40: 第何週(D列)と曜日(E列:「月」「火」「水」「木」「金」「土」「日」「全」)の条件範囲
  • F4:F40: 毎月抽出したい日(日数の数値)の条件範囲
  • J4以降: 抽出された日付の出力先

Excel VBA サンプルコード

以下のコードをVBAエディタに貼り付けて実行してください。

Option Explicit

Sub Exec()
    Dim start As Date
    Dim i As Date
    Dim limit As Date
    Dim r As Range
    Set r = Range("J4")
    
    Range("J:J").ClearContents
    
    start = Range("A4")
    limit = Range("B4")
    
    For i = start To limit
        If IsWrite(i) = True Then
            r.Value = i
            Set r = r.Offset(1, 0)
        End If
    Next i

End Sub

Function IsWrite(d) As Boolean
    IsWrite = False
    
    Dim weeks As Integer
    
    ' 祝日は対象外
    Dim r As Range
    For Each r In Range("C4:C40")
        If r.Value = d Then
            GoTo FINALLY:
        End If
    Next r
        
    ' 第X Y曜日?
    For Each r In Range("D4:D40")
        If r.Value <> "" Or r.Offset(0, 1).Value <> "" Then
            ' 第何週?
            weeks = (Day(d) + 6) \ 7
            If r.Value = weeks Then
                Select Case r.Offset(0, 1).Value
                Case "月"
                    If Weekday(d) = vbMonday Then
                        IsWrite = True
                    End If
                Case "火"
                    If Weekday(d) = vbTuesday Then
                        IsWrite = True
                    End If
                Case "水"
                    If Weekday(d) = vbWednesday Then
                        IsWrite = True
                    End If
                Case "木"
                    If Weekday(d) = vbThursday Then
                        IsWrite = True
                    End If
                Case "金"
                    If Weekday(d) = vbFriday Then
                        IsWrite = True
                    End If
                Case "土"
                    If Weekday(d) = vbSaturday Then
                        IsWrite = True
                    End If
                Case "日"
                    If Weekday(d) = vbSunday Then
                        IsWrite = True
                    End If
                Case "全"
                    IsWrite = True
                End Select
            End If
        End If
    Next r
        
    ' 毎月X日
    For Each r In Range("F4:F40")
        If r.Value <> "" Then
            If r.Value = Day(d) Then
                IsWrite = True
            End If
        End If
    Next r
        
FINALLY:

End Function

Private Sub CommandButton1_Click()
    Call Exec
End Sub

使い方・実行手順

  1. Excelのワークシートに上記のセル配置(A4に開始日、B4に終了日、C列に祝日、D〜E列に第N週と曜日、F列に毎月の日付)を設定します。
  2. VBAエディタ(Alt + F11)を開き、標準モジュール等に上記のコードを追加します。
  3. シート上に配置したコマンドボタン(CommandButton1)をクリックするか、Exec マクロを直接実行します。
  4. 条件に一致する日付がJ4セル以降に一覧で出力されます。

※本記事のコードは、旧来公開されていた配布ファイルの仕様を基に、現在の読者向けに再構成したサンプルコードです。

この記事の更新履歴

この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。

2026年10月2日

  • 削除リンク切れとなっていた古いZIPファイルへのダウンロードリンクを削除しました。
  • 追加記事で紹介されている仕様を基に、インデントやコメントを整えた見やすいExcel VBAの完全なコードブロックと実行手順を追加しました。

文書情報

記事タイトル
【EXCEL VBA】週数を指定した曜日を取得、月毎の日を取得
作成日
更新日
Source URL
https://papanda925.com/?p=459

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました