次のパターンで文字列から日付/時刻を抽出し、Access で日付型に変換しようとしています。
"2012 年 4 月 8 日 21:26:49"
「...2012 年 4 月 2 日午前 11 時 11 分 01 秒にスミス、MD、ジョン (123) によって確認されました。」
誰でも助けることができますか?
ロメオが彼の答えCDate()
ですでに述べたように、有効な日付値を持つ文字列をDate
変数に変換するために使用する必要があります。
次のように、文字列から日付の値を取得できます:
(文字列が常に例のように見える場合、日付の前に " on " (空白あり)、その後に ";" があります):
Public Function Test()
Dim Source As String
Dim Tmp As String
Dim DateStart As Integer
Dim DateEnd As Integer
Dim DateValue As Date
Source = "...Confirmed by SMITH, MD, JOHN (123) on 4/2/2012 11:11:01 AM;"
'find the place in the source string where " on " ends
DateStart = InStr(1, Source, " on ") + 4
'find first semicolon after the date)
DateEnd = InStr(DateStart, Source, ";")
'get the part with the date
Tmp = Mid(Source, DateStart, DateEnd - DateStart)
'convert to date
DateValue = CDate(Tmp)
End Function
これを試して
Dim d As Date
d = CDate("08-Apr-2012 21:26:49")
Debug.Print Format(d, "dd-MMM-yyyy")
Debug.Print Format(d, "h:m:s")
あげる
08-Apr-2012
21:26:49
この正規表現を使用して、" on " (つまり、スペース オン スペース) と ";" の間の日時を取得します。(その後の最初のセミコロン)。
(?<=\ on )(.*?)(?=\;)
この関数をVBAモジュールに追加します。
' ----------------------------------------------------------------------'
' Return a Date object or Null if no date could be extracted '
' ----------------------------------------------------------------------'
Public Function ExtractDate(value As Variant) As Variant
If IsNull(value) Then
ExtractDate = Null
Exit Function
End If
' Using a static, we avoid re-creating the same regex object for every call '
Static regex As Object
' Initialise the Regex object '
If regex Is Nothing Then
Set regex = CreateObject("vbscript.regexp")
With regex
.Global = True
.IgnoreCase = True
.MultiLine = True
.pattern = "(\d+\/\d+/\d+\s+\d+:\d+:\d+\s+\w+|\d+-\w+-\d+\s+\d+:\d+:\d+)"
End With
End If
' Test the value against the pattern '
Dim matches As Object
Set matches = regex.Execute(value)
If matches.count > 0 Then
' Convert the match to a Date if we can '
ExtractDate = CDate(matches(0).value)
Else
' No match found, jsut return Null '
ExtractDate = Null
End If
End Function
そして、たとえばクエリで次のように使用します。
SELECT ID, LogData, ExtractDate(LogData) as LogDate
FROM MyLog
返される日付が適切な形式であり、意味があることを確認してください。
CDate()
ロケールに応じて、日付文字列をさまざまな方法で解釈します。
目的の結果が得られない場合は、コードを変更して日付の個々のコンポーネントを分離しDateSerial()
、たとえばを使用してそれらを再構築する必要があります。