18

По этому вопросу у меня следующая проблема:

Я хочу использовать некоторые функции Excel (не форматирование ячеек), такие как TEXT (A1, {date_pattern})

Но человек, который ответил на мой предыдущий вопрос, заставил меня обнаружить, что шаблон даты изменяется в соответствии с региональными настройками Windows.

Тем не менее, моя ОС (Windows 7) на английском языке, а также пакет Office. При просмотре в моих региональных настройках он показывает даже шаблон с использованием английского обозначения (дд.MM.yyyy)

Регион и язык

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

Простым случаем будет переформатирование некоторого поля даты в компьютерно-ориентированный способ, например: "yyyymmdd_hhss", это распознается повсеместно и может быть легко отсортировано вверх и вниз. Но, поскольку я нахожусь во французской части Швейцарии, я должен написать "aaaammjj_hhss", и если я отправлю этот Excel коллеге в Цюрихе, он не сможет увидеть правильную дату, поскольку он получил швейцарскую немецкую локализацию (его превосходство будет ожидать "jjjjmmtt_hhss")

Мы были достаточно умны, чтобы установить все окна и офис на английском языке, но мы все еще сталкиваемся с такой проблемой, потому что эта ссылка на региональные настройки ОС.

Для меня изменение настроек Windows не вариант, потому что все остальные программы используют эти настройки.

9 ответов9

21

Этот вопрос немного старый, но на сегодняшний день, похоже, нет ответа. Я также видел похожие вопросы на ряде сайтов, но пока не нашел ответа, который бы касался только встроенных функций Excel. Тем не менее, это довольно легко решить с VBA. Вам даже не нужно знать, как программировать, чтобы сделать это, потому что требуемая функция очень проста.

Открыв книгу, просто нажмите Alt+F11 (чтобы открыть редактор VBA). Затем щелкните пункт меню Вставить > Модуль. В новом модуле VBA введите следующее:

Public Function FMT$(ByVal Value, ByVal strFormat)
    FMT = VBA.Format$(Value, strFormat)
End Function

Это просто использует собственную функцию Format VBA вместо функции TEXT в Excel. Это именно то, что вы хотите.

Эта новая функция будет форматировать любую дату (или число) в соответствии с любой заданной вами форматной строкой. Он будет интерпретировать строку формата, используя стандартную (en-US) нотацию, независимо от региональных настроек операционной системы.

Чтобы использовать это в своей книге, просто введите =FMT(A1, "yyyymmdd_hhss") вместо =TEXT(A1, "yyyymmdd_hhss") . (Конечно, при необходимости вы можете изменить ссылку на ячейку и форматную строку.)

Кстати, вы можете назвать функцию как хотите. Я выбрал FMT потому что он был коротким и потому что функция может форматировать как числа, так и даты. Но вы можете выбрать что-то более описательное, если хотите. Просто не забудьте использовать то же имя в вашем рабочем листе, что и в коде VBA.

Обратите внимание, что строки формата VBA не совсем совпадают со строками пользовательского формата Excel (например, используйте "n" вместо "m" для минут), но они очень похожи. Посмотрите здесь для получения дополнительной информации или поиск MSDN для «Функция форматирования (Visual Basic для приложений)». Прокрутите вниз, чтобы увидеть различные спецификаторы формата даты.

Способ 2

Другой подход, который также использует VBA, но на самом деле может быть проще в обслуживании, заключается в следующем:

  1. Примените желаемый формат даты к ячейке, используя обычный диалог «Формат ячейки». Эта ячейка может быть на скрытом листе, если вы предпочитаете - она не должна отображаться для конечного пользователя. Предположим, вы применили формат yyyymmdd\_hhss к ячейке $ A $ 1 (обратите внимание, что подчеркивание должно быть экранировано, как показано на рисунке).
  2. Добавьте функцию GetFormat (показанную ниже) к модулю VBA в вашей книге.
  3. Введите =GetFormat($A$1, TRUE) в другую ячейку (например, $ B $ 1)
  4. Эта функция вернет локализованную версию строки формата. Таким образом, даже если вы изначально отформатировали $ A $ 1 с помощью yyyymmdd\_hhss , когда вы открываете книгу на компьютере, используя французский язык (например), функция покажет aaaammjj\_hhss .
  5. Теперь просто назовите вторую ячейку во всех ваших функциях TEXT . Например: =TEXT(F22, $B$1) .

Вот код VBA:

Public Function GetFormat$(Cell As Range, Optional ByVal UseLocal As Boolean)
    If UseLocal Then
        GetFormat = Cell.NumberFormatLocal
    Else
        GetFormat = Cell.NumberFormat
    End If
End Function

Это позволяет нам "проверять" ячейку, которую вы первоначально отформатировали ($ A $ 1), чтобы получить локализованную строку формата. Эта строка будет представлять тот же формат, который вы применили, но она будет использовать правильные буквы для ТЕКСТА для интерпретации (например, "j" вместо "d"), поэтому отображаемое значение дат будет постоянным во всех локалях. Если вы хотите использовать только один формат даты для всей книги, вам нужно будет выполнить шаги 1-4 один раз. Затем повторите шаг 5 (функция TEXT) во всех ячейках, где вы в данный момент используете его, но вместо жесткого кодирования формата вы просто ссылаетесь на ячейку, содержащую локализованную строку формата ($ B $ 1 в инструкциях примера) ,

Обратите внимание, что второй аргумент GetFormat указывает функции, возвращать ли локализованную версию (которая зависит от региональных настроек) или "стандартную" версию (которая всегда основана на en-US).

Вот некоторые скриншоты, которые могут сделать это более ясным.

ан-США

  • На рисунке в столбце 1 перечислены несколько представлений одной даты с применением разных форматов.
  • Обратите внимание, что строки 2 и 3 используют форматы даты "по умолчанию" в Excel. (Они отмечены звездочкой в диалоговом окне "Формат" и указывают на то, что должен использоваться формат даты по умолчанию). Также обратите внимание, что в строке 5 используется LCID в квадратных скобках, что делает язык, используемый для названий месяцев и дней, английским (разные LCID могут использоваться для указания других языков).
  • Во втором столбце показан результат GetFormat(Cell, FALSE) для каждой ячейки в столбце 1. (Напомним, что FALSE для второго параметра заставляет функцию возвращать не локализованные форматы).
  • В третьем столбце показано, что GetFormat(Cell, TRUE) для каждой ячейки в столбце 2. (т.е. в локализованных форматах).
  • В четвертом столбце показан результат функции TEXT с использованием исходного необработанного значения даты и локализованного результата GetFormat для повторного создания формата, показанного в столбце 1. Однако обратите внимание, что к этому столбцу не применяется форматирование чисел. Значения являются прямым результатом функции TEXT.

Приведенные выше результаты для случая с английским (США) не очень интересны, но вы можете сравнить их со следующими результатами, которые были получены путем изменения региональных настроек моей операционной системы на различные другие локали. Важно отметить, что с помощью GetFormat в сочетании с TEXT мы можем сохранить постоянный результат для числовых форматов (тех, которые не включают названия дня или месяца) во всех локалях. И, ограничивая язык с помощью LCID (как в строке 5), мы можем даже сохранить постоянный формат, включив также названия дней и месяцев.

FR-СН

NB-NO

р-RU

Этот метод работает для большинства языковых стандартов, однако следует отметить, что сценарии, используемые для представления индусско-арабских чисел, НЕ одинаковы во всех языковых стандартах. Поэтому региональные настройки, такие как настройки в непальском (Индия) регионе, приведут к форматам дат, которые "выглядят" иначе, чем даты в США. Но на самом деле они находятся в одном и том же "формате" с точки зрения позиций чисел - они просто используют разные символы для чисел.

пе-IN

4

Для дат вы можете фактически определить формат, который заставляет Excel использовать определенную локаль. Если вы установите формат числа ячейки, содержащей вашу дату, что-то вроде

[$-409]m/d/yy h:mm AM/PM;@

Excel отобразит вашу дату в локали США (hex 409)

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

Смотрите здесь для получения более подробной информации:https://stackoverflow.com/questions/894805/excel-number-format-what-is-409

и здесь для списка локалей:http://support.microsoft.com/kb/221435

3

Хотя этот вопрос немного устарел, я столкнулся с другим (простым!) Решение и выкладываю здесь ради полноты / ссылки.

  • Я успешно попробовал ответ ricovox, но хотел найти решение без VBA.

  • Протестировано решение MarinD. Но, как отмечается в комментариях, если вам нужно обслуживать более одного формата, специфичного для страны, он может стать громоздким довольно быстро.

  • А теперь к моему решению: использовать собственные функции Excel YEAR(), MONTH() и DATE(), обернутые в TEXT(), чтобы заполнить нули перед собой. С датой в А1:

    =TEXT(YEAR(A1),"0000")&"-"&TEXT(MONTH(A1),"00")&"-"&TEXT(DAY(A1),"00")

    дает мне дату в YYYY-MM-DD , независимо от того, требует ли текущая локаль YYYY-MM-DD или AAAA-MM-JJ или любых других локализованных имен для года / месяца / даты.

    Excel переводит свои собственные формулы автоматически.

1

Простой способ решения проблемы формата даты в локали Excel - использовать функцию CHOOSE :

CHOOSE(WEEKDAY(TODAY());"Dimanche";"Lundi";"Mardi";"Mercredi";"Jeudi";"Vendredi";"Samedi")

CHOOSE(MONTH(TODAY());"Janvier";"Fevrier";"Mars";"Avril";"Mai";"Juin";"Juillet";"Août";"Septembre";"Octobre";"Novembre";"Décembre")

В этих примерах вы получите День и Месяц в письмах без использования региональных форматов, таких как "Mmmm" или "Dddd" или "Jjjj".

1

Если ваша контрольная дата находится в ячейке A1:

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
0

Просто добавлю еще одну элегантную альтернативу imho, взятую из: Stackoverflow answer @Taosique

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
0

Теперь я использовал логику, аналогичную методу 2, приведенному в макросах. Макросы работают, но обычно, когда вы отправляете файл из одной организации в другую, макросы не могут это сделать через обмен, или антивирус не позволяет им работать. Поэтому я просто переименовал ia cell в dateformat. В этой ячейке я просто ввел текст дд / мм / гггг. Поэтому, когда я использую текстовую функцию, я использую имя ячейки для формата, например, = text(C1, dateformat), и это, кажется, работает (точно для Швейцарии, это работает).

Приветствия ...

A.

0

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

Если вы отформатируете дату и введете =TEXT(A1,"Short Date") она автоматически будет использовать правильный формат, основанный на региональных настройках, с нулевыми проблемами между регионами.

"Длинная дата" также является приемлемой записью и будет беспрепятственно работать во всех регионах. Он также преобразует обратно в правильную дату в VBA cvdate независимо от используемой версии.  

0

Очень простой способ избежать всего беспорядка - создать список дней с известными датами и использовать этот список в своей функции.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .