【问题标题】:Excel using date/time with multiple different region formats. VB? Formulas?Excel 使用具有多种不同区域格式的日期/时间。 VB?公式?
【发布时间】:2011-09-08 16:56:43
【问题描述】:

我目前在美国东部标准时间,我公司使用的日期格式是

月/日/年 时:分:秒

我需要复制和粘贴从其他地区提取的日期/时间,它们具有混合格式。有的和我的格式一样,有的用的是英国格式

日/月/年时:分:秒

目前,我必须手动编辑英国格式以与其他格式匹配,这样我的日期公式就不会出现错误。这开始成为一个问题,因为我面临 200 多条记录,每条记录都有不同的时间。

有什么代码或公式可以用来解决这个问题吗?我知道日期时间格式可以通过系统区域设置来解决,但这无济于事,因为更改为任何一种格式仍然需要我手动编辑那些不受影响的..

我正在考虑使用 Visual Basic 进行迭代,使用每一行的唯一 ID 来识别它是英国还是美国。我在正确的轨道上吗?

否则有没有excel公式或方法可用?

提前致谢

【问题讨论】:

  • 问题是:其他地区的数据是作为“日期”输入的还是作为字符串输入的?
  • 我猜它的字符串。数据是从 Web 界面导出的,所以我无法确定它是导出为字符串还是日期。从外观上看..它似乎是字符串
  • 进入一个空单元格并尝试将 1 添加到日期。你得到一个数字结果......这是一个日期......你得到一个#VALUE错误......'t是一个字符串;-)我并不是要挑剔......但它决定了你的策略想用....
  • 那肯定是日期。因为我尝试做 Now() - C2 它给了我#VALUE。 C2 是复制原始数据的单元格
  • 澄清一下,日期是这样的09/08/2011 12:34:56吗?如果是这样,您怎么知道日期是美国 9 月 8 日还是英国 8 月 9 日?你怎么知道它是哪种格式?

标签: excel excel-2007 excel-formula vba


【解决方案1】:

您应该始终致力于将看起来像日期的内容转换为日期。日期将始终保持为日期,您可以以任何您想要的格式显示它。它甚至可以从一种语言过渡到另一种语言。

因此,如果您的来源是日期,那您就可以了。如果是字符串,我会这样做:

  1. 使用 =DATEVALUE() 转换源字符串 ...如果月份名称是系统语言,这将起作用
  2. 如果暂时无法更改系统语言,则下一个选项是 =DATE(yy,mm,dd),其中必须使用 =LEFT(...)、=MID(...) 创建参数, =RIGHT(...)
  3. 最终您必须将月份名称从一种语言转换为另一种语言,如下例所示:

    A1 包含JANFEBMAR...

    A2 包含JÄNFEBMÄR...

    转换公式=MID(A2;FIND("MAR";A1);3)

编辑回复凯尔的评论:

除了德国(奥地利)语言环境会立即将此字符串识别为日期这一事实之外,让我们将问题分解为可咀嚼的部分。您的日期字符串在 A1 中

  1. 时间部分很简单:它是一个附加项TIMEVALUE(RIGHT(A1;8))
  2. 拆分我们必须在动态位置与分隔符作斗争的日期。分隔符的位置可以通过

    找到

    2a) =FIND("/";A1;1) ... 找到第一个分隔符的位置

    2b) =FIND("/";A1;4) ... 第二个分隔符,假设第一个数字只能是 1 或 2 个字符,并且之前没有空格 - 或者我们必须用术语 (2a)+1 替换常量“4”

    2c) =FIND("/";A1;FIND("/";A1;1)+1) ... (2b) 的更安全版本

  3. 现在我们已经准备好构建我们的左中音和右音了

    3a) =LEFT(A1;FIND("/";A1;1)-1) ... 第一个数字 ... (2a)-1的长度

    3b) =MID(A1;FIND("/";A1;1)+1;FIND("/";A1;FIND("/";A1;1)+1)-FIND("/";A1;1)-1) ... 第二个数字 ... start:=(2a)+1, num_Chars=(2c)-(2a)-1

    3c) =MID(A1;FIND("/";A1;FIND("/";A1;1)+1)+1;4) ... 第三位数 ... start:=(2c)+1, num_chars = 4 - 假设年份总是 4 位数。更抽象的情况是 (3b) 与 (2c) 是 =FIND() 的第一个空白

如何解释第一个和第二个数字(即 MM/DD 或 DD/MM)取决于您。

  1. 现在是有趣的部分,即将所有这些公式连接到一个怪物中以获得日期

    4a) 首先输入 =DATE(1;2;3)

    4b) 将 1 替换为 (3c),将 2 替换为 (3b),将 3 替换为 (3a) ...不要复制前导“=”

    4c)=DATE(MID(A1;FIND("/";A1;FIND("/";A1;1)+1)+1;4);MID(A1;FIND("/";A1;1)+1;FIND("/";A1;FIND("/";A1;1)+1)-FIND("/";A1;1)-1);LEFT(A1;FIND("/";A1;1)-1))+TIMEVALUE(RIGHT(A1;8))

你看不到时间,只有日期! .... 请记住提供显示日期和时间的自定义单元格格式,即“DD.MM.YYYY hh:mm:ss”

好的...这个公式绝对不可读和不可理解,因此您可能希望在(临时)字段/列中显示中间结果。

而且这个公式只有在输入字符串或多或少严格格式化时才有效。它可以处理在第一个和第二个数字处添加的一些空白,但是从 YYYY 开始它变得很棘手。然后需要包含其他概念,例如在所有其他概念之前删除 =SUBSTITUTE(A1;" ";"") 的所有空白等。

提示:我总是像这样构建复杂的公式:将各个单元格中的术语分离出来,然后将它们合并到一个大公式中

【讨论】:

  • 不错 - 国际化注意事项: 取决于您的 Excel 版本(尤其是在美国或英国,公式分隔符是 ,(逗号)而不是 @987654335 @(分号)
  • @JMax ...感谢提醒和抱歉,是的,我经常忘记对我的公式进行英国化 - 我在德国(奥地利)语言环境中工作:-O
  • 假设我有一个字符串 2/9/2011 15:23:40 。现在是 9 月 2 日。我如何将时间包含在您提到的解决方案中?
猜你喜欢
  • 2019-09-14
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多