#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
качестве разделителя - Преобразуйте части в реальную дату
- запишите его обратно и отформатируйте соответствующим образом
- Разделите его, используя в
Вам нужно будет внести соответствующие изменения, если вы хотите, чтобы она перезаписывалась, вместо того, чтобы помещать значение в следующий столбец; и если вы хотите использовать более автоматический метод выбора диапазона для преобразования.