Excel VBA: Даты отображаются в виде текста, даже если установлен формат даты

Vba
Вопрос: Excel 2010 Pro. У меня странная проблема форматирования. Он работает нормально в Америке, но не после того, как я запускаю код в Австрии. В Австрии он игнорирует мое форматирование даты и времени. Я не могу изменить его после этого, даже вручную. Посмотрите, как я могу попробовать разные форматы, образец вверху не меняется? Важно, чтобы

Вопрос:

Excel 2010 Pro.

У меня странная проблема форматирования.

Он работает нормально в Америке, но не после того, как я запускаю код в Австрии. В Австрии он игнорирует мое форматирование даты и времени. Я не могу изменить его после этого, даже вручную. Посмотрите, как я могу попробовать разные форматы, образец вверху не меняется?

Важно, чтобы значение ячейки включало всю дату и время, но для использования желаемых форматов времени и даты.

Обновлено 14Nov13: Проблема описана на других сайтах с идеей, что дата каким-то образом “застревает как текст” и не может быть переформатирована ни к чему другому. Одно из предложений заключалось в том, чтобы сделать что-то математическое для ячейки, чтобы вернуть его обратно в нетекстовый текст. (Идея: range.value = cdate (range.value) + 0) Я внимательно посмотрел на свою камеру в Австрии и заметил, что между датой и временем есть два пробела, например 14.11.2013 15:22:19. В одном случае я удалил одно из пространств, и он щелкнул в формате, который я хотел (14-NOV-13). Однако я не смог повторить это и должен будет выяснить, как сделать что-то программно. Я еще не уверен в правильном решении. Вероятно, это связано с циклическим использованием всех ячеек даты после того, как я вставлю свой вариантный массив и как-то исправлю их.

BAD (Австрия)

The Sample Won't Change Even if I Select DIfferent Formats

ХОРОШО (Америка)

enter image description here

БОЛЬШЕ ДЕТАЛИ: В моем приложении я пишу дату в две ячейки через массив, а затем отформатируйте их, используя один из двух настраиваемых форматов даты. Форматирование ячейки правильное, когда я проверяю его. Когда я смотрю на рабочий лист в Америке, это правильно:

  • A1 показывает 01-DEC-13 ‘Английский
  • В2 показывает 15:23

Затем я копирую XLSM на сервер в Австрии и открываю его. Это выглядит правильно.

  • A1 показывает 01-DEZ-13 ‘German
  • B1 показывает 15:23

Затем я запускаю свой код, который записывает новые данные в эти поля времени и форматирует его. Это испортит то, что я вижу в Австрии, но не в Америке.

  • A1 показывает 01.12.2013 15:23 “Правильное значение, неправильный формат
  • B1 показывает 01.12.2013 15:23 “Правильное значение, неправильный формат

Я отлаживал, пока не нашел раздел, который вызвал проблему, когда я пишу данные на листе из массива. В отладке я вижу, что при копировании массива все форматирование теряется. Все в порядке.

Set Destination = myWS.Range(«A» & lFirstRow) Destination.Resize(UBound(arrIn, 1), UBound(arrIn, 2)) = arrIn

Затем я запускаю процедуру, которая переформатирует область.

If not bFormatWorksheet(myWS) then err.Raise glHandled_Error

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

myWS.Rows(lFirstRow & «:» & lLastRow).ClearFormats wksTemplate.Rows(giHEADER_ROW + 1).Copy myWS.Rows(lFirstRow & «:» & lLastRow).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False

В моей американской версии это дает правильно отформатированные ячейки. Например

  • A1.Value = 12/5/2013 05:00:45
  • B1.Value = 12/5/2013 05:00:45
  • A1 показывает 05-DEC-13 ‘DD-MMM-YY Исправить
  • B1 показывает 05:00 ‘HH: MM Correct

Опять же, он выглядит нормально, когда я открываю документ в Австрии, но не после запуска любого кода обновления.

После запуска кода обновления в Австрии я вижу следующее:

  • A1.Value = 12/5/2013 05:00:45
  • B1.Value = 12/5/2013 05:00:45
  • A1 показывает = 12/5/2013 05:00:45
  • B1 показывает = 12/5/2013 05:00:45

и если я проверю NumberFormat…

  • ? Range ( “A1”). NumberFormat
  • дд-ммм-уу
  • ? Range ( “B2”). NumberFormat
  • чч: мм

и если я щелкнул правой кнопкой мыши каждую ячейку, чтобы проверить формат, который я вижу…

  • Формат A1 TT-MMM-JJ ‘Исправлено для тега, Monat, Jahr
  • Формат B1 hh: mm ‘Правильно

Поскольку это не работает, я вошел и явно переформатировал каждую ячейку в цикле следующим образом:

for i = lFirst to lLast myWS.Range(«A» & i).numberformat = «DD-MMM-YY» myWSRange(«B» & i).numberformat = «HH:MM» next i

Это не помогло.

Идеи?

Спасибо Shari

Лучший ответ:

Я, наконец, понял это. После нескольких часов чтения в Интернете я получил ключ, который привел меня к этому решению. Это своего рода вуду и не имеет большого смысла, но он решил мою проблему.

В начале моей программы форматирования я копирую форматированную строку из моего шаблона. Это прекрасно работало, оставаясь в Америке, но потерпело неудачу, как описано в Австрии.

Затем я добавил форматирование даты до конца моей процедуры форматирования, показанной ниже. Это решило проблему.

For i = lFirstRow To lLastRow With myWS ‘ The following line didn’t work ‘ (where gsDATE_DISPLAY_FORMAT = «DD-MMM-YYYY») ‘.Cells(i, pstColNum.cre_eta).NumberFormat = gsDATE_DISPLAY_FORMAT ‘ The following two lines work. I don’t know why, but they do. ‘ You must have the + 0! That is the key! dDate = CDate(.Cells(i, pstColNum.cre_eta)) + 0 .Cells(i, pstColNum.cre_eta) = dDate End With Next i Ответ №1

Я не хотел бы точно сказать, что есть решение VBA, поскольку это может быть просто проблема локализации с программным обеспечением… но, возможно, вы можете исправить проблему, явно удалив нежелательную часть даты/времени из каждой ячейки перед тем, как отформатировать его. Что-то вроде

myWS.Range(«A» & i).value = Format(myWS.Range(«A» & i).value,»DD-MMM-YY») myWS.Range(«A» & i).numberformat = «DD-MMM-YY» myWS.Range(«B» & i).value = Format(myWS.Range(«B» & i).value,»HH:MM») myWSRange(«B» & i).numberformat = «HH:MM»

Это может фактически не исправить форматирование и, по сути, может привести к тому, что поля сообщают плохую информацию в неправильном формате (например, “12/5/2013 00:00:00” в A1 и “12/30/1899 05: 00: 45 ‘в B1), но я бы попробовал и посмотрел, что произойдет. Возможно, вы захотите проигнорировать форматирование этого числа как целого и оставить его как форматированную строку. Это, конечно, зависит от понимания того, что ни один другой код не требует сохранения времени в столбце A, а дата сохраняется в столбце B. Если это так, то это не является правильным решением.

Оцените статью
Добавить комментарий