Excel VBA: не работает переформатирование даты на очень короткую дату с двузначными годами

#vba #excel #date #date-formatting

#vba #excel #Дата #форматирование даты

Вопрос:

У меня есть список дат, экспортированных из другого приложения. Первоначально они форматируются как стандартные, без какого-либо специального или автоматического преобразования, в формате YYYY.MM.DD .

Ранее я просто заменял точки косыми чертами, и Excel распознавал даты как даты, автоматически форматируя их в соответствующий язык DD.MM.YYYY , который работал нормально.

Теперь я просто хотел удалить первые две цифры года (новый формат DD.MM.YY ), но это не работает ни в коем случае, я пробовал. Что я сделал до сих пор:

  • currentCell.Value = CDate(currentCell.Value) : Это переключает формат на дату, но стандартное длинное форматирование по-прежнему применяется.
  • currentCell.NumberFormat = "dd.mm.yy;@" Как видно из записи макроса и изменения значения вручную. Похоже, что формат вывода не имеет никакого значения.
  • currentCell.Value = FormatDateTime(currentCell.Value, vbShortDate) : Не работает, поскольку короткая дата DD.MM.YYYY отсутствует DD.MM.YY в текущем языковом стандарте.
  • format(date, "dd.mm.yy") как было предложено Томом Престоном и msaint: не изменяет выходные данные по сравнению с версией NumberFormat.

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

Что может быть причиной этого и как я могу добиться действительно короткой даты в VBA?

Комментарии:

1. попробуйте CDate(формат (CurrentCell.Value, «dd.mm.yy»))

2. Можете ли вы опубликовать больше кода? Как вы ссылаетесь на ячейки, в частности?

Ответ №1:

Попробуйте format(date, "dd.mm.yy")

Это даст вам ответ в строковом формате, если это приемлемо? Чтобы придать этому некоторый контекст:

 Sub Datings()
    Dim d As Date
    d = Now
    Debug.Print d, Format(d, "dd/mm/yy")
End Sub
  

Комментарии:

1. Спасибо за предложение, к сожалению, оно не работает, все еще 4 цифры. Я обновлю вопрос.

Ответ №2:

Преобразуйте текстовую дату во что-то, что распознается Excel как дата (замените .с помощью /, как вы делали изначально, просто обновите числовой формат в ячейке.

 Sheet1.Range("A1") = Replace(Sheet1.Range("A1"), ".", "/")
Sheet1.Range("A1").NumberFormat = "dd.mm.yy"
  

Ответ №3:

После предложения Тома Престона добавить дополнительный окружающий код, я попробовал пример кода Даррена Бартрупа-Кука в первой ячейке в качестве очень простого теста. Это не сработало, поэтому я использовал точки останова, чтобы пропустить весь код до и после этого фрагмента кода.

Это показало, что все время он работал правильно, но позже другой код изменил форматирование, вызвав Cells(1,1).Value = "" amp; Cells(1,1).Value правильно отформатированные ячейки. Я этого не заметил, потому что в графическом интерфейсе он по-прежнему отображался как Format: Date, хотя внутренне он был перезаписан.


Поэтому полное решение было таким же простым, как использование

 Range("A1:A" amp; lastRow).Replace What:=".", replacement:="/", LookAt:=xlPart
Sheet1.Range("A1:A" amp; lastRow).NumberFormat = "dd.mm.yy"
  

и не касаясь столбца A позже.


Итак, извлеченный урок: используйте много точек останова, чтобы сузить проблему и убедиться, что вы не стреляете себе в ногу позже.

Ответ №4:

Попробуйте это:

 Option Explicit
Sub ReformatDate()
    Dim C As Range
    Dim V As Variant
    For Each C In Selection
        With C.Offset(0, 1)
            .NumberFormat = "dd.mm.yy"
            If IsDate(C) Then
                .Value = C
            Else
                V = Split(C.Text, ".")
                .Value = DateSerial(V(0), V(1), V(2))
            End If
        End With
    Next C
End Sub
  
  • Если ваша система распознает значение как дату, просто переформатируйте
  • Если ваша система НЕ распознает значение как дату, преобразуйте его
    • Разделите его, используя в dot качестве разделителя
    • Преобразуйте части в реальную дату
    • запишите его обратно и отформатируйте соответствующим образом

Вам нужно будет внести соответствующие изменения, если вы хотите, чтобы она перезаписывалась, вместо того, чтобы помещать значение в следующий столбец; и если вы хотите использовать более автоматический метод выбора диапазона для преобразования.