Преобразование ddmmmyyyy в число с помощью vba - PullRequest
0 голосов
/ 31 мая 2018

У меня есть ячейка, которая содержит немного информации и включает в себя дату в формате ddmmmyy (вроде «16dec 21 hello»).Мне нужно сгенерировать электронное письмо, в котором в какой-то части письма указана дата, но в числовой форме (т. Е. 16122021, поэтому ddmmyyyy).Я попытался сначала извлечь дату с помощью функции left (), а затем попытаться преобразовать ее в данные с помощью .numbertype = "ddmmyyyy" и функции cdate, но, похоже, это не работает.Ниже мой код:

'Getting date
Dim expdt As Date
Dim dt As String
dt = Left(Range("A8").Value, 8)
expdt = CDate("dt")

[печать 00:00:00]

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Или у вас могут быть следующие две функции на стандартном модуле, таком как Module1, и затем получить дату в формате ddmmyyyy, как показано в тестовом макросе.

Function GetDate(str As String) As String
Dim dtStr As String, m As Long
With CreateObject("VBScript.RegExp")
   .Global = False
   .Pattern = "\d{1,2}\s?[a-zA-Z]{3}\s?\d{2}"
    If .Test(str) Then
        dtStr = .Execute(str)(0)
        m = GetMonth(dtStr)
        If m > 0 Then
            GetDate = Left(dtStr, 2) & m & Right(dtStr, 2)
        End If
    End If
End With
End Function

Function GetMonth(str As String) As Long
Dim m
With CreateObject("VBScript.RegExp")
   .Global = False
   .Pattern = "[a-zA-Z]{3}"
    If .Test(str) Then
        m = DateValue(.Execute(str)(0) & "-1-2018")
        If Not IsError(m) Then GetMonth = Month(m)
    End If
End With
End Function

И затем вы можете извлечь дату изстрока в желаемом формате даты, как показано ниже ...

Sub Test()
MsgBox GetDate("16dec 21 hello")
'OR
MsgBox GetDate(Range("A8").Value)
End Sub
0 голосов
/ 31 мая 2018

Попробуй,

Dim expdt As Date
Dim dt As String

'your sample had a space between Dec and 21
dt = Left(Range("A8").Value2, 2) & "-" & mid(replace(Range("A8").Value2, chr(32), chr(45)), 3, 6)
expdt = datevalue(dt)
debug.print expdt 
0 голосов
/ 31 мая 2018

Если оставить в стороне тот факт, что у вас есть опечатка - вы хотели, чтобы CDate(dt) - CDate не не поддерживали сокращенные названия месяцев.Так что вам нужно написать код от руки.Вот такой фрагмент:

Public Function fConvertDate(strDate As String) As Date
Dim bytDay As Byte
Dim intYear As Integer
Dim strMonth As String
Dim bytMonth As Byte

bytDay = Val(Left$(strDate, 2))
intYear = CInt(Mid$(strDate, 6, 4))
strMonth = UCase$(Mid$(strDate, 3, 3))

bytMonth = Val(Switch(strMonth = "JAN", "1", strMonth = "FEB", "2", strMonth = "MAR", "3", _
               strMonth = "APR", "4", strMonth = "MAY", "5", strMonth = "JUN", "6", strMonth = "JUL", "7", _
               strMonth = "AUG", "8", strMonth = "SEP", "9", strMonth = "OCT", "10", strMonth = "NOV", "11", _
               strMonth = "DEC", "12"))

fConvertDate = DateSerial(intYear, bytMonth, bytDay)
End Function

Код взят из https://bytes.com/topic/access/answers/969310-how-convert-text-ddmmmyyyy-format-date.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...