2017-09-22 2 views
2

J'ai une colonne de type texte dans Excel avec ces valeursComment créer un masque dans Excel?

2/02/1472 
22/88/1234 
1/8/1234 
22/88/12 
01/01/222 
88/2222 

Je veux mettre un masque que mes valeurs ne ressemblent à ce

02/02/1472 
22/88/1234 
01/08/1234 
22/88/1200 
01/01/2220 
00/88/2222 

Mon masque est 00/00/0000 (si une partie n'existe pas, remplir avec zéro)

-je utiliser ce "=text(A1,"00/00/0000")" mais ont erreur

+0

Je pense que vous devrez d'abord créer un format personnalisé, ou utiliser d'autres formules pour le créer. Parce que sur le premier et deuxième ##/s'il n'y a qu'un seul chiffre, un zéro est ajouté à gauche et s'il est/#### moins de 4 chiffres, les zéros sont ajoutés à droite. Avec cette information, vous pouvez faire une formule logique pour le faire. – danieltakeshi

+0

Le problème que vous avez est que vous essayez de faire un format numérique sur le texte – Tom

+0

Vous auriez besoin de code VBA pour le faire. –

Répondre

3

un autre exemple pourquoi un logiciel tableur est pas bien sui ted au texte de traitement, mais Excel peut gérer avec un (affreux) formule:

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

Une autre formule horrible pour vous (je l'ai cassé vers le bas, donc je suis en utilisant quelques colonnes d'aide que vous pouvez cacher si visuellement ça a l'air pareil). Une partie de la horribleness est également due à vos données source ne pas avoir un format cohérent

Dans la colonne A J'ai votre liste originale qui est stockée sous forme de texte (Excel ne reconnaît pas ces derniers comme une date ou nombre) Dans colonne B pour obtenir la première partie, j'ai la formule

=IF(LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))=2, VALUE(LEFT(A2,FIND("/",A2)-1)),0) 

dans la colonne C pour obtenir le bit milieu je

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

puis dans la colonne D Je reçois le dernier bit en utilisant:

=RIGHT(A2,LEN(A2)-FIND("/",A2,IF(LEN(A2)-LEN(SUBSTITUTE(A2, "/", ""))=2,FIND("/",A2)+1,1))) 

Je mets alors tous ensemble dans la colonne E et le format à l'aide

=TEXT(B2,"00")&"/"&TEXT(C2, "00") &"/"&TEXT(D2,"0")&REPT(0,4-LEN(D2)) 

Pour obtenir votre sortie

Final Results

Vous pourriez bien sûr combiner tout cela en une seule formule, je l'ai juste décomposé pour un peu de clarté (bien que ce soit encore assez sombre):

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

Puisque vous mentionnez également vba dans vos balises, voici une fonction définie par l'utilisateur:

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 

enter image description here

EDIT

@pnuts ont fait remarquer que vos exemples montrent que la les deux premiers groupes sont remplis de gauche avec 0, mais le troisième groupe est rempli à droite avec zéro.

La modification suivante fait que:

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 

enter image description here

+0

Ceci est étrangement familier ..: D – AntiDrondert

+0

Quel est le point de la droite ("00/00 /" 'dans la dernière ligne dans ce? – Tom

+0

@Tom Dans le cas où il y a moins de trois groupes –

2

Une version légèrement plus courte:

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

La seule chose que vous voulez savoir est ceci:

LOOKUP(99^99,FIND("/",A2,ROW($1:$20)))

C'est la fonction pour trouver la dernière occurrence de /. Je suppose que la longueur maximale de la chaîne est de 20, donc vous pouvez la remplacer si nécessaire.

+0

@Tom, merci d'avoir attrapé ça. Je vais corriger et mettre à jour la réponse sous peu. – ian0411

+1

J'ai juste révisé ma réponse pour corriger les zéros de fin. – ian0411