Данные не изменяются правильно в VBA, показывая #### - PullRequest
0 голосов
/ 13 июля 2020

У меня есть даты, которые я извлек из набора данных JSON в форме (2017-04-03T15: 36: 45.000 + 0000), и я превращаю их в форму (дд / мм / гг), это это код, который у меня есть до сих пор.

ActiveSheet.Cells(5) = Date
For i = 1 to Json("issues").Count
    Dim date_thing As String, date_part As String, finD As Date
    date_thing =  Json("issues")(i)("fields")("resolutiondate")

    date_part = Split (date_thing, "T")(0)
    finD = DateSerial(Split(date_part, "-")(0), Split(date_part, "-")(2), 
    Split(date_part, "-")(1))
    
    ActiveSheet.Cells(i+1, 5) = finD
    ActiveSheet.Cells(i+1, 5).NumberFormat = "dd/mm/yy" 
Next i

По какой-то причине две даты не форматируются правильно и просто выводятся как «#######». Это "2020-06-12T23: 44: 00.000 + 0000" и "2020-04-10T21: 37: 31.000 + 0000" . Что могло быть не так?

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Не хочу красть ответ FaneDurus, но слишком много, чтобы вставить комментарий.

Итак, ваша задача - преобразовать String в Date. Date хранится как число (double) внутри, и у вас есть много возможностей отформатировать его как угодно, вычислить с его помощью и т. Д.

Итак, String вы получите что-то вроде "2020-05-28T21:13:01.000+0000". Важно помнить, что технически это String, а не Date. Excel хорошо угадывает дату из строки, но не может творить чудеса, поэтому, чтобы убедиться, что вы находитесь на стороне сохранения, разделите строку самостоятельно, используя String functions.

Есть много способов сделать Итак, но я думаю, что самый простой способ - использовать команду Split (как это сделал FaneDuru). Первый шаг - разделить Date и Time часть, вы уже это сделали:

dateTimeParts = Split(date_thing, "T")

Теперь у нас есть массив с 2 элементами, первый ( index = 0) имеет "2020-05-28", а второй (index = 1) имеет "21:13:01.000+0000". Следующим шагом будет разделение даты на год, месяц и день. Они разделены da sh, поэтому мы используем

Dim dateParts() as string
dateParts = split(dateTimeParts(0), "-")

Теперь у вас есть 3 строки в dateParts, одна содержит год, одну месяц и одну день. Следующая задача - создать реальный Date из этих 3 частей, и VBA предоставляет для этого функцию DateSerial: он создает дату из 3 чисел. Вы можете кормить его тремя строками, которые есть в dateParts, но это все еще строки. VBA попытается преобразовать их, но лучше записать это в коде - неявное преобразование является источником многих ошибок. Для лучшей читаемости я использую три промежуточные переменные, это дело вкуса, но я предпочитаю не помещать много операций в одну строку. CLng преобразует String в Long:

Dim day as long, month as long, year as long, finalDate as Date
year = CLng(dateParts(0))
month = CLng(dateParts(1))
day = CLng(dateParts(2))
finalDate = dateSerial(year, month, day)

Теперь вы хотите записать дату в ячейку, и она должна отображаться в форме «ДД / ММ / ГГ» . Не конвертируйте драгоценный Date обратно в строку (как это сделала бы функция Format). Вместо этого запишите значение даты в ячейку и отформатируйте ячейку так, чтобы дата отображалась так, как вы хотите. Я предполагаю, что ActiveCell, адаптируйте его к любой ячейке, которая вам нужна, но, пожалуйста, не используйте Select для установки ActiveCell).

Activecell.Value = finalDate
Activecell.NumberFormat = "dd/mm/yy"

Таким образом, вы можете изменить формат ячейку позже (например, используйте 4-значную дату) без проблем или измените формат на тот, в котором записывается название дня или месяца. При этом изменяется только способ отображения даты - само значение даты остается неизменным.

0 голосов
/ 13 июля 2020

Имея дело только со строками, когда вы пытаетесь форматировать, Excel только угадывает, какой день и месяц ... Я думаю, вы должны сказать ему, что это за каждая из них. Попробуйте, пожалуйста, следующий подход:

Dim d As String, date_part As String, finD As Date
   d = "2020-06-12T23:44:00.000+0000" 'only for testing reason. You use Json...
   date_part = Split(d, "T")(0)
   finD = DateSerial(Split(date_part, "-")(0), Split(date_part, "-")(2), Split(date_part, "-")(1))
   Debug.Print Format(finD, "dd/mm/yy")
   ActiveSheet.Cells(i+1, 5).value = finD
   ActiveSheet.Cells(i+1, 5).NumberFormat = "dd/mm/yy"

Я не понял, какой у вас месяц и день. Если он не вернет то, что вам нужно, просто замените средний термин последним ...

Таким образом, Excel больше не должен угадывать. Он всегда будет считать, что второй член - это месяц / день, как вы ему «указываете».

...