
Моя компания создает инструменты для создания отчетов, и одним из форматов экспорта является Excel. Поскольку наши клиенты из разных стран, при создании файла Excel мы используем форматирование локали для отображения дат с помощью следующего форматировщика:
[$-<locale here>]mmmm d, yyyy;@
Таким образом, если в ячейке указана дата 31/03/2020 и в качестве локали выбрана Ирландия, то будет отображаться дата 10 марта 2020 г., но если в качестве локали выбрана Испания, то будет отображаться дата 10 марта 2020 г.
Мы получили сообщение от клиента о том, что эта функция не работает, поскольку дата 31/03/2020 отображается как 8 марта 2020 г.
При более внимательном рассмотрении я заметил, что их форматировщик был указан как:
[$-,F]mmmm d, yyyy;@
Я пытался выяснить, что на самом деле пытается разобрать Excel или какой календарь или форматировщик дат пытается использовать для отображения этой фиктивной даты, но безуспешно. Очевидно, нам нужно лучше определить локаль клиента, но мне интересно, может ли это быть вызвано тем, что у клиента на компьютере установлена странная локаль или просто какой-то фиктивный код.
Это произошло в Excel 2013, но мне также удалось воспроизвести это в Excel 365. Я также попытался найти любой код страны, который был связан с шестнадцатеричным значением F, но ничего не вышло. Когда удаляется, ,
форматер определяет F как код Франции и отображает правильный номер даты на французском языке: 30 марта 2020 г.
решение1
Насколько я могу судить [$-,F]
, это эквивалентно [$-F0000]
переводу даты в лунный календарь.
Мне хотелось посмотреть, что означают все остальные буквы в той же ситуации, поэтому я написал следующее:
Sub formatdates()
Dim ws As Worksheet
Set ws = Sheet1
Dim i As Integer
i = 1
Do While i < 27
ws.Cells(i, 1) = "=TODAY"
ws.Cells(i, 1).NumberFormat = "[$-," & Chr(64 + i) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 2) = "[$-," & Chr(64 + i) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 3) = ws.Cells(i, 1).NumberFormat
i = i + 1
Loop
End Sub
Вы можете использовать это в любой пустой книге. Она отобразит текущую дату, используя каждую из букв латинского алфавита в качестве кода формата, аналогичного [$-,F] в вашем посте. Я уверен, что есть и другие, но эти были достаточно поучительны, чтобы немного покопаться.
Например
- [$-,F] выдаст вам лунный календарь, но на английском языке, так что пятый месяц будет отображаться как июнь
- [$-,G] даст вам индийский гражданский календарь (я думаю)
- [$-,M] даст вам Персидский календарь (я думаю)
- [$-,N] даст вам календарь хиджры
Я также взялсписок языковых кодовпо ссылке, которую @DavidPostill включил в свой комментарий (естьесть и другие с более полными спискамикодов стран, которые, я думаю, тоже можно использовать).
Я поместил таблицу кодов из ссылки в комментарии выше в Лист2 и написал это, чтобы добавить в конец таблицы, созданной с помощью первой функции выше, просто из интереса.
Sub formatdates2()
Dim ws As Worksheet
Set ws = Sheet1
Dim i As Integer
Dim r As Integer
r = 1
i = 28
Do While Sheet2.Cells(r, 1) <> ""
ws.Cells(i, 1) = "=TODAY()"
ws.Cells(i, 1).NumberFormat = "[$-" & Sheet2.Cells(r, 1) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 2) = "[$-," & Sheet2.Cells(r, 1) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 3) = ws.Cells(i, 1).NumberFormat
ws.Cells(i, 4) = Sheet2.Cells(r, 2)
i = i + 1
r = r + 1
Loop
End Sub
Насколько я могу судить, существуют языковые коды (последний список/функция) и календарные коды (первая функция).
Я думаю, вы ищете языковые коды.
Но вы можете добиться большего успеха, просто используя [$-x-sysdate]
, который представляет собой код, отображаемый, когда я выбираю требуемый формат из списка в разделе «Дата» в диалоговом окне «Формат ячеек», а затем просматриваю его в списке «Пользовательский».