Функция обрезки вызывает изменение формата даты

Во-первых, важно отметить, что я нахожусь в Великобритании, поэтому стандартный формат даты - дд / мм / гггг

В А1 у меня дата: 05.05.2017 (дд / мм / гггг)

Я могу подтвердить это в ближайшем окне:

?CLng(Range("A1").Value)
42857

Теперь, если я сделаю следующее:

Range("A1").Value = Range("A1").Value

Вы, вероятно, можете догадаться, ничего не происходит - дата по-прежнему 02/05/2017 и числовое значение по-прежнему 42857

Но если я использую отделку с этим:

Range("A1").Value = Trim(Range("A1").Value)

Дата изменена на 05.02.2017. Это не просто форматирование - числовое значение также изменилось на 42771.


Что это о Trim() метод, который заставляет дату считываться в формате США и затем преобразовываться обратно в формат Великобритании с новым значением даты? Это ошибка?

2 ответа

Решение

Из обсуждения в комментариях:

Формат по умолчанию или "токен" в VBA (не в самом Excel, как правильно заметил Macro Man) - американский английский - независимо от региональных настроек или форматирования ячейки.

Когда вы выполняете текстовые функции VBA для даты, выходные данные этих функций представлены в текстовом формате. Итак, результат Trim(Range("A1").Value) это строка Эта строка напоминает правильную дату в США, поэтому, когда вы вставляете ее в ячейку, Excel распознает ее как дату в США.

Так что два неявных преобразования происходят. Первое происходит, когда вы читаете содержимое ячейки и передаете его trim(): date-> преобразование текста; второе происходит, когда вы записываете его обратно в ячейку Excel: преобразование текста -> даты. Второе преобразование не имеет информации о формате, поэтому оно предполагает использование английского языка в США.

(Вы должны быть в состоянии достичь того же результата с любой текстовой функцией, а не только trim().)

Я обнаружил, что если вы добавите "'" перед датой, дата не изменится. Диапазон ("A1"). Значение = "'"&Trim(Диапазон ("A1"). Значение)

Другие вопросы по тегам