Как запретить Excel использовать региональные настройки ОС для шаблонов дат в формулах

21

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

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

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

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

Регион и язык

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

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

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

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

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

Ответы:

26

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

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

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

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

Эта новая функция будет форматировать любую дату (или число) в соответствии с любой заданной форматной строкой. Он будет интерпретировать строку формата, используя стандартную ( 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 $ с 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

drwatsoncode
источник
1
Большое спасибо за ваш ответ (даже поздно) - Метод 1 является лучшим для меня и достаточно простым для всех моих дел. Очень хороший и полный ответ.
рюффп
Не могли бы вы объяснить, как я могу вставить 28.11.2015, используя первый метод? Где и что мне писать ???????
Илан
3

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

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

Excel отобразит вашу дату в американской локали (hex 409)

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

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

и вот список локалей: http://support.microsoft.com/kb/221435

TheUser1024
источник
2
Но это не отвечает на мой вопрос. Я хочу иметь возможность писать дд / мм / гггг в моем листе Excel, даже если ОС хочет "jj / mm / aaaa". Я попытался изменить локаль операционной системы, и выходные данные меняются, а затем Excel не адаптируется в соответствии с локалью пользователя. Если я пишу «jj.mm.aaaa» (как на французском языке) и меняю свой язык на «США», Excel показывает: «jj.03.aaaa», который не адаптирован.
рüффп
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 переводит свои собственные формулы автоматически.

istivan
источник
1

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

Renani
источник
4
Можете ли вы расширить свой ответ, чтобы включить пример?
Бурги
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».

Алексис ПЕРРОТТЕЙ
источник
Все просто, если вы управляете одним языком (в вашем случае французским), но если вам придется управлять несколькими языками, ваша формула станет слишком большой.
15:06
Я управляю только одним языком. Смысл использования CHOOSE состоит именно в том, чтобы создать лист Excel с одним языком, который будет работать в любой другой языковой версии Excel.
Алексис ПЕРРОТТЕЙ
Большая ошибка функции Excel TEXT заключается в том, что формат даты зависит от вашего текущего языкового стандарта Windows в региональных настройках. Пример = = TEXT (TODAY (); "ГГГГ-ММ-ДД") для США = TEXT (TODAY (); "AAAA-MM-JJ") для FR Так что невозможно создать универсальный лист Excel с использованием TEXT. Используйте вместо этого ВЫБРАТЬ.
Алексис ПЕРРОТТЕЙ
В конце концов, решение с другой функцией с жестко заданными значениями на самом деле не помогает больше, чем жесткое кодирование шаблонов дат. Лично я бы пошел с VBA и принял ответ. В любом случае, спасибо, что поделились своим опытом.
рüффп
1

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

=IF(RIGHT(TEXT(A1;"dd-mm-yyyy");1)="y";TEXT(A1;"jj-mm-aaaa");TEXT(A1;"dd-mm-yyyy"))
MarinD
источник
Это хороший обходной путь, если вам нужно управлять только одним дополнительным форматом ... Я уверен, что мои коллеги из Цюриха или любой другой страны, которая не является ни английской, ни французской, все равно не будут работать. Если вам нужно сделать if(if(if...для каждого формата по всему миру, это будет очень трудно управлять.
рюффп
Это верно, но я не мог найти ничего лучше, не пройдя макрос VBA. Я не понимаю, почему Microsoft переводит функции и их свойства (что еще хуже, потому что они не переводят их автоматически, когда вы открываете его на другом языке, как в нашем выпуске здесь). Ни один язык программирования никогда не делал этого. Просто английского было бы достаточно
MarinD
0

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

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

A.

user867292
источник
1
Вы говорите, что это работает в Швейцарии, но это «французский (Швейцария)», «немецкий (Швейцария)» или английский? Если это английский, это ничего не значит для обсуждения. Если это не английский, можете ли вы объяснить, почему =TEXT(C1,dateformat)будет работать (с dateformatячейкой, содержащей dd/mm/yyyy), когда =TEXT(C1, "dd/mm/yyyy")не работает? (Или это работает?)
G-Man говорит «Восстановить Монику»
0

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

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

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

Крис Пакетт
источник
В Excel 2016 он сохранит любое региональное форматирование, назначенное ему. Если вы пытаетесь сравнить даты с различными региональными форматами, сравнение не удастся. Это так плохо, это, вероятно, ошибка.
Подводное Стив
0

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

=IF(TEXT(1,"mmmm")="January",[some logic for English system],[some logic for non-English system])
GWD
источник
Это может не сработать. Я не знаю всех языков, но до тех пор, пока слово «месяц» не начинается с «m» в некоторых языках, это, вероятно, не будет работать вообще (выдает #VALUEошибку). Даже если слово начинается с «m», здесь есть более чем 2 варианта. Германия, Польша и Венгрия имеют разные коды форматирования, и это лишь некоторые из них.
Истер
Я предполагаю, что разработчик знает, в какой языковой среде он разрабатывает (например, здесь английская система), и в какую форму он будет работать / переводить. Не должно быть ничего особенного в расширении IF для любого интересующего его языка.
GWD
Ну, я перечислил эти конкретные страны, потому что у меня уже был случай, когда мне пришлось адаптироваться ко всем этим языкам одновременно. Существует также ограничение встроенных IF, однако это также легко обойти. Я согласен, что идея в целом хороша, и ее главное преимущество в том, что VBA не нужна.
Истер
0

Я знаю, опоздал на вечеринку, но, взглянув на это сам, я только нашел рабочее решение для ExcelBanter, которое не нуждается в VBA.

Для этого нужно использовать старую систему макросов Excel v4. К нему все еще можно получить доступ через именованные диапазоны или листы макроса v4. Это был опыт обучения для меня; страница в Excel вне сетки и одна на сайте Рона де Брюина были хорошими вступлениями. Последний также имеет ссылку на рабочую книгу с тем же решением в нем.

По сути, старая макро-функция Excel v4 GET.WORKSPACE может использоваться для получения мета-информации о многих вещах, включая используемый локализованный формат даты. GET.WORKSPACE (37) возвращает массив всех символов, используемых для всех видов разделителей и т. Д., Где индекс 19-20-21 содержит букву, используемую для форматирования года, месяца и дня. Поэтому использование INDEX (GET.WORKSPACE (37), 19) возвращает «y» в настройках английского языка, «j» на голландском и «a» на испанском. Объедините это с REPT, чтобы сгенерировать 4-буквенный код, и все готово. Проблема заключается в том, что старые функции v4 (например, GET.WORKSPACE) могут использоваться только в таблицах макросов стиля v4 и именованных диапазонах.

Таким образом:

  • создайте именованный диапазон и назовите его, например, «MonthFormat»
  • дать ему формулу =REPT(INDEX(GET.WORKSPACE(37),19),4)
  • в вашей текстовой формуле используйте это имя MonthFormat, чтобы указать формат, например =TEXT(A1, MonthFormat)
Карл Колейн
источник