假设您的源日期是一个字符串并且它位于单元格 D10 中,您需要做的第一件事是将其转换为 excel 日期时间序列。在 Excel 日期时间序列中,有几点需要注意。
- 数字的整数部分在 windows 中表示自 1900 年 1 月 1 日以来的天数,在 mac 上我认为是 1904 年
- 数字的小数部分表示一天中的时间。 0.5 代表中午。 VBA 的有效 Excel 时间是 00:00 到 23:59:59。 24:00 不是有效时间,但它适用于一些 excel 公式
因此,为了将您的字符串转换为 Excel 日期序列,我们需要提取组件并将它们转储到 DATE() 函数中。日期函数由三个参数组成:
DATE(year,month,day)
除了这些值必须是数字之外,非常简单。我们为什么不开始将您的信息从最大的单位拉到最小的单位。
谢天谢地,您的字符串长度一致。您的个位数前导 0,因此它们将占用与两位数相同的空间。所以这种方法一直有效到 9999 年,但我认为我们现在不必太担心。
为了提取年份,我们查看它在您的字符串中的位置以及它有多长。因此,通过简单地计算,我们知道它从第 8 个字符位置开始,长度为 4 个字符。我们将此信息与 MID() 函数一起使用
=MID(D10,8,4)
为了提取月份,它变得有点复杂,因为我们需要将它从缩写转换为数字。有几种方法可以做到这一点。你可以写一个很长的 IF 语句,最后会重复一个月的拉动 11 次。相反,我决定使用 MATCH() 函数并在其中构建了一个月份缩写数组。 MATCH() 函数将返回您在提供的搜索列表中搜索的内容的数量/位置。所以只要我们按时间顺序输入月份,它们的位置就会对应它们的数值。因此,我们的公式将如下所示:
MATCH(LEFT(D10,3),{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"},0)
LEFT() 函数用于从字符串中提取月份缩写。最后的 0 告诉 match 寻找精确匹配。需要注意的是,这种匹配方法不区分大小写。
现在,我们采用与拉年相同的负责人的那一天,我们最终得到:
=MID(D10,5,2)
我们现在可以将年月日的每个公式替换到 DATE() 函数中,我们将获得 excel 日期序列的日期部分。公式应如下所示:
=DATE(MID(D10,8,4),MATCH(LEFT(D10,3),{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"},0),MID(D10,5,2))
现在您需要添加时间部分或计算小数部分。为此,我首先建议尝试使用 TIMEVALUE() 函数。由于时间格式在格式上往往比日期更标准,因此它适用于您的可能性要高得多。为了使用 TIMEVALUE(),需要从字符串中提取时间部分。这可以通过 RIGHT() 函数轻松完成,如下所示:
=RIGHT(D10,8)
这将为您提供时间部分,然后可以将其替换到 TIMEVALUE() 函数中,如下所示:
=TIMEVALUE(RIGHT(D10,8))
如果 TIMEVALUE() 函数对您不起作用,那么您需要去掉小时、分钟和秒,并将它们的结果转储到 TIME() 函数中。以与为 DATE() 函数提取年份和日期相同的方式执行此操作。只需更新您的字符数。 TIME() 使用如下三个参数:
TIME(HOUR,MINUTES,SECONDS)
现在您已经确定了日期部分和时间部分,您只需将它们加在一起,即可将所有信息放入一个单元格中。生成的公式将如下所示:
=DATE(MID(D10,8,4),MATCH(LEFT(D10,3),{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"},0),MID(D10,5,2))+TIMEVALUE(RIGHT(D10,8))
无论您何时将该公式放在最后,请记住将单元格上的格式更改为自定义日期。如下图输入单元格自定义格式。
如果您有一列要转换的日期时间列表,只需将公式和格式化的单元格复制到您需要的位置即可。
概念证明
使用的公式
有关上述公式中使用的函数的更多信息,请点击以下链接:
{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC "}
{ } 用于构建自定义列表或静态数组。