当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。

テクてく Lotus 技術者 Slack に参加しよう!

2010年3月24日水曜日

ExcelのWorkday関数をLotusScriptで実現してみよう

暑さ寒さも彼岸まで・・・ということわざに反して、今日は寒いですね。
今週いっぱいはこの寒さが続くようですが、週末は晴れるとのことで、お花見ができそうです(筆者は、お酒よりも、純粋に花を愛でるのが好きです)。

そんな話は置いておいて・・・今日もボタンをクリックしてくださいね。
にほんブログ村 IT技術ブログへ
くれぐれも読み逃げはしないように。


さて・・・
昨日は、LotusScriptで@BusinessDaysを実現してみました。
今日は、その派生で、基準となる日付から指定した日数だけ進めた日付はいつなのか?というものを求める関数を実現してみましょう。
ただし、そのままでは@AdjustやNotesDateTimeクラスのAdjustDayメソッドと変わらないので、営業日数分だけ進めた日数を求めるものにします。

この機能、ExcelにはWorkday関数というもので実装されているんですね。
ノーツで実現するとなると、どうすれば良いか・・・
営業日の分だけ進ませればよいので、1日ずつ進めていき、その日が営業日であれば、+1するという簡単なロジックにしました。

独立した関数にしてあるので、うまく組み込んでください。
呼び出し例はこんな感じです。
returnDate = Workday( "2010/03/24", 15, "1,7", "2010/01/01,2010/01/11,2010/02/11,2010/03/23,2010/04/29,2010/05/03,2010/05/04,2010/05/05" )

これを実行すると、戻り値は、[2010/04/14]となります。
Function Workday( baseDate As String, skipDays As Integer, daysToExclude As String, datesToExclude As String ) As Variant
    ' 戻り値 baseDateからskipDays営業日数分、進めた日付を返す
    ' 引数 baseDate 基準日
    ' skipDays 進めたい営業日数
    ' daysToExclude 営業に数えない曜日(1:日曜日、7:土曜日)
    ' datesToExclude 営業日に数えない祝祭日
    ' 注意 skipDaysが0の場合、baseDateを返す
    
    Dim baseDT As NotesDateTime
    Dim cnt As Integer
    Dim wday As String
    
    '基準日と進めたい日数を取得する
    Set baseDT = New NotesDateTime( baseDate )
    
    '営業日だけカウントアップする
    cnt = 0
    Do While skipDays > cnt
        Call baseDT.AdjustDay(1)
        wday = CStr( Weekday( baseDT.DateOnly ) )
        If InStr( daysToExclude, wday ) = 0 Then
            If InStr( datesToExclude, baseDT.DateOnly ) = 0 Then
                cnt = cnt + 1
            End If
        End If
    Loop
    
    'ループを抜けた日付が求めたい日
    Workday = CDat( baseDT.DateOnly )
End Function



【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: