日付が土日祝日かを判別するVBA関数

前の記事のスクリプトで祝日データが取得できたので、VBAでそれを利用するサンプルとして日付が土日祝日かを判別する関数を紹介します。
前記事のスクリプトではタブ区切りテキスト形式で出力していましたが、今回はADOで利用しやすいCSV形式を利用します。
前記事のスクリプトをCSV出力に変更するためには、Else以降の部分を以下のものに差し替えます。

Else
  Set objFS = CreateObject("Scripting.FileSystemObject")
  Set objText = objFS.CreateTextFile(OUTPUTFILE)
  Set entrys = xmlDoc.selectNodes("//feed/entry")
    objText.Write("hdate,hname" & VbCr)
  For Each entry In entrys
    objText.Write(Replace(entry.selectSingleNode("gd:when").getAttribute("startTime"), "-", "/"))
    objText.Write("," & entry.selectSingleNode("title").text & VbCr)
  Next
  objText.Close
End If

すでに取得したデータがある場合は、エディタ等でタブを”,”に変更して、一行目に”hdate,hname”という行を追加してください。
例:
hdate,hname
2008/09/23,秋分の日
2008/03/20,春分の日

以下からがVBA関数のソースです。ADOを利用しているので実行にはMicrosoft ActiveX Data Objectsへの参照設定が必要です。
IsHoliday(date)で土日祝日のいずれかならばTrue、それ以外ならFalseを返します。祝日データの場所はそれぞれの環境に合わせて修正してください。

'祝日データの場所設定(ファイルのフォルダパスとファイル名)
Const HOLIDAYDATADIR = "c:¥calendar¥"
Const HOLIDAYDATAFILENAME = "holiday.txt"
'
'入力日が土日祝日かどうかを返す
Public Function IsHoliday(ByVal paramDate As Date) As Boolean
    Dim objRS As Object
    Dim objConn As Object
    '土日ならTrue
    If IsSaturdayorSunday(paramDate) = True Then
        IsHoliday = True
        Exit Function
    End If
    'CSVデータから祝日を検索してレコードがあればTrue
    Set objConn = New ADODB.Connection
    Set objRS = New Recordset
    objConn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & HOLIDAYDATADIR & ";"
    objRS.ActiveConnection = objConn
    objRS.Source = "SELECT * FROM " & HOLIDAYDATAFILENAME & " WHERE hdate LIKE '" & paramDate & "'"
    objRS.Open
    If objRS.EOF Then
        IsHoliday = False
    Else
        IsHoliday = True
    End If
    objRS.Close
    objConn.Close
End Function
'
'入力日が土日かどうかを返す
Public Function IsSaturdayorSunday(ByVal paramDate As Date) As Boolean
    Dim tmpWeekDay As Integer
    tmpWeekDay = Weekday(paramDate)
    If tmpWeekDay = vbSunday Or tmpWeekDay = vbSaturday Then
        IsSaturdayorSunday = True
    Else
        IsSaturdayorSunday = False
    End If
End Function


Google Calendarの祝日データフィードからテキスト生成

休日のお知らせの生成や営業日の自動算出など、祝日のデータが必要になることはよくありますが、カレンダーから手入力というのも何ですので、Googleカレンダーの祝日データフィードから祝日名と日付のみ抽出してテキストにするVBScriptを作ってみました。Dimの部分を修正すればVBAにも応用できます。
なお、Googleカレンダーの祝日データフィードに関してはこちらの記事を参考にさせていただきました。

'Google Calendarから祝日データを取得
Option Explicit
'開始日
Const START_DATE="2008-01-01"
'終了日
Const END_DATE = "2008-12-31"
'保存ファイル名
Const OUTPUTFILE = "holiday.txt"
Dim xmlUrl, xmlDoc, i, entrys, entry, objFS, objText
xmlUrl="http://www.google.com/calendar/feeds/" &_
  "japanese@holiday.calendar.google.com/public/" &_
  "full-noattendees?start-min=" & START_DATE & "&start-max=" & END_DATE
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
If xmlDoc.Load(xmlUrl) = False then
  Msgbox("フィードの読み込みに失敗しました")
Else
  Set objFS = CreateObject("Scripting.FileSystemObject")
  Set objText = objFS.CreateTextFile(OUTPUTFILE)
  Set entrys = xmlDoc.selectNodes("//feed/entry")
  For Each entry In entrys
    objText.Write(Replace(entry.selectSingleNode("gd:when").getAttribute("startTime"), "-", "/"))
    objText.Write(vbTab & entry.selectSingleNode("title").text & VbCr)
  Next
  objText.Close
End If


WSHでのファイルの最終更新日の変更

スクリプト作成の仕事をしていると、WSHからファイルの最終更新日を変更しなくてはならないことが、ごくたま~にですがあります。

ですが、よく使われているFileSystemObjectのDateLastModifiedプロパティは読み取り専用ですので、変更することができません。そのためWSHではファイルの更新日の変更はできないと思われているのですが、実はShellオブジェクト内のModifyDateプロパティを利用すると変更することができます。

この方法、結構前から知られていたと思うんですが、つい最近になって公式サイトに載りました。

 http://technet.microsoft.com/ja-jp/magazine/cc194399.aspx

検索するといくつか出てくる割には書籍とかでは全く扱われていないので、保証外の利用法なのかと思っていましたが、これで安心して利用できます(これまでも使っていましたが)。


    サイト内検索

    プロフィール

  • 顔絵
  • kotani(こたに)

    30台後半になって突然脱サラ。フリーのスクリプト系プログラマーとして独立を目論む謎のおやぢ。東京都在住。趣味は古本屋巡り、文具いぢり、機械いぢり、B級グルメ探索等々多岐にわたる。PCを使う作業に関しては何でもかんでも自動化したがる自動化オタク。