Некоторые предложения:
- Как сказал BigBen, вы не можете использовать
Date
в качестве имени процедуры. - Также, как сказал Тим, вы должны знать о ваших региональных настройках (возможно, ваша система на английском языке sh, но сокращенное название месяца на другом языке)
- Всегда используйте Option Explicit в верхней части ваших модулей (это предотвращает ошибки, такие как использование переменной, которая не объявляйте и не пишите неправильно.
- Попытайтесь назвать ваши переменные так, как вы понимаете позже
С учетом сказанного, я решил это, используя два подхода .
Прочитайте комментарии в каждой альтернативе, чтобы понять, что происходит.
Sub ConvertDateAlternative1()
Dim evalCell As Range
Dim cellValue As String
Dim resultYear As Long
Dim resultMonth As Long
Dim resultDay As Long
Dim resultDate As Date
' Qualify the full location by adding the workbook. In this case Thisworkbook
Set evalCell = ThisWorkbook.Worksheets("dates").Range("A9")
'm1 text= "somehting 31-Jan-2019"
' Alternative 1: if you know the exact location of each part of the date
cellValue = evalCell.Value
resultYear = Right(cellValue, 4)
resultMonth = Month(Mid(cellValue, 14, 3) & " 1, 2000") ' -> Build a date from which VBA understands that Jan is month number 1 (this is sensitive to your regional settings)
resultDay = Mid(cellValue, 11, 2)
resultDate = DateSerial(resultYear, resultMonth, resultDay)
Debug.Print "Date alternative 1: is " & Format(resultDate, "dd/mmm/yyyy")
End Sub
Sub ConvertDateAlternative2()
Dim evalCell As Range
Dim cellValue As String
Dim dateParts() As String ' -> In this case we need an array
Dim resultYear As Long
Dim resultMonth As Long
Dim resultDay As Long
Dim resultDate As Date
' Qualify the full location by adding the workbook. In this case Thisworkbook
Set evalCell = ThisWorkbook.Worksheets("dates").Range("A9")
'm1 text= "somehting 31-Jan-2019"
' Alternative 2: By splitting the last segment of the string (this requires that the date comes after a space in the string)
' In a single step combined a split of the string by spaces Split(evalCell.Value, " ") which returns an array
' And getting the last item in that array, which would be the date segment
cellValue = Split(evalCell.Value, " ")(UBound(Split(evalCell.Value, " ")))
' Now, split the string that looks like a date by "-"
dateParts = Split(cellValue, "-")
' In this order, day is the first item in the array, then comes the month and then the year
resultDay = dateParts(0)
resultMonth = Month(dateParts(1) & " 1, 2000") '-> To this one we apply the same trick as in alternative 1
resultYear = dateParts(2)
resultDate = DateSerial(resultYear, resultMonth, resultDay)
Debug.Print "Date alternative 2: is " & Format(resultDate, "dd/mmm/yyyy")
End Sub
Дайте мне знать, если это работает