如何在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,如果需要的话。