小伙伴们好,今天来和大家分享一道时间格式转换的题目。时间问题也是EXCEL中的一个大类问题,但时间的转换题目都是有一些难度的,熟练地掌握并应用时间问题也是EXCELer的必备技能之一。
今天的题目是这样的:
题目要求将A列的格式转换成B列的格式。格式的转换可以使用TEXT函数,但在此之前,需要将源数据转换为EXCEL可以识别的时间格式,即要报源数据中的年、月份都转换为其最小单位—月份。
上面也是处理这道题目的逻辑思路。
01
TEXT函数巧妙解决时间格式问题
在单元格D2中输入下列公式,三键确认并向下拖曳即可。
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TEXT(SUM(IFERROR(RIGHTB(LEFT(SUBSTITUTE(A2,"6月","6个月"),FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")-1),2)*{12,1},0))/12,"00年00个月/12个月"),"/12个月",),"00个月",),"00年",)
公式写出来比较长,其核心的部分有两部分:时间格式的转换及时间汇总;TEXT函数格式设置。
SUBSTITUTE(A2,"6月","6个月")
由于源数据中有一个数据的格式和最终的要求不符,这里先单独处理一下。
SUBSTITUTE(A2,"6月","6个月")&"年个月"
替换好后,在这个字符串后添加“年个月”,生成一个新的字符串。
FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")
利用FIND函数,在这个新字符串中查找“年”和“个月”的位置。这部分返回的结果是{2,4}。
LEFT(SUBSTITUTE(A2,"6月","6个月"),FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")-1)
利用LEFT函数从左侧分别提取长度为1和3的字符串,其结果为{"6","6年6"}。
RIGHTB(LEFT(SUBSTITUTE(A2,"6月","6个月"),FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")-1),2)
利用RIGHTB函数从右侧提取长度为2个字节的字符串。其结果为{"6"," 6"}。
IFERROR(RIGHTB(LEFT(SUBSTITUTE(A2,"6月","6个月"),FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")-1),2)*{12,1},0)
上面一步的结果乘以{12,1},这一步的作用是将所有的时间都转换为最小单位:月。IFERROR函数将错误值转换为0。
SUM(IFERROR(RIGHTB(LEFT(SUBSTITUTE(A2,"6月","6个月"),FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")-1),2)*{12,1},0))/12
利用SUM函数求和后再除以12,得到了年数。到此处,我们已将源数据转换为EXCEL可以时间的时间了。
TEXT(SUM(IFERROR(RIGHTB(LEFT(SUBSTITUTE(A2,"6月","6个月"),FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")-1),2)*{12,1},0))/12,"00年00个月/12个月")
利用TEXT函数将上一步的结果转换为“00年00个月”的格式。
SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TEXT(SUM(IFERROR(RIGHTB(LEFT(SUBSTITUTE(A2,"6月","6个月"),FIND({"年","个月"},SUBSTITUTE(A2,"6月","6个月")&"年个月")-1),2)*{12,1},0))/12,"00年00个月/12个月"),"/12个月",),"00个月",),"00年",)
最后,多次使用SUBSTITUTE函数将不符合题意的"00个月"和"00年"都替换为空值。
朋友们,如果你们把公式中的"00年00个月/12个月"替换为"#年#个月/12个月",猜猜看会有什么神奇的变化呢?
详细的内容请参看帖子你知道如何将年龄精确计算到天数吗?
本期内容练习文件提取方式:
链接:https://pan.baidu.com/s/1mtsDytGPFnI8asYmCsAwAQ?pwd=z2rg
提取码:z2rg