这个问题有点老了,但是到目前为止,它似乎还没有答案。我还在许多站点上看到了类似的问题,但是还没有找到仅涉及内置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但实际上可能更易于维护的方法是:
- 使用正常的“单元格格式”对话框,将所需的日期格式应用于单元格。如果您愿意,此单元格可以位于隐藏的工作表上-不需要将其显示给最终用户。假设您将格式
yyyymmdd\_hhss
应用于单元格$ A $ 1(请注意,下划线必须如图所示进行转义)。
- 将
GetFormat
功能(如下所示)添加到工作簿中的VBA模块。
- 输入
=GetFormat($A$1, TRUE)
另一个单元格(例如$ B $ 1)
- 该函数将返回格式字符串的本地化版本。因此,即使您最初格式化$ A $ 1用
yyyymmdd\_hhss
,当您打开工作簿使用法语(例如)的计算机上,该功能将显示aaaammjj\_hhss
。
- 现在,只需在所有
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)。
以下是一些屏幕截图,可能会使情况更加清楚。
- 在图中,第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行),我们甚至在包含日期和月份名称时甚至可以保留恒定格式。
此方法适用于大多数语言环境,但是应注意,用于表示印度阿拉伯数字的脚本在所有语言环境中都不相同。因此,像尼泊尔(印度)语言环境这样的区域设置将导致日期格式“看起来”与美国日期不同。但是就数字的位置而言,它们实际上是相同的“格式”,它们只是对数字使用不同的符号。