2

次のパターンで文字列から日付/時刻を抽出し、Access で日付型に変換しようとしています。

  1. "2012 年 4 月 8 日 21:26:49"

  2. 「...2012 年 4 月 2 日午前 11 時 11 分 01 秒にスミス、MD、ジョン (123) によって確認されました。」

誰でも助けることができますか?

4

3 に答える 3

1

ロメオが彼の答え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
于 2012-05-01T10:52:26.153 に答える
1

これを試して

    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 )(.*?)(?=\;)
于 2012-05-01T00:09:10.657 に答える
0

この関数を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()、たとえばを使用してそれらを再構築する必要があります。

于 2012-05-01T12:16:59.933 に答える