Excelリファレンス
Google Calendar iCal形式で祝日取得

エクセルの各種一覧、Excelリファレンス
公開日:2025-05-30 最終更新日:2025-06-02

Google Calendar iCal形式で祝日取得


生成AIのClaudeにGoogleカレンダーの祝日情報を取得するVBAを作成してもらいました。


シートの関数で取得したい場合は以下を参照してください
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~
・はじめに ・Google Apps Script (GAS) による祝日APIの作成 ・Excelでの祝日データの取得と表示 ・おわりに ・参考情報


プロンプト

エクセルからVBAでGoogleカレンダーの祝日情報を取得したい。
・VBAで期間を指定する。
・指定期間内の祝日の一覧を取得
・GoogleカレンダーのiCalから取得
・出力は日付の昇順
・参照設定は不要にする(Late Binding)
一発では正しく動作するVBAが作成されるとは限りません。
エラーや正しい結果が得られない場合は、エラーや結果をAIにに伝えると修正版のVBAを作成してくれます。
多くても2~3回の試行で完成するはずです。


完成VBA

Option Explicit

' 祝日情報を格納する構造体
Type HolidayInfo
  HolidayDate As Date
  HolidayName As String
End Type

' メイン関数:指定期間の祝日を取得
Sub GetHolidays()
  Dim startDate As Date
  Dim endDate As Date
  Dim holidays() As HolidayInfo
  
  ' 期間を指定(例:2024年1月1日から2024年12月31日)
  startDate = DateSerial(2024, 1, 1)
  endDate = DateSerial(2024, 12, 31)
  
  ' 祝日データを取得(フォールバック機能付き)
  holidays = GetHolidaysWithFallback(startDate, endDate)
  
  ' 結果をワークシートに出力
  Call OutputHolidaysToSheet(holidays)
  
  If UBound(holidays) >= 0 Then
    MsgBox "祝日の取得が完了しました。" & (UBound(holidays) + 1) & "件の祝日が見つかりました。"
  Else
    MsgBox "祝日データを取得できませんでした。"
  End If
End Sub

' フォールバック機能付き祝日取得関数
Function GetHolidaysWithFallback(startDate As Date, endDate As Date) As HolidayInfo()
  Dim holidays() As HolidayInfo
  
  ' まずiCal形式で試行
  holidays = GetHolidaysFromGoogleCalendar(startDate, endDate)
  
  ' iCalで取得できなかった場合、CSV形式で試行
  If UBound(holidays) < 0 Then
    holidays = GetHolidaysFromCSV(startDate, endDate)
  End If
  
  GetHolidaysWithFallback = holidays
End Function

' Googleカレンダー(iCal形式)から祝日データを取得する関数
Function GetHolidaysFromGoogleCalendar(startDate As Date, endDate As Date) As HolidayInfo()
  Dim http As Object
  Dim iCalData As String
  Dim holidays() As HolidayInfo
  
  ' 日本の祝日カレンダーのiCal URL
  Dim iCalURL As String
  iCalURL = "https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics"
  
  ' HTTPリクエストオブジェクト作成(Late Binding)
  Set http = CreateObject("MSXML2.XMLHTTP")
  
  ' HTTPヘッダーを設定
  http.Open "GET", iCalURL, False
  http.setRequestHeader "User-Agent", "Mozilla/5.0"
  
  On Error Resume Next
  http.send
  On Error GoTo 0
  
  If http.Status = 200 Then
    iCalData = http.responseText
    holidays = ParseiCalData(iCalData, startDate, endDate)
  Else
    ReDim holidays(0)
  End If
  
  Set http = Nothing
  GetHolidaysFromGoogleCalendar = holidays
End Function

' 内閣府CSV形式から祝日データを取得する関数
Function GetHolidaysFromCSV(startDate As Date, endDate As Date) As HolidayInfo()
  Dim http As Object
  Dim csvData As String
  Dim holidays() As HolidayInfo
  
  ' 内閣府の祝日CSVのURL
  Dim csvURL As String
  csvURL = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
  
  Set http = CreateObject("MSXML2.XMLHTTP")
  
  http.Open "GET", csvURL, False
  http.setRequestHeader "User-Agent", "Mozilla/5.0"
  
  On Error Resume Next
  http.send
  On Error GoTo 0
  
  If http.Status = 200 Then
    ' レスポンスをShift_JISからUTF-8に変換
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 1 ' Binary
    stream.Open
    stream.Write http.responseBody
    stream.Position = 0
    stream.Type = 2 ' Text
    stream.Charset = "Shift_JIS"
    csvData = stream.ReadText
    stream.Close
    Set stream = Nothing
    
    holidays = ParseCSVData(csvData, startDate, endDate)
  Else
    ReDim holidays(0)
  End If
  
  Set http = Nothing
  GetHolidaysFromCSV = holidays
End Function

' iCalデータを解析して祝日情報を抽出する関数
Function ParseiCalData(iCalData As String, startDate As Date, endDate As Date) As HolidayInfo()
  Dim lines() As String
  Dim holidays() As HolidayInfo
  Dim holidayCount As Long
  Dim i As Long
  Dim currentEvent As Boolean
  Dim eventDate As Date
  Dim eventSummary As String
  Dim dateStr As String
  
  ' データを行ごとに分割(CR+LFとLFの両方に対応)
  iCalData = Replace(iCalData, vbCrLf, vbLf)
  lines = Split(iCalData, vbLf)
  currentEvent = False
  holidayCount = 0
  
  ' 配列を初期化
  ReDim holidays(1000) ' 十分な大きさで初期化
  
  For i = 0 To UBound(lines)
    Dim line As String
    line = Trim(Replace(lines(i), vbCr, ""))
    
    ' イベント開始
    If line = "BEGIN:VEVENT" Then
      currentEvent = True
      eventDate = 0
      eventSummary = ""
    
    ' イベント終了
    ElseIf line = "END:VEVENT" And currentEvent Then
      If eventDate >= startDate And eventDate <= endDate And eventDate > 0 And eventSummary <> "" Then
        holidays(holidayCount).HolidayDate = eventDate
        holidays(holidayCount).HolidayName = eventSummary
        holidayCount = holidayCount + 1
      End If
      currentEvent = False
    
    ' 日付情報を取得(複数のパターンに対応)
    ElseIf currentEvent And (Left(line, 8) = "DTSTART:" Or Left(line, 8) = "DTSTART;") Then
      If InStr(line, ":") > 0 Then
        dateStr = Mid(line, InStr(line, ":") + 1)
        dateStr = Trim(Replace(dateStr, vbCr, ""))
        
        ' 日付形式の解析(YYYYMMDD形式)
        If Len(dateStr) >= 8 And IsNumeric(Left(dateStr, 8)) Then
          On Error Resume Next
          eventDate = DateSerial(Val(Left(dateStr, 4)), Val(Mid(dateStr, 5, 2)), Val(Mid(dateStr, 7, 2)))
          On Error GoTo 0
        End If
      End If
    
    ' イベント名を取得
    ElseIf currentEvent And Left(line, 8) = "SUMMARY:" Then
      eventSummary = Mid(line, 9)
      eventSummary = Trim(Replace(eventSummary, vbCr, ""))
    End If
  Next i
  
  ' 配列のサイズを調整
  If holidayCount > 0 Then
    ReDim Preserve holidays(holidayCount - 1)
    ' 日付順にソート
    Call SortHolidaysByDate(holidays)
  Else
    ReDim holidays(0)
  End If
  
  ParseiCalData = holidays
End Function

' CSVデータを解析する関数
Function ParseCSVData(csvData As String, startDate As Date, endDate As Date) As HolidayInfo()
  Dim lines() As String
  Dim holidays() As HolidayInfo
  Dim holidayCount As Long
  Dim i As Long
  Dim cols() As String
  Dim holidayDate As Date
  Dim holidayName As String
  
  lines = Split(csvData, vbLf)
  ReDim holidays(1000)
  holidayCount = 0
  
  ' 1行目(ヘッダー)をスキップして2行目から処理
  For i = 1 To UBound(lines)
    Dim line As String
    line = Trim(Replace(lines(i), vbCr, ""))
    
    If line <> "" Then
      cols = Split(line, ",")
      If UBound(cols) >= 1 Then
        ' 日付列(1列目)を解析
        On Error Resume Next
        holidayDate = CDate(Replace(cols(0), """", ""))
        On Error GoTo 0
        
        ' 祝日名(2列目)を取得
        holidayName = Replace(cols(1), """", "")
        
        ' 指定期間内の祝日のみを追加
        If holidayDate >= startDate And holidayDate <= endDate And holidayDate > 0 Then
          holidays(holidayCount).HolidayDate = holidayDate
          holidays(holidayCount).HolidayName = holidayName
          holidayCount = holidayCount + 1
        End If
      End If
    End If
  Next i
  
  ' 配列のサイズを調整
  If holidayCount > 0 Then
    ReDim Preserve holidays(holidayCount - 1)
    Call SortHolidaysByDate(holidays)
  Else
    ReDim holidays(0)
  End If
  
  ParseCSVData = holidays
End Function

' 祝日を日付順にソートする関数
Sub SortHolidaysByDate(ByRef holidays() As HolidayInfo)
  Dim i As Long, j As Long
  Dim temp As HolidayInfo
  
  If UBound(holidays) < 1 Then Exit Sub
  
  ' バブルソート
  For i = 0 To UBound(holidays) - 1
    For j = i + 1 To UBound(holidays)
      If holidays(i).HolidayDate > holidays(j).HolidayDate Then
        temp = holidays(i)
        holidays(i) = holidays(j)
        holidays(j) = temp
      End If
    Next j
  Next i
End Sub

' 祝日情報をワークシートに出力する関数
Sub OutputHolidaysToSheet(holidays() As HolidayInfo)
  Dim ws As Worksheet
  Dim i As Long
  
  ' 新しいワークシートを作成または既存のシートをクリア
  On Error Resume Next
  Set ws = Worksheets("祝日一覧")
  On Error GoTo 0
  
  If ws Is Nothing Then
    Set ws = Worksheets.Add
    ws.Name = "祝日一覧"
  Else
    ws.Cells.Clear
  End If
  
  ' ヘッダーを設定
  ws.Cells(1, 1).Value = "日付"
  ws.Cells(1, 2).Value = "祝日名"
  ws.Cells(1, 1).Font.Bold = True
  ws.Cells(1, 2).Font.Bold = True
  
  ' 祝日データを出力
  If UBound(holidays) >= 0 Then
    For i = 0 To UBound(holidays)
      ws.Cells(i + 2, 1).Value = holidays(i).HolidayDate
      ws.Cells(i + 2, 2).Value = holidays(i).HolidayName
    Next i
    
    ' 列幅を自動調整
    ws.Columns("A:B").AutoFit
    
    ' 日付列の書式設定
    ws.Columns("A").NumberFormat = "yyyy/mm/dd"
  End If
  
  ' シートをアクティブにする
  ws.Activate
End Sub

' 特定の日付が祝日かどうかを判定する関数
Function IsHoliday(targetDate As Date) As Boolean
  Dim startDate As Date
  Dim endDate As Date
  Dim holidays() As HolidayInfo
  Dim i As Long
  
  ' 対象年の1月1日から12月31日までの祝日を取得
  startDate = DateSerial(Year(targetDate), 1, 1)
  endDate = DateSerial(Year(targetDate), 12, 31)
  
  holidays = GetHolidaysWithFallback(startDate, endDate)
  
  IsHoliday = False
  If UBound(holidays) >= 0 Then
    For i = 0 To UBound(holidays)
      If holidays(i).HolidayDate = targetDate Then
        IsHoliday = True
        Exit For
      End If
    Next i
  End If
End Function

' 特定の祝日名を取得する関数
Function GetHolidayName(targetDate As Date) As String
  Dim startDate As Date
  Dim endDate As Date
  Dim holidays() As HolidayInfo
  Dim i As Long
  
  ' 対象年の1月1日から12月31日までの祝日を取得
  startDate = DateSerial(Year(targetDate), 1, 1)
  endDate = DateSerial(Year(targetDate), 12, 31)
  
  holidays = GetHolidaysWithFallback(startDate, endDate)
  
  GetHolidayName = ""
  If UBound(holidays) >= 0 Then
    For i = 0 To UBound(holidays)
      If holidays(i).HolidayDate = targetDate Then
        GetHolidayName = holidays(i).HolidayName
        Exit For
      End If
    Next i
  End If
End Function

' 使用例:現在の月の祝日を取得
Sub GetCurrentMonthHolidays()
  Dim startDate As Date
  Dim endDate As Date
  Dim holidays() As HolidayInfo
  
  ' 現在の月の最初と最後の日を設定
  startDate = DateSerial(Year(Date), Month(Date), 1)
  endDate = DateSerial(Year(Date), Month(Date) + 1, 0)
  
  holidays = GetHolidaysWithFallback(startDate, endDate)
  Call OutputHolidaysToSheet(holidays)
  
  If UBound(holidays) >= 0 Then
    MsgBox "今月の祝日を取得しました。" & (UBound(holidays) + 1) & "件の祝日が見つかりました。"
  Else
    MsgBox "今月は祝日がありません。"
  End If
End Sub

' 使用例:来年の祝日を取得
Sub GetNextYearHolidays()
  Dim startDate As Date
  Dim endDate As Date
  Dim holidays() As HolidayInfo
  Dim nextYear As Integer
  
  nextYear = Year(Date) + 1
  startDate = DateSerial(nextYear, 1, 1)
  endDate = DateSerial(nextYear, 12, 31)
  
  holidays = GetHolidaysWithFallback(startDate, endDate)
  Call OutputHolidaysToSheet(holidays)
  
  If UBound(holidays) >= 0 Then
    MsgBox nextYear & "年の祝日を取得しました。" & (UBound(holidays) + 1) & "件の祝日が見つかりました。"
  Else
    MsgBox nextYear & "年の祝日データを取得できませんでした。"
  End If
End Sub


VBAコードの解説

ExcelのVBAで祝日情報を取得するコードの詳細解説をします。
1. 基本構造とデータ型
祝日情報の構造体
Type HolidayInfo
  HolidayDate As Date
  HolidayName As String
End Type

祝日の日付と名前をセットで管理するカスタム型
配列として使用して複数の祝日を格納

2. メイン処理の流れ
GetHolidays() - 基本的な取得処理
Sub GetHolidays()
  Dim startDate As Date
  Dim endDate As Date
  Dim holidays() As HolidayInfo
  
  ' 期間指定
  startDate = DateSerial(2024, 1, 1)
  endDate = DateSerial(2024, 12, 31)
  
  ' データ取得
  holidays = GetHolidaysWithFallback(startDate, endDate)
  
  ' 結果出力
  Call OutputHolidaysToSheet(holidays)
End Sub

処理順序:
  1. 取得期間を設定
  2. フォールバック機能付きで祝日データを取得
  3. Excelシートに結果を出力

3. フォールバック機能
GetHolidaysWithFallback() - 2つのデータソースを試行
Function GetHolidaysWithFallback(startDate As Date, endDate As Date) As HolidayInfo()
  holidays = GetHolidaysFromGoogleCalendar(startDate, endDate)
  
  ' 失敗時の代替手段
  If UBound(holidays) < 0 Then
    holidays = GetHolidaysFromCSV(startDate, endDate)
  End If
End Function

フォールバックの理由:
  • 1
  • GoogleカレンダーのiCal形式は時々アクセス制限がある
  • 内閣府のCSVは安定しているが文字エンコーディングが複雑
  • どちらかが失敗しても祝日を取得可能

4. データ取得方法
方法1: GoogleカレンダーのiCal形式
Function GetHolidaysFromGoogleCalendar(startDate As Date, endDate As Date) As HolidayInfo()
  ' HTTPリクエスト作成(Late Binding)
  Set http = CreateObject("MSXML2.XMLHTTP")
  
  ' リクエスト送信
  http.Open "GET", iCalURL, False
  http.setRequestHeader "User-Agent", "Mozilla/5.0"
  http.send
  
  ' レスポンス処理
  If http.Status = 200 Then
    iCalData = http.responseText
    holidays = ParseiCalData(iCalData, startDate, endDate)
  End If
End Function

Late Bindingの利点:
  • 参照設定(Tools→References)が不要
  • 実行時にオブジェクトを作成するため互換性が高い
  • CreateObject("MSXML2.XMLHTTP")で動的にHTTPクライアントを作成

方法2: 内閣府のCSV形
Function GetHolidaysFromCSV(startDate As Date, endDate As Date) As HolidayInfo()
  ' 文字エンコーディング変換
  Dim stream As Object
  Set stream = CreateObject("ADODB.Stream")
  stream.Type = 1 ' Binary
  stream.Open
  stream.Write http.responseBody
  stream.Position = 0
  stream.Type = 2 ' Text
  stream.Charset = "Shift_JIS" ' 日本語対応
  csvData = stream.ReadText
End Function

文字エンコーディング処理:
  • 内閣府のCSVはShift_JIS形式
  • ADODB.Streamを使用してバイナリ→テキスト変換
  • VBAの標準機能では文字化けするため必要な処理

5. データ解析処理
iCalデータの解析
Function ParseiCalData(iCalData As String, startDate As Date, endDate As Date) As HolidayInfo()
  For i = 0 To UBound(lines)
    line = Trim(Replace(lines(i), vbCr, ""))
    
    ' イベント開始検出
    If line = "BEGIN:VEVENT" Then
      currentEvent = True
      
    ' 日付情報抽出
    ElseIf currentEvent And (Left(line, 8) = "DTSTART:" Or Left(line, 8) = "DTSTART;") Then
      dateStr = Mid(line, InStr(line, ":") + 1)
      eventDate = DateSerial(Val(Left(dateStr, 4)), Val(Mid(dateStr, 5, 2)), Val(Mid(dateStr, 7, 2)))
      
    ' 祝日名抽出
    ElseIf currentEvent And Left(line, 8) = "SUMMARY:" Then
      eventSummary = Mid(line, 9)
      
    ' イベント終了処理
    ElseIf line = "END:VEVENT" And currentEvent Then
      ' 期間内チェックして配列に追加
  Next i
End Function

iCal形式の特徴:
  • BEGIN:VEVENT~END:VEVENTでイベントを区切り
  • DTSTART:20240101形式で日付を表現(YYYYMMDD)
  • SUMMARY:で祝日名を表現

CSVデータの解析
Function ParseCSVData(csvData As String, startDate As Date, endDate As Date) As HolidayInfo()
  For i = 1 To UBound(lines) ' ヘッダー行をスキップ
    cols = Split(line, ",")
    
    ' 日付解析(1列目)
    holidayDate = CDate(Replace(cols(0), """", ""))
    
    ' 祝日名取得(2列目)
    holidayName = Replace(cols(1), """", "")
    
    ' 期間内チェックして配列に追加
  Next i
End Function

CSV形式の特徴:
  • 1行目はヘッダーのためスキップ
  • カンマ区切りで日付と祝日名
  • ダブルクォートで文字列を囲む場合がある

6. データソート機能
バブルソートによる日付順並び替え
Sub SortHolidaysByDate(ByRef holidays() As HolidayInfo)
  For i = 0 To UBound(holidays) - 1
    For j = i + 1 To UBound(holidays)
      If holidays(i).HolidayDate > holidays(j).HolidayDate Then
        ' 要素の交換
        temp = holidays(i)
        holidays(i) = holidays(j)
        holidays(j) = temp
      End If
    Next j
  Next i
End Sub

ソート処理のポイント:
  • ByRefで配列を参照渡し(元の配列を直接変更)
    Date型の比較演算子で日付の大小比較
    構造体全体を一時変数で交換

7. Excel出力機能
ワークシートへの出力
Sub OutputHolidaysToSheet(holidays() As HolidayInfo)
  ' シート取得または作成
  On Error Resume Next
  Set ws = Worksheets("祝日一覧")
  On Error GoTo 0
  
  If ws Is Nothing Then
    Set ws = Worksheets.Add
    ws.Name = "祝日一覧"
  End If
  
  ' データ出力
  For i = 0 To UBound(holidays)
    ws.Cells(i + 2, 1).Value = holidays(i).HolidayDate
    ws.Cells(i + 2, 2).Value = holidays(i).HolidayName
  Next i
  
  ' 書式設定
  ws.Columns("A").NumberFormat = "yyyy/mm/dd"
  ws.Columns("A:B").AutoFit
End Sub

出力処理の特徴:
  • エラーハンドリングでシートの存在確認
  • 動的にシート作成または既存シートをクリア
  • 自動書式設定と列幅調整

8. 便利関数
祝日判定機能
Function IsHoliday(targetDate As Date) As Boolean
  ' 対象年の祝日を全取得
  startDate = DateSerial(Year(targetDate), 1, 1)
  endDate = DateSerial(Year(targetDate), 12, 31)
  
  holidays = GetHolidaysWithFallback(startDate, endDate)
  
  ' 配列内を検索
  For i = 0 To UBound(holidays)
    If holidays(i).HolidayDate = targetDate Then
      IsHoliday = True
      Exit For
    End If
  Next i
End Function

9. エラーハンドリング
堅牢性を高める仕組み
' HTTPリクエストのエラー処理
On Error Resume Next
http.send
On Error GoTo 0

If http.Status = 200 Then
  ' 成功時の処理
Else
  ' 失敗時の処理
  ReDim holidays(0) ' 空の配列を返す
End If

エラーハンドリングのポイント:
  • ネットワークエラーを想定
  • 空の配列を返すことで後続処理の継続を保証
  • ユーザーに適切なメッセージを表示

このコードは、複数のデータソース、文字エンコーディング処理、エラーハンドリングを組み合わせて、実用的で堅牢な祝日取得システムを実現しています。




同じテーマ「Excelリファレンス」の記事

Excelショートカットキー一覧
Excel2003以前のアクセスキー一覧
Excelワークシート関数一覧
Excelワークシート関数一覧(2010以降)
日本の祝日一覧
Google Calendar iCal形式で祝日取得
Excel学習とアプリ
エクセル厳選リンク
エクセル書籍、Excel本
エクセルTechNet情報


新着記事NEW ・・・新着記事一覧を見る

AI×ひらめき ― 「ネタ」が飛躍する創造の増幅プロセス|生成AI活用研究(2025-06-02)
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~|生成AI活用研究(2025-06-02)
究極のVBA転記プロンプト公開!あなたの事務作業を劇的に効率化|生成AI活用研究(2025-06-02)
エクセル入門 4択クイズ|エクセル入門(2025-05-31)
VBA入門 4択クイズ|VBA入門(2025-05-30)
Google Calendar iCal形式で祝日取得|Excelリファレンス(2025-05-30)
生成AIが拓く「もう一人の自分」とパーソナライゼーションの未来|生成AI活用研究(2025-05-30)
生成AIパスポート試験 練習問題(四股択一式)|生成AI活用研究(2025-05-29)
生成AIパスポート試験 キーワード解説|生成AI活用研究(2025-05-29)
AIと『対話』する時代に問う:あなたの前には誰がいますか?|生成AI活用研究(2025-05-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.FILTER関数(範囲をフィルター処理)|エクセル入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ