如何在Excel中制作掩码?

如何在Excel中制作掩码?,excel,excel-formula,excel-2010,vba,Excel,Excel Formula,Excel 2010,Vba,我在excel中有一个包含这些值的文本类型列 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”)”但有错误另一个例子说明为什么电子表格软件不适

我在excel中有一个包含这些值的文本类型列

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”)”
但有错误

另一个例子说明为什么电子表格软件不适合文本处理,但Excel可以使用(可怕的)公式进行管理:


对你来说,另一个可怕的公式(我把它分解了,所以我使用了几个辅助列,你可以把它们隐藏起来,使它们看起来一样)。可怕的部分原因还在于源数据的格式不一致

在列
A
中,我得到了您的原始列表,该列表存储为文本(Excel不会将其识别为日期或数字) 在列
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))
获取您的输出

当然,你可以把这一切结合到一个公式中,我只是把它分解了一下,以便更清楚一点(尽管仍然很凄凉):


由于您在标签中也提到了
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

略短的版本:

=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))


此函数用于查找上次出现的
/
。我假设字符串的最大长度为20,因此您可以在需要时替换它。

我认为您需要先创建一个自定义格式,或者使用其他公式来创建它。因为在第一个和第二个############################。有了这些信息,你可以制作一些公式逻辑来制作它。你遇到的问题是,你试图在文本上做一个数字格式,你需要一些VBA代码来完成。18的结果是什么
00/18/0000
18/00/0000
00/00/0018
?根据此逻辑,
01/01/222
应为
01/01/0222
,否?或者这就是问题的关键?这是一种奇怪的熟悉d
对的意思是什么(“00/00/”
在这最后一行?@Tom,以防少于三组。@pnuts是的,我想它已经传遍了整个房间;)@Tom,谢谢你的关注。我将很快修复并更新答案。刚刚修改了我的答案以修复尾随的零。
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
=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)