【VBA】DateValueとTimeValue関数で文字列を日時データに変換
DateValue関数とは
VBAのDateValue関数は、文字列で表現された日付をVBAの内部で扱える日付型(Date型)に変換するための関数です。
この関数を利用することで、ユーザーから入力された日付や、外部ソースから取得した日付文字列を、計算や比較が可能な形式に変換することができます。
例えば、"2023/12/31"や"12/31/2023"などの形式の文字列が変換対象となりますが、変換されるフォーマットはシステムのロケール設定に依存します。
正しく認識されない場合はエラーになるので、変換前に文字列の形式を確認することが重要です。
ポイント: DateValue関数は、変換に成功すると時刻部分は自動的に「0:00」(深夜0時)に設定されます。
TimeValue関数とは
TimeValue関数は、文字列で表現された時刻をVBAのDate型の値に変換するための関数です。
この関数を使うと、例えば"14:30:00"のような文字列を時刻情報として扱えるようになり、計算やフォーマット変更が可能となります。
変換後の値は、内部的には日付型として扱われるため、日付部分はシステムで定められた基準日(通常は1899/12/30)になる場合があります。 そのため、純粋に時刻だけを扱いたい場合は、必要に応じて日付部分を切り離して利用することも検討してください。
基本的な使用例
以下に、DateValueとTimeValueを用いた基本的な例を示します。
これらの例は、VBA初心者がそれぞれの関数の動作を理解するのに役立ちます。
日付の変換例
Dim myDate As Date
myDate = DateValue("2023/12/31")
MsgBox "変換された日付は " & Format(myDate, "yyyy/mm/dd")
上記のコードでは、文字列"2023/12/31"がDateValueによって日付型に変換され、MsgBoxに表示されています。
なお、Format関数を用いて日付の表示形式を整えています。
時刻の変換例
Dim myTime As Date
myTime = TimeValue("14:30:00")
MsgBox "変換された時刻は " & Format(myTime, "hh:mm:ss")
この例では、文字列"14:30:00"をTimeValueで変換し、Format関数で時刻形式に整えた上でMsgBoxに表示しています。
複合的な例
日付と時刻をそれぞれ別々に変換し、最終的に1つのDate型変数にまとめることも可能です。
例えば、ユーザーから日付と時刻の入力が別々にあった場合、以下のように処理できます。
Dim inputDate As String Dim inputTime As String Dim combinedDateTime As Date inputDate = "2023/12/31" inputTime = "23:59:59" combinedDateTime = DateValue(inputDate) + TimeValue(inputTime) MsgBox "結合された日付と時刻は " & Format(combinedDateTime, "yyyy/mm/dd hh:mm:ss")
この例では、日付部分と時刻部分を個別に変換し、加算することで1つの日時情報として扱えるようにしています。
VBAでは、Date型は内部的に実数で表現され、整数部分が日付、少数部分が時刻を示すため、加算が可能です。
注意点とヒント
1. 文字列の形式に注意: DateValueやTimeValueはシステムのロケール(地域設定)に依存するため、入力する文字列の形式が期待通りであるか確認しましょう。 例えば、月と日が逆転する形式の場合、誤った日付が生成される可能性があります。
2. エラーハンドリング:
変換できない文字列が入力された場合、エラーが発生するため、事前に入力値のチェックや、On Errorステートメントを用いたエラーハンドリングを行うと良いでしょう。
3. フォーマット関数の活用:
変換後の値は、Format関数を使って任意の形式で表示できます。これにより、ユーザーに分かりやすい形式で日付や時刻を提示することが可能です。
応用例
以下は、Excelのワークシート上に入力された日付および時刻の文字列を読み込み、DateValueとTimeValueで変換し、さらに計算を行う応用例です。
Sub ProcessDateTime()
Dim ws As Worksheet
Dim i As Integer
Dim inputDate As String
Dim inputTime As String
Dim dtValue As Date
Set ws = ThisWorkbook.Sheets("Sheet1")
' シートの2行目から最終行までループ
For i = 2 To ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
inputDate = ws.Cells(i, "A").Value ' A列に日付の文字列が入力されているとする
inputTime = ws.Cells(i, "B").Value ' B列に時刻の文字列が入力されているとする
' 日付と時刻を変換して結合
On Error GoTo ErrorHandler
dtValue = DateValue(inputDate) + TimeValue(inputTime)
ws.Cells(i, "C").Value = dtValue ' 結果をC列に出力
ws.Cells(i, "C").NumberFormat = "yyyy/mm/dd hh:mm:ss"
On Error GoTo 0
Next i
Exit Sub
ErrorHandler:
ws.Cells(i, "C").Value = "変換エラー"
Resume Next
End Sub
この例では、シートのA列とB列にそれぞれ日付と時刻が文字列として入力されていると仮定し、C列に結合した日時情報を出力します。 エラー処理も加えることで、入力ミスなどによる変換エラーに対応しています。
まとめ
VBAのDateValue関数とTimeValue関数は、文字列で表現された日付や時刻を内部的に扱える形式に変換する非常に便利なツールです。
基本的な変換方法を理解し、適切なエラーハンドリングやフォーマット設定を行うことで、日付や時刻に関する様々な処理を効率的に行うことができます。
今回紹介した例や応用例を参考に、実際のプロジェクトでこれらの関数を活用してみてください。 文字列からの変換処理は、ユーザー入力や外部データの取り込み時に非常に役立ちます。