Google Calendar iCal形式で祝日取得
生成AIのClaudeにGoogleカレンダーの祝日情報を取得するVBAを作成してもらいました。
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~
プロンプト
エクセルからVBAでGoogleカレンダーの祝日情報を取得したい。
・VBAで期間を指定する。
・指定期間内の祝日の一覧を取得
・GoogleカレンダーのiCalから取得
・出力は日付の昇順
・参照設定は不要にする(Late Binding)
エラーや正しい結果が得られない場合は、エラーや結果を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コードの解説
1. 基本構造とデータ型
Type HolidayInfo
HolidayDate As Date
HolidayName As String
End Type
配列として使用して複数の祝日を格納
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
- 取得期間を設定
- フォールバック機能付きで祝日データを取得
- Excelシートに結果を出力
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は安定しているが文字エンコーディングが複雑
- どちらかが失敗しても祝日を取得可能
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
- 参照設定(Tools→References)が不要
- 実行時にオブジェクトを作成するため互換性が高い
- CreateObject("MSXML2.XMLHTTP")で動的にHTTPクライアントを作成
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の標準機能では文字化けするため必要な処理
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
- 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
- 1行目はヘッダーのためスキップ
- カンマ区切りで日付と祝日名
- ダブルクォートで文字列を囲む場合がある
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型の比較演算子で日付の大小比較
構造体全体を一時変数で交換
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
- エラーハンドリングでシートの存在確認
- 動的にシート作成または既存シートをクリア
- 自動書式設定と列幅調整
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
' 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入門
- ホーム
- エクセル全般
- Excelリファレンス
- Google Calendar iCal形式で祝日取得
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。