строка даты не распознается "Форматом" или "Cdate" - PullRequest
0 голосов
/ 18 января 2020

Я часами пытался преобразовать эту строку в переменную формата даты, но каждая попытка, похоже, не работает,

вот мой код:

Option Explicit

Sub date()
    Dim m1 As Range
    Dim m As String
    Dim ddate As Date
    Set m1 = Worksheets("dates").Range("A9") 
    'm1 text= "somehting 31-Jan-2019"
    m = Right(m1, 11)
    m = Replace(m, "-", "/") ' "31/Jan/2019
    ddate = CDate(m)

End Sub

в конце «ddate» получает ошибку «типы не совпадают»

Ответы [ 2 ]

0 голосов
/ 18 января 2020
Функция

CDate достаточно умна, чтобы определить формат даты, отделенный от da sh, поэтому нет необходимости заменять его косыми чертами. Если вы извлекаете текст даты, а затем конвертируете его в переменную даты, вы можете делать все, что захотите, с переменной даты. Если вы хотите показать его в другом формате, вам нужно отформатировать ячейку / диапазон перед тем, как вставить туда значение. Поскольку вы не предоставили больше образцов, я взял на себя смелость и добавил функции обрезки, чтобы убедиться, что тексты даты извлекаются правильно:

Option Explicit

Sub ExtractDate()
    Dim s As String
    Dim d As Date

    s = Worksheets("dates").Range("A9").Value
    s = RTrim(s) 'remove the trailing space
    s = Right(s, 11)
    s = LTrim(s) 'remove the leading space
    d = CDate(s)

End Sub

Лучший способ сделать это - использовать массив:

Sub ExtractDate()
    Dim s As String
    Dim arr As Variant
    Dim d As Date

    s = Worksheets("dates").Range("A9").Value
    s = RTrim(s) 'remove the trailing space
    arr = Split(s, " ") 'split by space, so the date segment will be the last element
    s = arr(UBound(arr))
    d = CDate(s)

End Sub

и эта функция также может быть вызвана из рабочего листа:

Function ExtractDate(cell As Range) As Date
    Dim arr As Variant

    arr = Split(RTrim(cell.Value), " ") 'split by space, so the date segment will be the last element
    ExtractDate = CDate(arr(UBound(arr))) 'format cell as date to see in date format

End Function

enter image description here

0 голосов
/ 18 января 2020

Некоторые предложения:

  1. Как сказал BigBen, вы не можете использовать Date в качестве имени процедуры.
  2. Также, как сказал Тим, вы должны знать о ваших региональных настройках (возможно, ваша система на английском языке sh, но сокращенное название месяца на другом языке)
  3. Всегда используйте Option Explicit в верхней части ваших модулей (это предотвращает ошибки, такие как использование переменной, которая не объявляйте и не пишите неправильно.
  4. Попытайтесь назвать ваши переменные так, как вы понимаете позже

С учетом сказанного, я решил это, используя два подхода .

Прочитайте комментарии в каждой альтернативе, чтобы понять, что происходит.

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

Дайте мне знать, если это работает

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