SAK 図書館
VB テクニック編5 - カレンダー計算、通算日、月末日、うるう年、曜日
■SAK 関数利用規程 ・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。 ・著作権明示部分の改編は認めない。 ・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや プログラムを開発することは自由です。 ・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、 その他有償プロダクトとして配布・販売するには、私の許可が必要です。 (無償のフリーソフトウェアなら、自由に配布しても良い。) ・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は 賠償しません。 ■カレンダー計算(通算日、月末日、曜日) (日付計算、日数計算、カレンダー計算、経過日付、万年カレンダー) (うるう年計算、曜日算出、月の最終日) 【使い方】 dim dt as string dim ybnm as string dim days as long dt = "2001.06.00" days = CalcDate(dt, 0, ybnm, "") if days = 0 then msgbox "エラー" msgbox "月末日= " & dt dt = "2001.06.22" days = CalcDate(dt, 0, ybnm, "") if days = 0 then msgbox "エラー" msgbox "通算日= " & days & chr(10) & "日付= " & dt & chr(10) & "曜日= " & ybnm '======================================================================= ' カレンダー計算(通算日、月末日、曜日) '======================================================================= '【引数】 ' dt = 【入出力】西暦年月日("0000.00.00") ' yb = 【戻り値】曜日コード(0 = SUN 〜 6 = SAT) ' ybnm = 【戻り値】ANK 曜日 (Sun 〜 Sat) ' ybjp = 【戻り値】日本語曜日(日曜日 〜 土曜日) '【戻り値】 ' long = 西暦 1 年 1 月 1 日からの通算日 ' 0 = 西暦年月日エラー '【処理】 ' ・西暦年月日に対する通算日、月末日、曜日を求める。 ' ・dt の日が "00" か、その月の月末日をオーバーしていると、月末日を dt ' の 日の部分に返す。 ' ・西暦年月日がエラーのとき、通算日を 0 として返す。 '【著作権】 ' CalcDate() ver 1.00 Copyright (C) 1999 Y.SAK '【履歴】 ' 1999.04.17 sak ver 1.00 新規作成 '======================================================================= Public Function CalcDate(dt As String, yb As Integer, ybnm As String, ybjp As String) As Long Static ybnx(6) As String Static ybjx(6) As String Static init As Boolean ReDim ddmx(12) As Integer Dim yy As Long Dim mm As Integer Dim dd As Integer Dim y1 As Integer Dim y2 As Integer Dim y3 As Integer Dim ur As Integer Dim dy As Long Dim i As Integer Dim rcd As Long '** 初期化 If init = False Then ybnx(0) = "Sun" ybnx(1) = "Mon" ybnx(2) = "Tue" ybnx(3) = "Wed" ybnx(4) = "Thu" ybnx(5) = "Fri" ybnx(6) = "Sat" ybjx(0) = "日曜日" ybjx(1) = "月曜日" ybjx(2) = "火曜日" ybjx(3) = "水曜日" ybjx(4) = "木曜日" ybjx(5) = "金曜日" ybjx(6) = "土曜日" init = True End If ddmx(1) = 31 ddmx(2) = 28 ddmx(3) = 31 ddmx(4) = 30 ddmx(5) = 31 ddmx(6) = 30 ddmx(7) = 31 ddmx(8) = 31 ddmx(9) = 30 ddmx(10) = 31 ddmx(11) = 30 ddmx(12) = 31 '** 日付分割 On Local Error Resume Next yy = Val(Left(dt, 4)) If Err <> 0 Then rcd = Err mm = Val(Mid(dt, 6, 2)) If Err <> 0 Then rcd = Err dd = Val(Right(dt, 2)) If Err <> 0 Then rcd = Err On Local Error GoTo 0 If rcd <> 0 Or yy < 1 Or mm < 1 Or mm > 12 Then yb = 0 ybnm = "" ybjp = "" CalcDate = 0 Exit Function End If '** 月末日算出 If ((yy Mod 4) = 0 And (yy Mod 100) <> 0) Or (yy Mod 400) = 0 Then ddmx(2) = 29 Else ddmx(2) = 28 End If '** 月末日セット If dd > ddmx(mm) Or dd = 0 Then dd = ddmx(mm) dt = Left(dt, 8) + Right("00" + LTrim(Str(dd)), 2) End If '** 日付計算 y1 = (yy - 1) \ 4 y2 = (yy - 1) \ 100 y3 = (yy - 1) \ 400 ur = y1 - y2 + y3 '** 通算日計算 dy = (yy - 1) * 365 + ur + dd For i = 1 To mm - 1 dy = dy + ddmx(i) Next '** 曜日計算 yb = dy Mod 7 '** 曜日セット ybnm = ybnx(yb) ybjp = ybjx(yb) '** 通算日セット CalcDate = dy End Function ■カレンダー計算(西暦年月日、曜日) (日付計算、日数計算、カレンダー計算、経過日付) 【使い方】 dim dt as string dim ybnm as string dim days as long dt = "2001.06.22" days = CalcDate(dt, 0, ybnm, "") if days = 0 then msgbox "エラー" days = days + 14 dt = CalcDays(days, 0, ybnm, "") msgbox "2 週間後= " & dt & chr(10) & "曜日= " & ybnm '======================================================================= ' カレンダー計算(西暦年月日、曜日) '======================================================================= '【引数】 ' days = 西暦 1 年 1 月 1 日からの通算日 ' yb = 【戻り値】曜日コード(0 = SUN 〜 6 = SAT) ' ybnm = 【戻り値】ANK 曜日 (Sun 〜 Sat) ' ybjp = 【戻り値】日本語曜日(日曜日 〜 土曜日) '【戻り値】 ' string = 西暦年月日("0000.00.00") ' "" = 通算日エラー '【処理】 ' ・通算日に対する西暦年月日、曜日を求める。 ' ・通算日が西暦範囲外のとき、"" を返す。 '【著作権】 ' CalcDays() ver 1.00 Copyright (C) 1999 Y.SAK '【履歴】 ' 1999.04.17 sak ver 1.00 新規作成 '======================================================================= Public Function CalcDays(days As Variant, yb As Integer, ybnm As String, ybjp As String) As String Static ybnx(6) As String Static ybjx(6) As String Static init As Boolean ReDim ddmx(12) As Integer Dim yy As Long Dim mm As Integer Dim dd As Integer Dim y1 As Integer Dim y2 As Integer Dim y3 As Integer Dim ur As Integer Dim dy As Long Dim i As Long Dim j As Integer '** 初期化 If init = False Then ybnx(0) = "Sun" ybnx(1) = "Mon" ybnx(2) = "Tue" ybnx(3) = "Wed" ybnx(4) = "Thu" ybnx(5) = "Fri" ybnx(6) = "Sat" ybjx(0) = "日曜日" ybjx(1) = "月曜日" ybjx(2) = "火曜日" ybjx(3) = "水曜日" ybjx(4) = "木曜日" ybjx(5) = "金曜日" ybjx(6) = "土曜日" init = True End If ddmx(1) = 31 ddmx(2) = 28 ddmx(3) = 31 ddmx(4) = 30 ddmx(5) = 31 ddmx(6) = 30 ddmx(7) = 31 ddmx(8) = 31 ddmx(9) = 30 ddmx(10) = 31 ddmx(11) = 30 ddmx(12) = 31 '** 通算日チェック If days < 1 Or days > 3652059 Then yb = 0 ybnm = "" ybjp = "" CalcDays = "" Exit Function End If '** 西暦年計算 i = days \ 365 dy = days Mod 365 i = i + 1 y1 = (i - 1) \ 4 y2 = (i - 1) \ 100 y3 = (i - 1) \ 400 ur = y1 - y2 + y3 Do Until dy > ur i = i - 1 dy = dy + 365 y1 = (i - 1) \ 4 y2 = (i - 1) \ 100 y3 = (i - 1) \ 400 ur = y1 - y2 + y3 Loop yy = i dy = dy - ur '** 月末日算出 If ((yy Mod 4) = 0 And (yy Mod 100) <> 0) Or (yy Mod 400) = 0 Then ddmx(2) = 29 Else ddmx(2) = 28 End If '** 西暦月日計算 i = 1 j = 1 Do Until ddmx(j) >= dy dy = dy - ddmx(j) i = i + 1 j = j + 1 Loop mm = i dd = dy '** 曜日計算 yb = days Mod 7 '** 曜日セット ybnm = ybnx(yb) ybjp = ybjx(yb) '** 西暦年月日セット CalcDays = Format(yy, "0000") + "." + Format(mm, "00") + "." + Format(dd, "00") End Function ■日計算 【使い方】 dim dt as string dt = CalcDD("2001.06.22", -14) msgbox "2 週間前= " & dt '======================================================================= ' 日計算 '======================================================================= '【引数】 ' dt = 日付("0000.00.00") ' days = プラスまたは、マイナス日数 '【戻り値】 ' string = 日付 ' "" = エラー '【処理】 ' ・日計算の結果を返す。 ' ・計算エラーのとき、"" を返す。 '【著作権】 ' CalcDD() ver 1.00 Copyright (C) 1999 Y.SAK '【履歴】 ' 1999.04.17 sak ver 1.00 新規作成 '======================================================================= Public Function CalcDD(dt As Variant, days As Variant) As String Dim s As String Dim yb As Integer Dim ybnm As String Dim ybjp As String '** 日付計算 s = dt CalcDD = CalcDays(CalcDate(s, yb, ybnm, ybjp) + days, yb, ybnm, ybjp) End Function ■月計算 【使い方】 dim dt as string dt = CalcMM("2001.06.22", -12) msgbox "12 ヶ月前= " & dt '======================================================================= ' 月計算 '======================================================================= '【引数】 ' dt = 日付("0000.00.00") ' mms = プラスまたは、マイナス月数 '【戻り値】 ' string = 日付 ' "" = エラー '【処理】 ' ・月計算の結果を返す。 ' ・計算エラーのとき、"" を返す。 '【著作権】 ' CalcMM() ver 1.00 Copyright (C) 1999 Y.SAK '【履歴】 ' 1999.04.17 sak ver 1.00 新規作成 '======================================================================= Public Function CalcMM(dt As Variant, mms As Variant) As String Dim s As String Dim yy As Integer Dim mm As Integer '** 月計算 s = dt yy = Val(Left(s, 4)) mm = Val(Mid(s, 6, 2)) If yy < 1 Or mm < 1 Or mm > 12 Then CalcMM = "" Exit Function End If mm = mm + mms If mm > 12 Then yy = yy + (mm - 1) \ 12 mm = (mm - 1) Mod 12 + 1 End If If mm < 1 Then yy = yy + mm \ 12 - 1 mm = 12 + mm Mod 12 End If If yy < 1 Then yy = 1 If yy > 9999 Then yy = 9999 CalcMM = Format(yy, "0000") + "." + Format(mm, "00") + Right(dt, 3) End Function ■年計算 【使い方】 dim dt as string dt = CalcYY("2001.06.22", 2) msgbox "2 年後= " & dt '======================================================================= ' 年計算 '======================================================================= '【引数】 ' dt = 日付("0000.00.00") ' yys = プラスまたは、マイナス年数 '【戻り値】 ' string = 日付 ' "" = エラー '【処理】 ' ・年計算の結果を返す。 ' ・計算エラーのとき、"" を返す。 '【著作権】 ' CalcYY() ver 1.00 Copyright (C) 1999 Y.SAK '【履歴】 ' 1999.04.17 sak ver 1.00 新規作成 '======================================================================= Public Function CalcYY(dt As Variant, yys As Variant) As String Dim s As String Dim yy As Integer '** 年計算 s = dt If Val(Left(s, 4)) < 1 Then CalcYY = "" Exit Function End If yy = Val(Left(s, 4)) + yys If yy < 1 Then yy = 1 If yy > 9999 Then yy = 9999 CalcYY = Format(yy, "0000") + Right(dt, 6) End Function ■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料