サーチ…
カレンダー
VBAは2カレンダーをサポートしています: グレゴリオ暦とヒジリ
Calendar
プロパティは、現在のカレンダーを変更または表示するために使用されます。
カレンダーの2つの値は次のとおりです。
値 | 定数 | 説明 |
---|---|---|
0 | vbCalGreg | グレゴリオ暦(デフォルト) |
1 | vbCalHijri | ヒジュリカレンダー |
例
Sub CalendarExample()
'Cache the current setting.
Dim Cached As Integer
Cached = Calendar
' Dates in Gregorian Calendar
Calendar = vbCalGreg
Dim Sample As Date
'Create sample date of 2016-07-28
Sample = DateSerial(2016, 7, 28)
Debug.Print "Current Calendar : " & Calendar
Debug.Print "SampleDate = " & Format$(Sample, "yyyy-mm-dd")
' Date in Hijri Calendar
Calendar = vbCalHijri
Debug.Print "Current Calendar : " & Calendar
Debug.Print "SampleDate = " & Format$(Sample, "yyyy-mm-dd")
'Reset VBA to cached value.
Cached = Calendar
End Sub
このSubは以下を出力します。
Current Calendar : 0
SampleDate = 2016-07-28
Current Calendar : 1
SampleDate = 1437-10-23
基本機能
システム日付時刻の取得
VBAは、システムの時計から日付および/または時刻を取得するための3つの組み込み関数をサポートしています。
関数 | 戻り値の型 | 戻り値 |
---|---|---|
今 | 日付 | 現在の日付と時刻を返します。 |
日付 | 日付 | 現在の日付と時刻の日付部分を返します。 |
時間 | 日付 | 現在の日付と時刻の時刻部分を返します。 |
Sub DateTimeExample()
' -----------------------------------------------------
' Note : EU system with default date format DD/MM/YYYY
' -----------------------------------------------------
Debug.Print Now ' prints 28/07/2016 10:16:01 (output below assumes this date and time)
Debug.Print Date ' prints 28/07/2016
Debug.Print Time ' prints 10:16:01
' Apply a custom format to the current date or time
Debug.Print Format$(Now, "dd mmmm yyyy hh:nn") ' prints 28 July 2016 10:16
Debug.Print Format$(Date, "yyyy-mm-dd") ' prints 2016-07-28
Debug.Print Format$(Time, "hh") & " hour " & _
Format$(Time, "nn") & " min " & _
Format$(Time, "ss") & " sec " ' prints 10 hour 16 min 01 sec
End Sub
タイマ機能
Timer
関数は、深夜から経過した秒数を表すSingleを返します。精度は100分の1秒です。
Sub TimerExample()
Debug.Print Time ' prints 10:36:31 (time at execution)
Debug.Print Timer ' prints 38191,13 (seconds since midnight)
End Sub
Now
とTime
関数は秒単位でしか正確でないため、 Timer
は時間測定の精度を向上させる便利な方法を提供します。
Sub GetBenchmark()
Dim StartTime As Single
StartTime = Timer 'Store the current Time
Dim i As Long
Dim temp As String
For i = 1 To 1000000 'See how long it takes Left$ to execute 1,000,000 times
temp = Left$("Text", 2)
Next i
Dim Elapsed As Single
Elapsed = Timer - StartTime
Debug.Print "Code completed in " & CInt(Elapsed * 1000) & " ms"
End Sub
IsDate()
IsDate()は、式が有効な日付かどうかをテストします。 Boolean
返します。
Sub IsDateExamples()
Dim anything As Variant
anything = "September 11, 2001"
Debug.Print IsDate(anything) 'Prints True
anything = #9/11/2001#
Debug.Print IsDate(anything) 'Prints True
anything = "just a string"
Debug.Print IsDate(anything) 'Prints False
anything = vbNull
Debug.Print IsDate(anything) 'Prints False
End Sub
抽出関数
これらの関数は、 Date
キャストして日付または時刻の一部を表すInteger
を返すVariant
をとります。パラメータをDate
にキャストできない場合は、実行時エラー13:型の不一致が発生します。
関数 | 説明 | 戻り値 |
---|---|---|
年() | 日付引数の年の部分を返します。 | 整数(100〜9999) |
月() | 日付引数の月の部分を返します。 | 整数(1〜12) |
日() | 日付引数の日の部分を返します。 | 整数(1〜31) |
平日() | 日付引数の曜日を返します。第1曜日を定義するオプションの第2引数を受け入れる | 整数(1〜7) |
時間() | 日付引数の時間部分を返します。 | 整数(0〜23) |
分() | 日付引数の分を返します。 | 整数(0〜59) |
2番目の() | 日付引数の2番目の部分を返します。 | 整数(0〜59) |
例:
Sub ExtractionExamples()
Dim MyDate As Date
MyDate = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)
Debug.Print Format$(MyDate, "yyyy-mm-dd hh:nn:ss") ' prints 2016-07-28 12:34:56
Debug.Print Year(MyDate) ' prints 2016
Debug.Print Month(MyDate) ' prints 7
Debug.Print Day(MyDate) ' prints 28
Debug.Print Hour(MyDate) ' prints 12
Debug.Print Minute(MyDate) ' prints 34
Debug.Print Second(MyDate) ' prints 56
Debug.Print Weekday(MyDate) ' prints 5
'Varies by locale - i.e. will print 4 in the EU and 5 in the US
Debug.Print Weekday(MyDate, vbUseSystemDayOfWeek)
Debug.Print Weekday(MyDate, vbMonday) ' prints 4
Debug.Print Weekday(MyDate, vbSunday) ' prints 5
End Sub
DatePart()関数
DatePart()
は、日付の一部を返す関数ですが、別の方法で動作し、上記の関数よりも多くの可能性を可能にします。たとえば、四半期や年の週を返すことができます。
構文:
DatePart ( interval, date [, firstdayofweek] [, firstweekofyear] )
interval引数は次のいずれかです。
間隔 | 説明 |
---|---|
"yyyy" | 年(100〜9999) |
"y" | 1日(1〜366日) |
"m" | 月(1〜12) |
"q" | 四半期(1〜4) |
"ww" | 週(1〜53) |
"w" | 曜日(1〜7) |
"d" | 月の日(1〜31) |
"h" | 時間(0〜23) |
"n" | 分(0〜59) |
"s" | 秒(0〜59) |
firstdayofweekはオプションです。これは週の最初の曜日を指定する定数です。指定されていない場合、 vbSunday
が仮定されます。
1年目はオプションです。それは年の最初の週を指定する定数です。指定しない場合、最初の週は1月1日が発生する週とみなされます。
例:
Sub DatePartExample()
Dim MyDate As Date
MyDate = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)
Debug.Print Format$(MyDate, "yyyy-mm-dd hh:nn:ss") ' prints 2016-07-28 12:34:56
Debug.Print DatePart("yyyy", MyDate) ' prints 2016
Debug.Print DatePart("y", MyDate) ' prints 210
Debug.Print DatePart("h", MyDate) ' prints 12
Debug.Print DatePart("Q", MyDate) ' prints 3
Debug.Print DatePart("w", MyDate) ' prints 5
Debug.Print DatePart("ww", MyDate) ' prints 31
End Sub
計算機能
DateDiff()
DateDiff()
は、指定された2つの日付間の時間間隔の数を表すLong
を返します。
構文
DateDiff ( interval, date1, date2 [, firstdayofweek] [, firstweekofyear] )
- intervalには、
DatePart()
関数で定義された間隔のいずれかを指定できます - date1とdate2は、計算に使用する2つの日付です
- firstdayofweekとfirstweekofearはオプションです。説明については、
DatePart()
関数を参照してください。
例
Sub DateDiffExamples()
' Check to see if 2016 is a leap year.
Dim NumberOfDays As Long
NumberOfDays = DateDiff("d", #1/1/2016#, #1/1/2017#)
If NumberOfDays = 366 Then
Debug.Print "2016 is a leap year." 'This will output.
End If
' Number of seconds in a day
Dim StartTime As Date
Dim EndTime As Date
StartTime = TimeSerial(0, 0, 0)
EndTime = TimeSerial(24, 0, 0)
Debug.Print DateDiff("s", StartTime, EndTime) 'prints 86400
End Sub
DateAdd()
DateAdd()
は、指定された日付または時間間隔が追加されたDate
を返します。
構文
DateAdd ( interval, number, date )
- intervalには、
DatePart()
関数で定義された間隔のいずれかを指定できます - number追加する間隔の数である数値式。それは肯定的(将来的に日付を得ること)または否定的に(過去の日付を得るために)行うことができます。
- 日付は 、
Date
の間隔が付加されたまたはリテラル表す日付
例:
Sub DateAddExamples()
Dim Sample As Date
'Create sample date and time of 2016-07-28 12:34:56
Sample = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)
' Date 5 months previously (prints 2016-02-28):
Debug.Print Format$(DateAdd("m", -5, Sample), "yyyy-mm-dd")
' Date 10 months previously (prints 2015-09-28):
Debug.Print Format$(DateAdd("m", -10, Sample), "yyyy-mm-dd")
' Date in 8 months (prints 2017-03-28):
Debug.Print Format$(DateAdd("m", 8, Sample), "yyyy-mm-dd")
' Date/Time 18 hours previously (prints 2016-07-27 18:34:56):
Debug.Print Format$(DateAdd("h", -18, Sample), "yyyy-mm-dd hh:nn:ss")
' Date/Time in 36 hours (prints 2016-07-30 00:34:56):
Debug.Print Format$(DateAdd("h", 36, Sample), "yyyy-mm-dd hh:nn:ss")
End Sub
変換と創造
CDate()
CDate()
何かのデータ型から何かをDate
データ型に変換します。
Sub CDateExamples()
Dim sample As Date
' Converts a String representing a date and time to a Date
sample = CDate("September 11, 2001 12:34")
Debug.Print Format$(sample, "yyyy-mm-dd hh:nn:ss") ' prints 2001-09-11 12:34:00
' Converts a String containing a date to a Date
sample = CDate("September 11, 2001")
Debug.Print Format$(sample, "yyyy-mm-dd hh:nn:ss") ' prints 2001-09-11 00:00:00
' Converts a String containing a time to a Date
sample = CDate("12:34:56")
Debug.Print Hour(sample) ' prints 12
Debug.Print Minute(sample) ' prints 34
Debug.Print Second(sample) ' prints 56
' Find the 10000th day from the epoch date of 1899-12-31
sample = CDate(10000)
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 1927-05-18
End Sub
VBAには、厳密に型指定されたDate
代わりに日付型のVariant
返す以外に、 CDate()
関数と同じ方法で機能する緩やかな型付きCVDate()
もあります。 Date
パラメータに渡すかDate
変数に代入するときはCDate()
バージョンを優先し、 Variant
パラメータに渡すかVariant
変数に代入するときはCVDate()
バージョンを優先する必要があります。これにより、暗黙の型キャストが回避されます。
DateSerial()
DateSerial()
関数を使用して日付を作成します。指定した年、月、 Date
を返します。
構文:
DateSerial ( year, month, day )
年、月、日の引数が有効な整数である(年は100から9999、月は1から12、日は1から31)。
例
Sub DateSerialExamples()
' Build a specific date
Dim sample As Date
sample = DateSerial(2001, 9, 11)
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 2001-09-11
' Find the first day of the month for a date.
sample = DateSerial(Year(sample), Month(sample), 1)
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 2001-09-11
' Find the last day of the previous month.
sample = DateSerial(Year(sample), Month(sample), 1) - 1
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 2001-09-11
End Sub
DateSerial()
は "無効な"日付を受け取り、そこから有効な日付を計算することに注意してください。これは創造的に良いものとして使うことができます:
ポジティブな例
Sub GoodDateSerialExample()
'Calculate 45 days from today
Dim today As Date
today = DateSerial (2001, 9, 11)
Dim futureDate As Date
futureDate = DateSerial(Year(today), Month(today), Day(today) + 45)
Debug.Print Format$(futureDate, "yyyy-mm-dd") 'prints 2009-10-26
End Sub
しかし、妥当性のないユーザー入力から日付を作成しようとすると、悲しみを引き起こす可能性がより高くなります。
負の例
Sub BadDateSerialExample()
'Allow user to enter unvalidate date information
Dim myYear As Long
myYear = InputBox("Enter Year")
'Assume user enters 2009
Dim myMonth As Long
myMonth = InputBox("Enter Month")
'Assume user enters 2
Dim myDay As Long
myDay = InputBox("Enter Day")
'Assume user enters 31
Debug.Print Format$(DateSerial(myYear, myMonth, myDay), "yyyy-mm-dd")
'prints 2009-03-03
End Sub