サーチ…


カレンダー

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

NowTime関数は秒単位でしか正確でないため、 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()関数で定義された間隔のいずれかを指定できます
  • date1date2は、計算に使用する2つの日付です
  • firstdayofweekfirstweekofearはオプションです。説明については、 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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow