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


21

Відповідно до цього питання у мене є така проблема:

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

Але людина, яка відповідає на моє попереднє запитання, змушує мене з’ясувати, що шаблон дати змінюється відповідно до регіональних налаштувань Windows.

Однак моя ОС (Windows 7) англійською мовою, а також Office Office. Переглядаючи мої регіональні налаштування, він показує навіть візерунок, використовуючи англійські позначення (dd.MM.yyyy)

Регіон та мова

Я хочу знати, чи є якийсь спосіб відключити таку поведінку від 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 $ 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), щоб отримати локалізований формат-рядок. Цей рядок буде представляти той самий формат, який ви застосували, але він буде використовувати правильні літери для TEXT для інтерпретації (наприклад, "j" замість "d"), тому відображене значення дат буде постійним у всіх локалях. Якщо ви хочете використовувати лише один формат дати для всієї робочої книги, вам потрібно буде виконати кроки 1-4 один раз. Потім повторіть крок 5 (функція TEXT) у всіх клітинках, де ви зараз його використовуєте, але замість жорсткого кодування формату, ви просто посилаєтесь на клітинку, що містить локалізований формат-рядок ( $ B $ 1 у прикладі інструкцій) .

Зауважте, що другий аргумент GetFormatвказує функції, повертати чи ні локалізовану версію (що залежить від регіональних налаштувань), або "стандартну" версію (яка завжди базується на en-US).

Ось кілька знімків екрана, які можуть зробити це більш зрозумілим.

en-US

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

Наведені вище результати для англійського (американського) випадку не дуже цікаві, але ви можете порівняти їх із наступними результатами, отриманими зміною регіональних налаштувань моєї операційної системи на різні інші локалі. Важливо відзначити, що за допомогою GetFormatкомбінації TEXTми можемо зберегти постійний результат для числових форматів (тих, що не включають назви днів і місяців) у всіх локальних місцях. І обмежуючи мову за допомогою LCID (як у рядку 5), ми можемо навіть зберегти постійний формат, включаючи імена днів і місяців.

fr-CH

nb-НІ

ru-RU

Цей метод працює для більшості локалів, однак слід зазначити, що сценарії, які використовуються для представлення індуїстсько-арабських цифр, НЕ однакові у всіх мовах. Тому регіональні параметри, такі як параметри непальської (Індія), призводять до форматів дат, які "виглядають" інакше, ніж дати в США. Але вони насправді в тому ж "форматі" щодо позицій чисел - вони просто використовують різні символи для чисел.

пе-ІН


1
Велике спасибі за вашу відповідь (навіть пізно) - метод 1 найкращий для мене і досить простий у всіх моїх випадках. Дуже гарна і повна відповідь.
рüффп

Чи можете ви пояснити, як я можу вставити 28.11.2015 за допомогою першого методу? Де і що мені написати ???????
Ілан

3

Для дат можна фактично визначити формат, який змушує Excel використовувати певний локал. Якщо ви встановите формат числа комірки, що містить вашу дату, щось подібне

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

Excel відобразить вашу дату в американській місцевості (шістнадцятковий 409)

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

Тут можна ознайомитись детальніше: /programming/894805/excel-number-format-what-is-409

і ось список локалів: http://support.microsoft.com/kb/221435


2
Але це не відповідає на моє запитання. Я хочу мати можливість записувати dd / mm / yyyy на моєму аркуші Excel, навіть ОС хоче "jj / mm / aaaa". Я спробував змінити локальну локальну систему, і вихід змінюється, тоді Excel не адаптується відповідно до Локальної програми користувача. Якщо я пишу "jj.mm.aaaa" (як французькою мовою) і я міняю свою локальну мову на US, Excel показує: "jj.03.aaaa", яка не адаптована.
рüффп

3

Незважаючи на те, що це питання трохи старе, я натрапив на інше (просте!) Рішення і публікую тут заради повноти / довідки.

  • Я успішно спробував відповідь ricovox, але хотів рішення без VBA.

  • Випробувано також рішення MarinD. Але, як зазначалося в коментарях, якщо вам потрібно буде задовольнити більше ніж один формат, характерний для кожної країни, він може отримати непростий досвід досить швидко.

  • А тепер до мого рішення: використовуючи нативні функції YEAR (), MONTH () та DATE () Excel, загорнуті в 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

Дуже простий спосіб уникнути цілого безладу - створити список днів відомих дат і використовувати список у своїй функції.


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".


Простий, якщо ви керуєте однією мовою (французькою у вашому випадку), але якщо вам доведеться керувати кількома мовами, ваша формула стане занадто великою.
рüффп

Я керую лише одним багажем. Сенс використання CHOOSE полягає саме у створенні однофазного листа Excel, який буде працювати в будь-якій іншій версії мови Excel.
Alexis PERROTTEY

Велика помилка функції Excel TEXT полягає в тому, що формат дати залежить від вашої поточної локальної системи Windows в регіональних налаштуваннях. Приклад = = TEXT (TODAY (); "YYYY-MM-DD") для US = TEXT (TODAY (); "AAAA-MM-JJ") для FR. Тому не можливо створити універсальний аркуш Excel за допомогою TEXT. Використовуйте замість CHOOSE.
Олексій ПЕРРОТТЕЙ

Зрештою, рішення з іншою функцією із жорстко кодованими значеннями насправді не допомагає більше, ніж жорстке кодування шаблонів дат. Особисто я пішов би з VBA і прийнятою відповіддю. В будь-якому випадку дякую, що поділилися своїм досвідом.
рüффп

1

Якщо ваша контрольна дата знаходиться в комірці A1:

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

Це гарне рішення, якщо вам потрібно керувати лише одним додатковим форматом ... Я впевнений, що все одно мої колеги з Цюріха чи будь-якої іншої країни, яка не є ні англійською, ні французькою, це все одно не вийде. Якщо вам доведеться створити if(if(if...для кожного формату по всьому світу, це було б дуже важко в управлінні.
рüффп

Це правильно, але я не зміг знайти нічого кращого, не пройшовши макрос VBA. Я не розумію, чому Microsoft перекладає функції та їх властивості (що ще гірше, оскільки вони не перекладають їх автоматично, коли ви відкриваєте його іншою мовою, як у нашому випуску тут). Жодна мова програмування ніколи цього не робила. Просто англійської було б достатньо
MarinD

0

Зараз я використав аналогічну логіку з Методом 2, що подається з Макросами. Макроси працюють, але зазвичай, коли ви надсилаєте файл від однієї організації до іншої, макроси не встигатимуть через обмін або антивірус не дозволить їм запускатися. Тож я просто перейменував осередок ia як датаформат. У цю клітинку я просто вписав текст dd / mm / yyyy. Отже, коли я використовую текстову функцію, я використовую ім'я комірки для формату, наприклад = текст (C1, датаформат), і, здається, він працює (точно для Швейцарії це працює).

Ура ...

A.


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 від @Taosique

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

Це може не спрацювати. Я не знаю всіх мов, але поки слово на місяць не починається з "m" на деяких мовах, це, ймовірно, не буде працювати взагалі (надання #VALUEпомилки). Навіть якщо слово починається з "m", тут є більше ніж два варіанти. Німеччина, Польща та Угорщина мають різні коди форматування, щоб назвати лише декілька.
Істер

Я припускаю, що розробник знає, на якій мові він розробляє (наприклад, тут англійська система), і для чого він хоче, щоб його формула працювала / перекладала.
GWD

Ну, я перерахував ці конкретні країни, бо в мене вже був випадок, коли мені довелося одночасно адаптуватися до всіх цих мов. Існує також обмеження вбудованих ІФ, однак це також легко пройти в сторону. Я згоден, що ідея загалом хороша, і її головна перевага - не потрібна 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)
  • у формулі Text використовуйте це ім'я MonthFormat, щоб вказати формат, наприклад =TEXT(A1, MonthFormat)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.