如何防止 Excel 将操作系统区域设置用于公式中的日期模式

рüф*_*ффп 27 localization date-time text-formatting microsoft-excel-2013

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

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

但是回答我之前问题的人让我发现日期模式根据 Windows 区域设置而变化。

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

地区和语言

我想知道是否有任何方法可以从 Excel 中禁用此类行为,这意味着我想始终使用英文模式而不是本地化模式,因为我不希望 Excel 工作表的行为根据阅读器的本地化而改变。

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

我们很聪明,可以用英语安装所有 windows 和 office,但我们仍然面临这样的问题,因为这个链接到操作系统区域设置。

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

drw*_*ode 30

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

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

Public Function FMT$(ByVal Value, ByVal strFormat)
    FMT = VBA.Format$(Value, strFormat)
End Function
Run Code Online (Sandbox Code Playgroud)

这只是简单地使用 VBA 自己的Format函数而不是 Excel 的TEXT函数。这正是您想要的。

这个新函数将根据您指定的任何格式字符串格式化任何日期(或数字)。无论操作系统的区域设置如何,它将使用标准 ( en-US ) 表示法解释格式字符串。

要在您的工作簿中使用它,只需键入=FMT(A1, "yyyymmdd_hhss")而不是=TEXT(A1, "yyyymmdd_hhss")。(当然,您可以根据需要更改单元格引用和格式字符串。)

顺便说一句,您可以随意命名该函数。我选择FMT它是因为它很短,而且该函数可以格式化数字和日期。但是,如果您愿意,您可以选择更具描述性的内容。请记住在工作表中使用与 VBA 代码中相同的名称。

请注意,VBA 格式字符串与 Excel 的自定义格式字符串并不完全相同(例如,使用“n”代替“m”表示分钟),但它们非常相似。查看此处了解详细信息,或在 MSDN 中搜索“格式函数(Visual Basic for Applications)”。滚动到底部以查看各种日期格式说明符。

方法二

另一种方法也使用 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
Run Code Online (Sandbox Code Playgroud)

这允许我们“检查”您最初格式化的单元格 ($A$1) 以检索本地化的格式字符串。该字符串将表示您应用的相同格式,但它将使用正确的 TEXT 字母来解释(例如,“j”而不是“d”),因此日期的显示值将在所有语言环境中保持不变。如果您只想为整个工作簿使用一种日期格式,则只需执行一次步骤 1-4。然后在您当前使用它的所有单元格中重复步骤 5(TEXT 函数),但不是硬编码格式,您只需引用包含本地化格式字符串的单元格(示例说明中的$B$1) .

请注意, 的第二个参数GetFormat告诉函数是返回本地化版本(取决于区域设置)还是“标准”版本(始终基于 en-US)。

以下是一些屏幕截图,可能会更清楚地说明这一点。

en-美国

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

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

FR-CH

一氧化氮

RU-RU

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

输入端


小智 6

尽管这个问题有点老了,但我遇到了另一个(简单!)解决方案,为了完整性/参考,我在这里发布。

  • 我成功地尝试了 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 自动翻译其本机公式。


The*_*024 5

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

[$-409]m/d/yy h:mm AM/PM;@
Run Code Online (Sandbox Code Playgroud)

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

问题:YMD 符号是本地化的,因此在例如德国系统上变成了 JMT。因此,您可能必须根据您的情况调整格式字符串,但我希望它的行为类似于使用不同语言的系统上的公式(自动翻译)(正如您似乎知道的那样)。

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

在这里查看语言环境列表:http : //support.microsoft.com/kb/221435

  • 但它没有回答我的问题。我希望能够在我的 Excel 工作表中写入 dd/mm/yyyy,即使操作系统需要“jj/mm/aaaa”。我尝试更改我的操作系统区域设置并且输出正在更改,然后 Excel 不会根据用户的区域设置进行调整。如果我写“jj.mm.aaaa”(如法语)并将我的语言环境更改为美国,Excel 将显示:“jj.03.aaaa”,它没有经过调整。 (2认同)