Вопрос:
Excel 2010 Pro.
У меня странная проблема форматирования.
Он работает нормально в Америке, но не после того, как я запускаю код в Австрии. В Австрии он игнорирует мое форматирование даты и времени. Я не могу изменить его после этого, даже вручную. Посмотрите, как я могу попробовать разные форматы, образец вверху не меняется?
Важно, чтобы значение ячейки включало всю дату и время, но для использования желаемых форматов времени и даты.
Обновлено 14Nov13: Проблема описана на других сайтах с идеей, что дата каким-то образом “застревает как текст” и не может быть переформатирована ни к чему другому. Одно из предложений заключалось в том, чтобы сделать что-то математическое для ячейки, чтобы вернуть его обратно в нетекстовый текст. (Идея: range.value = cdate (range.value) + 0) Я внимательно посмотрел на свою камеру в Австрии и заметил, что между датой и временем есть два пробела, например 14.11.2013 15:22:19. В одном случае я удалил одно из пространств, и он щелкнул в формате, который я хотел (14-NOV-13). Однако я не смог повторить это и должен будет выяснить, как сделать что-то программно. Я еще не уверен в правильном решении. Вероятно, это связано с циклическим использованием всех ячеек даты после того, как я вставлю свой вариантный массив и как-то исправлю их.
BAD (Австрия)
ХОРОШО (Америка)
БОЛЬШЕ ДЕТАЛИ: В моем приложении я пишу дату в две ячейки через массив, а затем отформатируйте их, используя один из двух настраиваемых форматов даты. Форматирование ячейки правильное, когда я проверяю его. Когда я смотрю на рабочий лист в Америке, это правильно:
- 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. Если это так, то это не является правильным решением.