Outlook の予定表に 2013 年以降の祝日を追加するスクリプト


Outlook では祝日の情報は通常の予定アイテムと同様のものであり、予定表のオプションから国を選んで追加する必要があります。
Outlook 2010 以降では 2013 年の祝日がリリース当初から含まれていますが、Outlook 2007 では修正プログラムの適用が必要であり、Outlook 2003 以前では祝日ファイルが提供されていません。
また、Outlook 2007 に修正プログラムを適用したり、Outlook 2007 以前から Outlook 2010 以降にアップグレードしたような場合、それだけでは予定表の祝日は更新されず、改めてインポートする必要があります。

そのため、以前、Outlook の予定表に 2008 年以降の祝日を追加するスクリプトを作ったのですが、このスクリプトでは 2012 年までの祝日が追加されていました。そろそろ 2013 年以降の祝日を追加するスクリプトも必要になるかと思ったので作ってみました。

スクリプトは以下の通りです。下記のスクリプトを AddHoliday.vbs という名前で保存し、ダブルクリックして実行すると、2013 年以降の祝日が Outlook の既定の予定表に追加されます。

' - ここをトリプル クリックするとすべてのコードが選択できます。
'
Option Explicit
Const olFolderCalendars = 9
Const olAppointmentItem = 1
Const olFree = 0
Dim objOutlook
Dim objSession
Dim objCalendar
Dim colEvents
Dim objHoliday
Dim iYear
' Outlook アプリケーション オブジェクトの取得
Set objOutlook = CreateObject("Outlook.Application")
' Namespace オブジェクトの取得
Set objSession = objOutlook.GetNamespace("MAPI")
' 予定表フォルダの取得
Set objCalendar = objSession.GetDefaultFolder(olFolderCalendars)
Set colEvents = objCalendar.Items
' 予定表から 2013 年以降の祝日のみを取得
Set objHoliday = colEvents.Find("[分類項目] = '祝日' AND [開始日] >= '2012/12/31' AND [場所] = '日本'")
' 2013 年以降の祝日を削除
While Not objHoliday Is Nothing
    objHoliday.Delete
    Set objHoliday = colEvents.FindNext
Wend
'
' 2013 年から 2017 年までの祝日を追加
For iYear = 2013 to 2017
    AddNormalHoliday "天皇誕生日", iYear, 12, 23
    AddNormalHoliday "勤労感謝の日", iYear, 11, 23
    AddNormalHoliday "文化の日", iYear, 11, 3
    AddHappyMonday "体育の日", iYear, 10, 2
    AddHappyMonday "敬老の日", iYear, 9, 3
    AddHappyMonday "海の日", iYear, 7, 3
    AddNormalHoliday "こどもの日", iYear, 5, 5
    AddNormalHoliday "みどりの日", iYear, 5, 4
    AddNormalHoliday "憲法記念日", iYear, 5, 3
    AddNormalHoliday "昭和の日", iYear, 4, 29
    AddNormalHoliday "建国記念の日", iYear, 2, 11
    AddHappyMonday "成人の日", iYear, 1, 2
    AddNormalHoliday "元日", iYear, 1, 1
Next
' 日付が一定でない祝日の追加
AddNormalHoliday "春分の日", 2013, 3, 20
AddNormalHoliday "春分の日", 2014, 3, 21
AddNormalHoliday "春分の日", 2015, 3, 21
AddNormalHoliday "春分の日", 2016, 3, 20
AddNormalHoliday "春分の日", 2017, 3, 20
AddNormalHoliday "秋分の日", 2013, 9, 23
AddNormalHoliday "秋分の日", 2014, 9, 23
AddNormalHoliday "国民の休日", 2015, 9, 22
AddNormalHoliday "秋分の日", 2015, 9, 23
AddNormalHoliday "秋分の日", 2016, 9, 22
AddNormalHoliday "秋分の日", 2017, 9, 23
' - ここに祝日を追加します
' AddNormalHoliday "創立記念日", 2008, 8, 28
'
' 振り替え休日を考慮しない祝日の追加
Sub AddHoliday( sName, dtDay )
    Set objHoliday = objOutlook.CreateItem(olAppointmentItem)
    objHoliday.Subject = sName
    objHoliday.Start = dtDay
    objHoliday.AllDayEvent = True
    objHoliday.Categories = "祝日"
    objHoliday.ReminderSet = False
    objHoliday.BusyStatus = olFree
    objHoliday.Location = "日本"
    objHoliday.Save
    Set objHoliday = Nothing
End Sub
'
' ハッピーマンデーの祝日の追加
Sub AddHappyMonday( sName, iYear, iMonth, iMonday )
    Dim iWk
    Dim iDay
    Dim dtDay
    iWk = Weekday(iYear & "/" & iMonth & "/1" )
    If iWk <= 2 Then
        iWk = iWk + 4
    Else
        iWk = iWk - 3
    End If
    iDay = 7 * iMonday - iWk
    AddHoliday sName, iYear & "/" & iMonth & "/" & iDay & " 00:00 AM"
End Sub
'
' 通常 (振り替え休日あり) の祝日の追加
Sub AddNormalHoliday( sName, iYear, iMonth, iDay )
    Dim iWk
    Dim dtSub
    Dim objHoliday
    AddHoliday sName, iYear & "/" & iMonth & "/" & iDay & " 00:00 AM"
    iWk = Weekday( iYear & "/" & iMonth & "/" & iDay )
    If iWk = 1 Then
        dtSub = CDate(iYear & "/" & iMonth & "/" & iDay)
        Do    ' 振替休日が国民の祝日だったら、翌日に繰り越し
            dtSub = DateAdd("d", 1, dtSub)
            Set objHoliday = colEvents.Find("[分類項目] = '祝日' AND [開始日] >= '" & _
                dtSub & " 00:00 AM' AND [終了日] <= '" & DateAdd("d", dtSub, 1) & _
                "' AND [場所] = '日本'")
        Loop While Not objHoliday Is Nothing
        AddHoliday "振替休日 (" & sName & ")", dtSub & " 00:00 AM"
    End If
End Sub

マクロの登録方法やメニューへの追加について

2013/03/09 追記:
Outlook 2003 用の祝日ファイルが下記のリンクより公開されました。
http://support.microsoft.com/kb/2834206/ja

Outlook の予定表に 2013 年以降の祝日を追加するスクリプト」への38件のフィードバック

  1. ふと来年の予定を確認しようとした際に、祝日がわからず本スクリプトにお世話になりました!ありがとうございます。

  2. ありがとうございます!!
    なんだかマイクロソフトが2007以前の祝日データを出さないような記事を見つけたので心配していました。
    本当に助かりました!!

  3. ありがとうございました。本当に助かりました。
    スクリプト知識などない私でも簡単に祝日を追加する事ができました。

    創立記念日を毎年3月1日で登録したいのです。

    2007年12月9日 Outlook の予定表に 2008 年以降の祝日を追加するスクリプトに記載されている
    たとえば、2008/8/28 を創立記念日として追加する場合、
    「’- ここに祝日を追加します」の下に、以下の 1 行を追加します。
    AddHoliday “創立記念日”, “2008/08/28 00:00 AM”

    2012年8月18日 Outlook の予定表に 2013 年以降の祝日を追加するスクリプト
    ‘ – ここに祝日を追加します
    ‘ AddNormalHoliday “創立記念日”, 2008, 3, 1
    を参考に

    AddNormalHoliday “創立記念日”, 2008, 3, 1
    を追記してスクリプト実行しました。
    当然だと思いますが…2008.3.1の予定に創立記念日が追記されました。

    が、毎年、同じ月日に創立記念日を追記したいのです。
    定期的な予定として登録するのが簡単だとは思いますが…

    ‘ 2013 年から 2017 年までの祝日を追加
    For iYear = 2013 to 2017

    AddNormalHoliday “元日”, iYear, 1, 1

    のあとに

    AddNormalHoliday “創立記念日”, iYear, 3, 1
    を追記してスクリプト実行しました。
    2013 年から 2017 年まで登録はされましたが
    2015/03/02 (月)振替休日 (創立記念日)となりました。

    ‘ 振り替え休日を考慮しない祝日の追加
    のあたりをどうにかすればよいでしょうか?

    筋違いの質問かとは存じますが…
    お時間ありまたしら、ご回答頂ければ幸いです。
    よろしくお願い申し上げます。

  4. 早速のご回答ありがとうございます。

    ご回答頂いた下記の記述
    AddHoliday “創立記念日”, iYear & “/03/01 00:00 AM”
    をコピーしてFor ループの中
    AddNormalHoliday “元日”, iYear, 1, 1
    の下の行に貼り付け、上書き保存実行しました。
    が…エラーがでました。

    元々の他の記述と良く見比べてみると…
    【”】と【”】の違いがありました。
    【”】を【”】に変更して下記の記述で上書き保存実行しました。
    AddHoliday “創立記念日”, iYear & “/03/01 00:00 AM”

    創立記念日は振り替え休日を考慮しない祝日として追加されました。

    ありがとうございました。本当に助かりました。

  5. outlook2007への祝日追加を探していたところ、このサイトがヒットしました。実行後のエラーはコメントではみうけられませんが、windowsXP sp3 にてoutlook2007を使用していますが、上記スクリプトを実行すると69行目、.Saveが実行できるようにはなっていません。とエラーが表示されます。どうすればよろしいでしょうか。よろしくお願いいたします。

  6. 実行してもなんのリアクションも無いので失敗したかな?と思ったら、きちんと入っていました。ありがとうございます助かりました。

  7. 素晴らしすぎます。サポート対象外との事で『一つひとつ自分で入れるしかないか』と、思っていたところ‥一瞬で完了しました。

  8. ありがとうございました。本当に助かりました。Outlookの予定表を開いている状態で、オプションから祝日の追加とすると、2012年以前には祝日が2重3重になって反映されてしまいましたが、2007は、2013年以降の祝日は反映されないのですね?全く知識がないもので、素人質問ですみません。 恐る恐るダブルクリックで実行しましたら、2013年の予定表に日本の祝日が反映されました。 日本の祝日以外(アメリカなど)のスクリプトなどはないのでしょうか?

  9. MSのサービスでカバーされてないところ、さっそく使わせていただきました。素晴らしいです、ありがとうございました。

  10. とても便利です。ありがとうございました。

    一つ、可能であれば教えていただきたいのですが、
    プログラムを実行すると、規定の予定表に追加されますが、
    規定の予定表以外に追加することは可能でしょうか。
    例えば、規定の予定表の下位フォルダに「休日」と言う名前の予定表がある時、
    その「休日」予定表に追加は可能でしょうか?

    • 既定の予定表の下の「休日」というフォルダーに追加するには、

      Set objCalendar = objSession.GetDefaultFolder(olFolderCalendars)

      Set objCalendar = objSession.GetDefaultFolder(olFolderCalendars).Folders("休日")

      とします。

      • 早速の返信、ありがとうございました。
        出来ました。
        お陰様で、完璧になりました。

  11. Outlook 2003(SP3)を利用しており,検索でここに行き着き早速デスクトップからAddHoliday.vbsを試してみましたが14行目『Set objOutlook = CreateObject(“Outlook.Application”) 』でエラー(文字:1/エラー:エラーを特定できません/コード:8004005/ソース:(null))が出てしまいました。何か対処方法はありませんでしょうか?

  12. 素晴らしいです。ありがとうございます。
    もしよろしければ、ラベル(色)指定して登録するにはどのように変更すれば良いかご教授頂けませんでしょうか?

    • ラベルということは Outlook 2003 をお使いでしょうか?
      その場合、残念ながら Outlook オブジェクト モデルでは設定できないため、CDO 1.21 を使ってスクリプトを全面的に書き換える必要があります。
      ちょっと検討してみます。

  13. スクリプトご提供、どうもありがとうありがとうございました。
    うまくいきました。助かりました。
    お礼申し上げます。

コメントを残す