如何在Excel中创build一个面具?
我在这些值的Excel中有一个文本types的列
2/02/1472 22/88/1234 1/8/1234 22/88/12 01/01/222 88/2222
我想设置一个我的价值观看起来像这样的面具
02/02/1472 22/88/1234 01/08/1234 22/88/1200 01/01/2220 00/88/2222
我的面具是00/00/0000(如果零件不存在,填零)
我使用这个"=text(A1,"00/00/0000")"
但有错误
既然你也在你的标签中提到vba
,这里是一个用户定义的函数:
Option Explicit Function FormatMask(S As String) As String Dim V Dim I As Long V = Split(S, "/") V(UBound(V)) = Format(V(UBound(V)), "0000") For I = UBound(V) - 1 To 0 Step -1 V(I) = Format(V(I), "00") Next I FormatMask = Right("00/00/" & Join(V, "/"), 10) End Function
编辑
@pnuts指出,你的例子显示前两个组左边填0,而第三组右边填0。
以下修改完成:
Option Explicit Function FormatMask(S As String) As String Dim V Dim I As Long V = Split(S, "/") 'This pads with 0's on the left 'V(UBound(V)) = Format(V(UBound(V)), "0000") 'For padding on right as you show for the last group only: V(UBound(V)) = Left(V(UBound(V)) & "0000", 4) For I = UBound(V) - 1 To 0 Step -1 V(I) = Format(V(I), "00") Next I FormatMask = Right("00/00/" & Join(V, "/"), 10) End Function
电子表格软件不适合文本处理的另一个例子,但Excel可以用一个(可怕的)公式来pipe理:
=IF(LEN(IF(LEN(A1)-LEN(SUBSTITUTE(A1,"/",""))=1,"00/"&A1,IF(LEFT(RIGHT(A1,3))="/",A1&"00",IF(LEFT(RIGHT(A1,4))="/",A1&"0",IF(MID(A1,2,1)="/","0"&A1,A1)))))=10,IF(LEN(A1)-LEN(SUBSTITUTE(A1,"/",""))=1,"00/"&A1,IF(LEFT(RIGHT(A1,3))="/",A1&"00",IF(LEFT(RIGHT(A1,4))="/",A1&"0",IF(MID(A1,2,1)="/","0"&A1,A1)))),SUBSTITUTE(IF(LEN(A1)-LEN(SUBSTITUTE(A1,"/",""))=1,"00/"&A1,IF(LEFT(RIGHT(A1,3))="/",A1&"00",IF(LEFT(RIGHT(A1,4))="/",A1&"0",IF(MID(A1,2,1)="/","0"&A1,A1)))),"/","/0",1))
另一个可怕的公式(我已经把它分解了,所以我使用了几个帮助列,你可以隐藏起来,看起来是一样的)。 恐怖的一部分也是由于你的源数据没有一致的格式
在列A
我已经得到了你的原始列表,这是作为文本存储(Excel不会将它们识别为date或数字)在列B
中获得第一部分我有公式
=IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=2, VALUE(LEFT(A2,FIND("/",A2)-1)),0)
在列C
获取中间位,我有
=LEFT(RIGHT(A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=2,LEN(A2)-FIND("/",A2),LEN(A2))),FIND("/",RIGHT(A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=2,LEN(A2)-FIND("/",A2),LEN(A2))))-1)
然后在D
列我得到最后一点使用:
=RIGHT(A2,LEN(A2)-FIND("/",A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2, "/", ""))=2,FIND("/",A2)+1,1)))
然后我把它们放在E
列中,并使用它进行格式化
=TEXT(B2,"00")&"/"&TEXT(C2, "00") &"/"&TEXT(D2,"0")&REPT(0,4-LEN(D2))
得到你的输出
你当然可以将这一切合并成一个公式,我只是把它分解成一点清晰(虽然还是很暗淡):
=TEXT(IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=2, VALUE(LEFT(A2,FIND("/",A2)-1)),0),"00")&"/"&TEXT(LEFT(RIGHT(A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=2,LEN(A2)-FIND("/",A2),LEN(A2))),FIND("/",RIGHT(A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=2,LEN(A2)-FIND("/",A2),LEN(A2))))-1), "00") &"/"&TEXT(RIGHT(A2,LEN(A2)-FIND("/",A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2, "/", ""))=2,FIND("/",A2)+1,1))),"0")&REPT(0,4-LEN(RIGHT(A2,LEN(A2)-FIND("/",A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2, "/", ""))=2,FIND("/",A2)+1,1)))))
略短一点的版本:
=IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=1,"00",TEXT(LEFT(A2,FIND("/",A2)-1),"00"))&"/"&TEXT(IFERROR(MID(A2,FIND("/",A2)+1,LOOKUP(99^99,FIND("/",A2,ROW($1:$20)))-FIND("/",A2)-1),TEXT(LEFT(A2,FIND("/",A2)-1),"00")),"00")&"/"&LEFT(RIGHT(A2,LEN(A2)-LOOKUP(99^99,FIND("/",A2,ROW($1:$20))))*10000,4)
唯一你想知道的是这样的:
LOOKUP(99^99,FIND("/",A2,ROW($1:$20)))
这是查找/
最后一次出现的function。 我假设string的最大长度是20,所以你可以replace,如果需要的话。