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ワークシート関数一覧
Excelワークシート関数一覧(2010以降)
Excelワークシート関数全一覧(最新版)
エクセル関数辞典 AI版
日本の祝日一覧
Google Calendar iCal形式で祝日取得
Excel学習とアプリ
エクセル厳選リンク
エクセル書籍、Excel本
エクセルTechNet情報


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

カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)


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

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




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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