如何防止Excel对公式中的日期模式使用OS区域设置


21

根据这个问题,我有以下问题:

我想使用一些Excel函数(而不是单元格格式),例如TEXT(A1,{date_pattern})

但是回答我上一个问题的人让我发现,日期模式根据Windows区域设置而改变。

但是,我的操作系统(Windows 7)为英文,Office套件也为英文。通过查看我的区域设置,它甚至可以显示使用英文符号(dd.MM.yyyy)的模式

地区和语言

我想知道是否有任何方法可以从Excel禁用这种行为,这意味着我想一直使用英文模式,而不要使用本地化的模式,因为我不希望Excel表单的行为根据读者的本地化而改变。

一个简单的情况是将某些日期字段重新格式化为以计算机为中心的方式,例如:“ yyyymmdd_hhss”,这是公认的,可以轻松地上下排序。但是,因为我在瑞士的法语区,所以我应该写“ aaaammjj_hhss”,如果我将此Excel发送给苏黎世的一位同事,当他获得瑞士德语本地化时,他将无法看到正确的日期(他的excel会期望“ jjjjmmtt_hhss”)

我们足够聪明地以英语安装所有Windows和Office,但是我们仍然会遇到这样的问题,因为此链接指向OS区域设置。

对我来说,更改Windows设置不是一个选择,因为所有其他程序都在使用此设置。


4
我不敢相信这甚至可以在Excel中解决。通过这种行为,文档的结果完全取决于打开文件的计算机,从而使文件内容随计算机而变化。在最初使用逗号(,)表示计算机中使用小数点(。)的十进制值时打开文件时遇到了这个问题,而公式给出的结果不正确...
AxeEffect

Answers:


26

这个问题有点老了,但是到目前为止,它似乎还没有答案。我还在许多站点上看到了类似的问题,但是还没有找到仅涉及内置Excel函数的答案。但是,使用VBA解决此问题非常容易。您甚至不必知道如何编程来执行此操作,因为所需的功能是如此简单。

打开工作簿后,只需按Alt + F11(打开VBA编辑器),然后单击菜单项插入 > 模块 在新的VBA模块中,输入以下内容:

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

这只是使用VBA自己的Format功能而不是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 $ 1yyyymmdd\_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)。

以下是一些屏幕截图,可能会使情况更加清楚。

zh-CN

  • 在图中,第1列列出了采用不同格式的单个日期的几种表示形式。
  • 请注意,第2行和第3行使用Excel的“系统默认”日期格式。(这些由“格式”对话框中的前导星号表示,它们指示应使用用户的默认日期格式。)还请注意,第5行使用带括号的LCID,这将用于月份和日期名称的语言强制为英语(可以使用不同的LCID来指定其他语言)。
  • 第二列显示GetFormat(Cell, FALSE)列1中每个单元格的结果。(请注意FALSE,第二个参数使函数返回NON-localized格式)。
  • 第三列显示GetFormat(Cell, TRUE)列2中每个单元格的返回值(即本地化格式)。
  • 第四列显示了使用原始原始日期值和的本地化结果GetFormat来重现第1列中所示格式的TEXT函数的结果。但是请注意,此列未应用数字格式。这些值是TEXT函数的直接结果。

上面的英语(美国)案例的结果不是很有趣,但是您可以将它们与以下结果进行比较,这些结果是通过将操作系统的“区域设置”更改为其他各种语言环境而获得的。重要的是,请注意,通过GetFormat与结合使用,TEXT我们可以在所有语言环境中为数字格式(不包括日期或月份名称的数字格式)保留恒定的结果。通过使用LCID约束语言(如第5行),我们甚至在包含日期和月份名称时甚至可以保留恒定格式。

fr-CH

否

RU-RU

此方法适用于大多数语言环境,但是应注意,用于表示印度阿拉伯数字的脚本在所有语言环境中都不相同。因此,像尼泊尔(印度)语言环境这样的区域设置将导致日期格式“看起来”与美国日期不同。但是就数字的位置而言,它们实际上是相同的“格式”,它们只是对数字使用不同的符号。

ne-IN


1
非常感谢您的回答(甚至很晚)-方法1对我来说是最好的,并且对于我的所有情况都足够简单。很好,很完整的答案。
рüффп

您能否解释一下如何使用第一种方法插入2015年11月28日?我应该在哪里写什么?
伊兰2015年

3

对于日期,您实际上可以定义一种使Excel使用特定区域设置的格式。如果您将包含日期的单元格的数字格式设置为类似

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

Excel将在美国语言环境中显示您的日期(十六进制409)

陷阱:YMD表示法是本地化的,因此例如在德国系统上转向JMT。因此,您可能必须使格式字符串适应您的情况,但是我希望它在使用其他语言的系统上表现得像公式(自动翻译)一样(您似乎已经意识到)。

有关更多详细信息,请参见此处:https : //stackoverflow.com/questions/894805/excel-number-format-what-is-409

以及此处的区域设置列表:http : //support.microsoft.com/kb/221435


2
但这并不能回答我的问题。即使操作系统需要“ jj / mm / aaaa”,我也希望能够在Excel工作表中写入dd / mm / yyyy。我试图更改操作系统的语言环境,并且输出也在更改,因此Excel无法根据用户的语言环境进行调整。如果我写“ jj.mm.aaaa”(如法语),并且将语言环境更改为美国,则Excel会显示:“ jj.03.aaaa”,这是不适合的。
рüффп

3

即使这个问题有点老了,我还是遇到了另一个(简单!)解决方案,为了完整性/参考性而在此发布。

  • 我成功尝试了ricovox的答案,但想要一个没有VBA的解决方案。

  • 还测试了MarinD的解决方案。但是,正如评论中指出的那样,如果您需要满足一种以上特定于国家/地区的格式,它可能会很快变得笨拙。

  • 现在是我的解决方案:使用Excel的本机YEAR(),MONTH()和DATE()函数,将它们包装在TEXT()中,以将零填在前面。日期在A1中:

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

    给我日期YYYY-MM-DD格式,而不考虑当前区域设置是否要求YYYY-MM-DDAAAA-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工作表。
亚历克西斯·佩罗蒂

Excel TEXT函数的最大缺陷是日期格式取决于“区域设置”中当前的Windows区域设置。示例= = TEXT(TODAY();“ YYYY-MM-DD”)for US = TEXT(TODAY();“ AAAA-MM-JJ”)FR因此无法使用TEXT创建通用Excel工作表。请改用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单元重命名为dateformat。在此单元格中,我仅输入了文本dd / mm / yyyy。因此,当我使用文本函数时,我正在使用单元格名称,例如= text(C1,dateformat)的格式,它似乎正在起作用(对于瑞士来说,它是正确的)。

干杯...

一种。


1
您说这在瑞士有效,但是是“ French(Switzerland)”,“ German(Switzerland)”还是英语?如果是英语,这对本次讨论没有任何帮助。如果不是英语,您能解释一下为什么无效的情况下=TEXT(C1,dateformat)(对于dateformat包含的单元格dd/mm/yyyy=TEXT(C1, "dd/mm/yyyy")吗?(还是行得通?)
G-Man说'Reinstate Monica''18

0

我不敢相信没有人提供命名格式作为解决方案。

如果您格式化日期并输入=TEXT(A1,"Short Date"),它将根据区域设置自动使用正确的格式,区域之间的问题为零。

“长日期”也是一个可以接受的条目,它将在各个地区无缝运行。无论使用什么版本,它都将使用cvdate在VBA中转换回正确的日期。  


在Excel 2016中,它将保留分配给它的所有区域格式。如果您尝试比较具有不同区域格式的日期,则比较将失败。太糟糕了,可能是一个错误。
史蒂夫·史蒂夫

0

只是放入另一个取自以下内容的恕我直言的优雅替代方法:@Taosique的Stackoverflow答案

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

它可能不起作用。我不知道所有语言,但只要某些语言中的月份单词不以“ m”开头,则可能根本不起作用(导致#VALUE错误)。即使单词以“ m”开头,此处也不止2个选项。德国,波兰和匈牙利分别具有不同的格式代码,仅举几例。
伊斯特

我假设开发人员知道他正在开发哪种语言设置(例如,这里是英语系统),并且他希望他的公式可以用于/将其转换为哪种语言。将IF扩展为他/她感兴趣的任何语言都应该没什么大不了的
。– GWD

好吧,我已经列出了这些特定的国家/地区,因为我已经遇到一个案例,我必须同时适应所有这些语言。嵌入式IF也有一个限制,但这也很容易回避。我同意这个想法总体上是好的,它的主要优点是不需要VBA。
Ister

0

我知道,参加聚会很晚,但是我自己调查一下,我发现在ExcelBanter上不需要VBA的可行解决方案。

解决方法是使用旧的Excel v4宏系统。仍然可以通过命名范围或v4宏表对其进行访问。对我来说,这也是一次学习经历。网格上的Excel上的一页和Ron de Bruin的网站上的一页都是不错的介绍。后者还具有指向其中具有相同解决方案的工作簿的链接。

基本上,旧的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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.