По этому вопросу у меня следующая проблема:
Я хочу использовать некоторые функции Excel (не форматирование ячеек), такие как TEXT (A1, {date_pattern})
Но человек, который ответил на мой предыдущий вопрос, заставил меня обнаружить, что шаблон даты изменяется в соответствии с региональными настройками Windows.
Тем не менее, моя ОС (Windows 7) на английском языке, а также пакет Office. При просмотре в моих региональных настройках он показывает даже шаблон с использованием английского обозначения (дд.мм.гггг)
Я хочу знать, есть ли какой-либо способ отключить такое поведение в Excel, то есть я хочу всегда использовать английские шаблоны, а не локализованные, потому что я не хочу, чтобы поведение моего листа Excel менялось в зависимости от локализации читателя.
Простым случаем было бы переформатирование некоторого поля даты в компьютерно-ориентированный способ, например: «yyyymmdd_hhss», это распознается повсеместно и может быть легко отсортировано вверх и вниз. Но, поскольку я нахожусь во французской части Швейцарии, я должен написать «aaaammjj_hhss», и если я отправлю этот Excel коллеге в Цюрихе, он не сможет увидеть правильную дату, поскольку он получил швейцарскую немецкую локализацию (его превосходство будет ожидать "jjjjmmtt_hhss")
Мы были достаточно умны, чтобы установить все окна и офис на английском языке, но мы все еще сталкиваемся с такой проблемой, потому что эта ссылка на региональные настройки ОС.
Для меня изменение настроек Windows не вариант, потому что все другие программы используют эти настройки.
Ответы:
Этот вопрос немного старый, но на сегодняшний день, похоже, нет ответа. Я также видел подобные вопросы на ряде сайтов, но пока не нашел ответа, который бы касался только встроенных функций Excel. Тем не менее, это довольно легко решить с VBA. Вам даже не нужно знать, как программировать, чтобы сделать это, потому что требуемая функция очень проста.
Открыв книгу, просто нажмите Alt + F11 (чтобы открыть редактор VBA). Затем нажмите пункт меню Вставить > Модуль. В новом модуле VBA введите следующее:
Это просто использует собственную
Format
функцию VBA вместо функции ExcelTEXT
. Это именно то, что вы хотите.Эта новая функция будет форматировать любую дату (или число) в соответствии с любой заданной форматной строкой. Он будет интерпретировать строку формата, используя стандартную ( en-US ) нотацию, независимо от региональных настроек операционной системы.
Чтобы использовать это в своей книге, просто введите
=FMT(A1, "yyyymmdd_hhss")
вместо=TEXT(A1, "yyyymmdd_hhss")
. (Конечно, при необходимости вы можете изменить ссылку на ячейку и форматную строку.)Кстати, вы можете назвать функцию как хотите. Я выбрал,
FMT
потому что он был коротким и потому что функция может форматировать как числа, так и даты. Но вы можете выбрать что-то более описательное, если хотите. Просто не забудьте использовать то же имя в вашем рабочем листе, что и в коде VBA.Обратите внимание, что строки формата VBA не совсем совпадают со строками пользовательского формата Excel (например, используйте «n» вместо «m» для минут), но они очень похожи. Посмотрите здесь для получения подробной информации или поиск MSDN для «Функция форматирования (Visual Basic для приложений)». Прокрутите вниз, чтобы увидеть различные спецификаторы формата даты.
Способ 2
Другой подход, который также использует VBA, но на самом деле может быть проще в обслуживании, заключается в следующем:
yyyymmdd\_hhss
к ячейке $ A $ 1 (обратите внимание, что подчеркивание должно быть экранировано, как показано на рисунке).GetFormat
функцию (показанную ниже) к модулю VBA в своей книге.=GetFormat($A$1, TRUE)
в другую ячейку (например, $ B $ 1 )yyyymmdd\_hhss
, когда вы открываете книгу на компьютере, например, на французском языке, эта функция будет отображатьсяaaaammjj\_hhss
.TEXT
функциях. Например:=TEXT(F22, $B$1)
.Вот код VBA:
Это позволяет нам «проверять» ячейку, которую вы первоначально отформатировали ($ A $ 1), чтобы получить локализованную строку формата. Эта строка будет представлять тот же формат, который вы применили, но она будет использовать правильные буквы для ТЕКСТА для интерпретации (например, «j» вместо «d»), поэтому отображаемое значение дат будет постоянным во всех локалях. Если вы хотите использовать только один формат даты для всей книги, вам нужно будет выполнить шаги 1-4 один раз. Затем повторите шаг 5 (функция TEXT) во всех ячейках, где вы в данный момент используете его, но вместо жесткого кодирования формата вы просто ссылаетесь на ячейку, содержащую локализованную строку формата ( $ B $ 1 в инструкциях примера) ,
Обратите внимание, что второй аргумент
GetFormat
сообщает функции, возвращать ли локализованную версию (которая зависит от региональных настроек) или «стандартную» версию (которая всегда основана на en-US).Вот несколько снимков экрана, которые могут сделать это более ясным.
GetFormat(Cell, FALSE)
для каждой ячейки в столбце 1. (Напомним, чтоFALSE
для второго параметра функция возвращает не локализованные форматы).GetFormat(Cell, TRUE)
возвращается для каждой ячейки в столбце 2. (т. Е. Локализованные форматы).GetFormat
для повторного создания формата, показанного в столбце 1. Обратите внимание, однако, что форматирование чисел НЕТ было применено к этому столбцу. Значения являются прямым результатом функции TEXT.Приведенные выше результаты для случая с английским (США) не очень интересны, но вы можете сравнить их со следующими результатами, которые были получены путем изменения региональных настроек моей операционной системы на различные другие локали. Важно отметить, что при использовании
GetFormat
в сочетании сTEXT
мы можем сохранить постоянный результат для числовых форматов (тех, которые не включают названия дня или месяца) во всех локалях. И, ограничивая язык с помощью LCID (как в строке 5), мы можем даже сохранить постоянный формат, включив также названия дней и месяцев.Этот метод работает для большинства языковых стандартов, однако следует отметить, что сценарии, используемые для представления индусско-арабских чисел, НЕ одинаковы во всех языковых стандартах. Поэтому региональные настройки, такие как настройки в непальском (Индия), приведут к форматам дат, которые «выглядят» иначе, чем даты в США. Но они на самом деле находятся в одном и том же «формате» с точки зрения позиций чисел - они просто используют разные символы для чисел.
источник
Для дат вы можете фактически определить формат, который заставляет Excel использовать определенную локаль. Если вы установите числовой формат ячейки, содержащей вашу дату, на что-то вроде
Excel отобразит вашу дату в американской локали (hex 409)
Поправка: нотация YMD локализована и, таким образом, превращается в JMT в немецкой системе, например. Таким образом, вам, возможно, придется адаптировать строку формата к вашей ситуации, но я ожидаю, что она будет вести себя как формулы (автоматический перевод) в системах, использующих другой язык (как вы, кажется, знаете).
Смотрите здесь для получения более подробной информации: /programming/894805/excel-number-format-what-is-409
и вот список локалей: http://support.microsoft.com/kb/221435
источник
Несмотря на то, что этот вопрос немного устарел, я натолкнулся на другое (простое!) Решение и публикую здесь ради полноты / ссылки.
Я успешно попробовал ответ 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 переводит свои собственные формулы автоматически.
источник
Очень простой способ избежать всего беспорядка - создать список дней с известными датами и использовать этот список в своей функции.
источник
Простой способ решения проблемы формата даты в локали Excel - использовать
CHOOSE
функцию:В этих примерах вы получите День и Месяц в письмах без использования региональных форматов, таких как «Mmmm», «Dddd» или «Jjjj».
источник
Если ваша контрольная дата находится в ячейке A1:
источник
if(if(if...
для каждого формата по всему миру, это будет очень трудно управлять.Теперь я использовал логику, аналогичную методу 2, приведенному в макросах. Макросы работают, но обычно, когда вы отправляете файл из одной организации в другую, макросы не могут это сделать через обмен, или антивирус не позволяет им работать. Поэтому я просто переименовал ia cell в dateformat. В этой ячейке я просто ввел текст дд / мм / гггг. Поэтому, когда я использую текстовую функцию, я использую имя ячейки для формата, например, = text (C1, dateformat), и это, кажется, работает (точно для Швейцарии, это работает).
Приветствия ...
A.
источник
=TEXT(C1,dateformat)
будет работать (сdateformat
ячейкой, содержащейdd/mm/yyyy
), когда=TEXT(C1, "dd/mm/yyyy")
не работает? (Или это работает?)Я не могу поверить, что никто не предложил названные форматы в качестве решения.
Если вы отформатируете дату и введете
=TEXT(A1,"Short Date")
ее, она автоматически будет использовать правильный формат, основанный на региональных настройках, с нулевыми проблемами между регионами.«Длинная дата» также является приемлемой записью и будет беспрепятственно работать в разных регионах. Он также преобразует обратно в правильную дату в VBA cvdate независимо от используемой версии.
источник
Просто добавлю еще одну элегантную альтернативу, взятую из: Stackoverflow answer @Taosique
источник
#VALUE
ошибку). Даже если слово начинается с «m», здесь есть более чем 2 варианта. Германия, Польша и Венгрия имеют разные коды форматирования, и это лишь некоторые из них.Я знаю, опоздал на вечеринку, но, взглянув на это сам, я только нашел рабочее решение для 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 и именованных диапазонах.
Таким образом:
=REPT(INDEX(GET.WORKSPACE(37),19),4)
=TEXT(A1, MonthFormat)
источник