如何在Excel中制作掩码?
我在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”)”但有错误另一个例子说明为什么电子表格软件不适
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)