Я написал длинную процедуру в VBA для управления набором данных. Часть этого предполагает использование и форматирование дат, и я не могу заставить его работать правильно.Форматирование даты в Excel VBA
Исходные данные, загружаемые, имеют даты в формате «yyyy-mm-ddThh: mm: ssZ» - например. 2014-12-11T04: 59: 00Z.
Затем я конвертирую их в дату в формате Великобритании «dd/mm/yyyy». Циклируя по всем соответствующим ячейкам, я использую следующий метод:
initial_date = Range("A1").Value
Dim publish_date As Date
publish_date = DateValue(Mid(initial_date,9,2) & "/" & Mid(initial_date,6,2) & "/" & Mid(initial_date,1,4))
Range("A1").Value = publish_date
Это, кажется, работает нормально. Ячейка автоматически меняет формат на «Дата», и когда я вычисляю разницу между этими датами и датами в другом столбце, он отлично работает.
я затем забрать эти даты еще раз и добавить в массив:
feed(1, 8) = Range("A1")
, а затем передать это значение в другой массив:
new_array(7, 1) = feed(1, 8)
Наконец, я ввожу значение из нового массива в другую ячейку. Используя формат даты в Великобритании, я теперь хочу, чтобы это значение отображалось в форме «мм/дд/гггг».
Range("E1") = new_array(7, 1)
Range("E1").NumberFormat = "mm/dd/yyyy"
Здесь все пошло не так.
Выполнение кода, как указано выше, даты отображаются в формате «dd/mm/yyyy». Excel изменяет формат ячеек на «custom». Поиск разницы между этими и другими датами работает, поэтому данные, кажется, хранятся правильно, но не отображаются так, как я хочу.
Если изменить код на
Range("E1") = new_array(7, 1)
Range("E1").NumberFormat = "dd/mm/yyyy"
дата еще не отображается правильно. Даты, которые могут быть записаны любым способом (например, день равен или меньше 12), отображаются правильно, но на самом деле это неправильная дата. то есть 2014-12-11T04: 59: 00Z отображается как 12/11/2014, что я и хочу, но Excel считает, что дата - 12 ноября, а не 11 декабря. Даты, такие как 29/09/2014, которые не могут быть написаны в обоих направлениях круглым дисплеем в британском формате, но не признаны должным образом Excel, который считает, что длинная дата должна быть «29/09/2014» вместо «29 сентября 2014 года».
Когда я полностью удаляю строку форматирования, результаты совпадают.
Прошу прощения за довольно затянувшееся объяснение, но, очевидно, я не понимаю, как Excel и VBA обрабатывают, хранят и форматируют даты. Если бы кто-нибудь мог просветить меня, что случилось, я бы очень признателен!
(Обратите внимание, во всех фрагментах кода выше, где я цитирую например Range("A1")
это стенография. Существует на самом деле намного больше кода вовлечены в цикл и выбора значений, но я знаю, что это работает, так что я не обеспокоен . экстракты выше только демонстрируют, что происходит, для первого значения в каждом цикле.)
Это работает, спасибо. Я не совсем уверен, что понимаю, почему ... Как дата фактически хранится в массиве? – apkdsmith
Он хранится в 'dd/mm/yyyy', поэтому сначала вы должны форматировать ячейку, чтобы принять дату в формате' mm/dd/yyyy', тогда вы отформатируете дату в массиве, который будет выводиться в ячейку, как 'mm/dd/yyyy ' – 2014-09-25 10:45:31
Моя проблема в обратном, мне нужен формат« dd/mm/yyyy ». Я сохранил значение данных в переменной Date с именем 'init_date'. Я проверил тип var с «Debug.Print Month (init_date)», и результат верен в VBA, но когда я копирую var в ячейку Excel, assigmnent терпит неудачу и затем меняет значения месяца и дня. Я прочитал фрагмент @Meehow, но я не работаю для меня. – Trimax