2014-09-25 7 views
1

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

ответ

1

попробовать

Range("E1").NumberFormat = "mm/dd/yyyy" 
Range("E1") = Format(new_array(7, 1), "mm/dd/yyyy") 
+0

Это работает, спасибо. Я не совсем уверен, что понимаю, почему ... Как дата фактически хранится в массиве? – apkdsmith

+0

Он хранится в 'dd/mm/yyyy', поэтому сначала вы должны форматировать ячейку, чтобы принять дату в формате' mm/dd/yyyy', тогда вы отформатируете дату в массиве, который будет выводиться в ячейку, как 'mm/dd/yyyy ' – 2014-09-25 10:45:31

+0

Моя проблема в обратном, мне нужен формат« dd/mm/yyyy ». Я сохранил значение данных в переменной Date с именем 'init_date'. Я проверил тип var с «Debug.Print Month (init_date)», и результат верен в VBA, но когда я копирую var в ячейку Excel, assigmnent терпит неудачу и затем меняет значения месяца и дня. Я прочитал фрагмент @Meehow, но я не работаю для меня. – Trimax

Смежные вопросы