date

J

jbat

Guest
bonjour à tous,

j'ai un problème que je vais résumer ainsi:

j'ai un chiffre qui peut être sous la forme 201.77.112.417 donc string ou sous la forme 201177112417 donc nombre.

avec ce chiffre je peux retrouver une date de naissance en effet, le 77 correspond à l'année de naissance et le 112 c'est le mois suivit du jour de naissance.

je suis en train de faire une fonction qui me sort cette date de naissance mais j'ai quelques petits soucis quant à concatener le tout sous forme de date jj.mm.aaaa.
voilà donc si queqlu'un a une astuce...
merci et bon week-end à tous
 
J

jbat

Guest
moi j'ai fait ça mais je reste perplexe sur ma formule isnumber...:
Function avs_naiss(no_avs As Variant)

'test le format'
If Application.WorksheetFunction.IsNumber(no_avs) = False Then
avs_naiss1 = False
ElseIf no_avs - Int(no_avs) = 0 Then
avs_naiss1 = True
Else: avs_naiss1 = False
End If
'test sur les points'
If Application.WorksheetFunction.IsNumber(no_avs) = False And Application.WorksheetFunction.IsNumber(mid(no_avs, 4, 1)) = False And Application.WorksheetFunction.IsNumber(mid(no_avs, 7, 1)) = False Then
avs_naiss2 = False
Else: avs_naiss2 = True
End If

If avs_naiss1 = False Or avs_naiss2 = False Then
avs_naiss = "#Error in No_AVS format!"
ElseIf Application.WorksheetFunction.IsNumber(mid(no_avs, 4, 1)) = True Then
avs_naiss3 = 1
Else: avs_naiss3 = 2
End If

If mid(no_avs, (4 + 2 * avs_naiss3), 1) = 0 Or mid(no_avs, (4 + 2 * avs_naiss3), 1) = 9 Then
avs_naiss = "#Error in No_AVS format!"
ElseIf mid(no_avs, 4 + 2 * avs_naiss3, 1) < 5 And Modulo(mid(no_avs, 5 + 2 * avs_naiss3, 2), 31) = 0 Then
avs_naiss = DateAdd("yyyy", mid(no_avs, 3 + avs_naiss3, 2), DateAdd("m", (mid(no_avs, 4 + 2 * avs_naiss3, 1) - 1) * 3 + 1 + Int(mid(no_avs, 5 + 2 * avs_naiss3, 2) / 31.5), DateAdd("d", 31, 0)))
Else: avs_naiss = DateAdd("yyyy", mid(no_avs, 3 + avs_naiss3, 2), DateAdd("m", (mid(no_avs, 4 + 2 * avs_naiss3, 1) - 5) * 3 + 1 + Int(mid(no_avs, 5 + 2 * avs_naiss3, 2) / 31.5), DateAdd("d", Modulo(mid(no_avs, 5 + 2 * avs_naiss3, 2), 31), 0)))
End If

If avs_naiss >= Date Then
avs_naiss = 1
Else: avs_naiss = avs_naiss
End If



'c11=IF(ISNUMBER(VALUE(No_AVS))=FALSE;FALSE;IF(No_AVS-TRUNC(No_AVS)=0;TRUE;FALSE))
'c12=AND(ISNUMBER(VALUE(No_AVS))=FALSE;ISNUMBER(1*MID(No_AVS;4;1))=FALSE;ISNUMBER(1*MID(No_AVS;7;1))=FALSE)
'=IF(OR(C11=TRUE;C12=TRUE)=TRUE;;RETURN("#ERROR IN No_AVS FORMAT!"))
'c14=IF(ISNUMBER(1*MID(No_AVS;4;1))=TRUE;1;2)
'=IF(OR(1*MID(No_AVS;4+2*C14;1)=0;1*MID(No_AVS;4+2*C14;1)=9)=TRUE;RETURN("#ERROR IN No_AVS FORMAT!");)
'c16=DATE(MID(No_AVS;3+C14;2);(MID(No_AVS;4+2*C14;1)-IF(1*MID(No_AVS;4+2*C14;1)<5;1;5))*3+1+TRUNC(MID(No_AVS;5+2*C14;2)/31.5);IF(MOD(MID(No_AVS;5+2*C14;2);31)=0;31;MOD(MID(No_AVS;5+2*C14;2);31)))
'c17=IF(C16>=NOW();1;C16)
'=RETURN(C17)'


End Function
 
J

jp

Guest
Re, et merci pour ta précision

Mais elle risque, du moins dans un premier d'en interresser d'autre plus musclé que moi...

Maintenant, pour revenir à mon coup de G......

S'il ne s'agit pas du même Luc et Belge à la fois.... Sorry for all..

jp
 
J

julien

Guest
valeur ou caractère?

j'ai écrit cette fonction dans le but de savoir si lorsque je rentre un chiffre du format 140.77.112.217 ou 14077112217 je puisse savoir si en position 4 il y a un point ou un chiffre et de ce fait si ma valeur est string ou nombre mais je n'arrive pas à rendre un résultat...

Function isnumberr(no_avs As Variant)
If Application.WorksheetFunction.IsNumber(mid(no_avs, 4, 1)) = False Then
avs_naiss1 = False
ElseIf no_avs - Int(no_avs) = 0 Then
avs_naiss1 = True
Else: avs_naiss1 = False
End If
isnumberr = avs_naiss1

End Function

quelqu'un sait-il pourquoi?

merci à tous
 
J

Jean-Marie

Guest
Re...

Voici une formule, attention les yeux 473 caractères (le 11 décembre)

=DATE(STXT(SUBSTITUE(A2;".";"");4;2);EQUIV(1;FREQUENCE(STXT(SUBSTITUE(A2;".";"");6;3)-(ENT(STXT(SUBSTITUE(A2;".";"");6;3)/500)*400);{101;132;163;201;232;263;301;332;363;401;432;463});0);STXT(SUBSTITUE(A2;".";"");6;3)-(ENT(STXT(SUBSTITUE(A2;".";"");6;3)/500)*400)-INDEX({101;132;163;201;232;263;301;332;363;401;432;463};EQUIV(1;FREQUENCE(STXT(SUBSTITUE(A2;".";"");6;3)-(ENT(STXT(SUBSTITUE(A2;".";"");6;3)/500)*400);{101;132;163;201;232;263;301;332;363;401;432;463});0);0)+1)

C'est une formule matricielle à Valider par Crtl+Shift+Entrer

Pour l'essai la cellule contenant la valeur était A2.

Je suis partie de la chaîne alpha 201.77.432.417, si tu n'as que des valeurs numériques tu peux supprimer SUBSTITUE(A2;".";"") par A2.

Pour faire plus court, j'ai utilisé la fonction fréquence qui évite de faire des SI(Tranches1;...;SI(Tranches2;....)
La fonction Equiv(1....) me retourne le numéro de la tranche donc le numéro du mois.

Après même opération pour le jour dans le mois

Bonne journée

@+Jean-Marie
 
M

Monique

Guest
Bonjour,

Tu peux essayer ces 2 formules, c'est un début de collection.

Si tes données se présentent avec des points :
=DATE((STXT(A7;5;2)+1900+SI(STXT(A7;5;2)*1<10;100));(CHOISIR(STXT(A7;8;1)-SI(STXT(A7;8;1)*1>4;4);1;4;7;10)+SI(STXT(A7;9;2)*1>31;1+SI(STXT(A7;9;2)*1>62;1)));STXT(A7;9;2)-SI(STXT(A7;9;2)*1>31;31+SI(STXT(A7;9;2)*1>62;31)))
Sinon :
=DATE((STXT(A8;4;2)+1900+SI(STXT(A8;4;2)*1<10;100));(CHOISIR(STXT(A8;6;1)-SI(STXT(A8;6;1)*1>4;4);1;4;7;10)+SI(STXT(A8;7;2)*1>31;1+SI(STXT(A8;7;2)*1>62;1)));STXT(A8;7;2)-SI(STXT(A8;7;2)*1>31;31+SI(STXT(A8;7;2)*1>62;31)))

La formule est décomposée dans le fichier joint.
 

Pièces jointes

  • SecuSuisse_Jbat.zip
    3.1 KB · Affichages: 15
J

jp

Guest
Re jbat,

Je viens de voir "rapide" le fichier de Monique, je n'ai pa encore eu le temps d'analyser, déjà que le débur n'est facile, mais cela semble très intééressant...

Bonne soirée (ah elle n'est encore commencée), bon on fait avec

jp
 
J

jbat

Guest
oui je l'étudie moi aussi mais pas facile...
j'ai encore une question:
la fonction mid() renvois un caractère comment je peut le transformer en valeur dans VBA? dans excel je fais =value(mid()) mais dans VBA ?

bonne soirée et surtout bon week end!
youhouhou!
 
M

Monique

Guest
Re,

Qu'il y ait ou non des séparateurs entre les différents éléments du n° :

=DATE((STXT(A9;5-SI(ESTNUM(A9);1);2)+1900+SI(STXT(A9;5-SI(ESTNUM(A9);1);2)*1<10;100));(CHOISIR(STXT(A9;8-SI(ESTNUM(A9);2);1)-SI(STXT(A9;8-SI(ESTNUM(A9);2);1)*1>4;4);1;4;7;10)+SI(STXT(A9;9-SI(ESTNUM(A9);2);2)*1>31;1+SI(STXT(A9;9-SI(ESTNUM(A9);2);2)*1>62;1)));STXT(A9;9-SI(ESTNUM(A9);2);2)-SI(STXT(A9;9-SI(ESTNUM(A9);2);2)*1>31;31+SI(STXT(A9;9-SI(ESTNUM(A9);2);2)*1>62;31)))
 
M

Monique

Guest
Re,

En anglais :

Avec des points dans le n°
=DATE((MID(A7,5,2)+1900+IF(MID(A7,5,2)*1<10,100)),(CHOOSE(MID(A7,8,1)-IF(MID(A7,8,1)*1>4,4),1,4,7,10)+IF(MID(A7,9,2)*1>31,1+IF(MID(A7,9,2)*1>62,1))),MID(A7,9,2)-IF(MID(A7,9,2)*1>31,31+IF(MID(A7,9,2)*1>62,31)))

Sans points, format nombre standard
=DATE((MID(A8,4,2)+1900+IF(MID(A8,4,2)*1<10,100)),(CHOOSE(MID(A8,6,1)-IF(MID(A8,6,1)*1>4,4),1,4,7,10)+IF(MID(A8,7,2)*1>31,1+IF(MID(A8,7,2)*1>62,1))),MID(A8,7,2)-IF(MID(A8,7,2)*1>31,31+IF(MID(A8,7,2)*1>62,31)))

Peu importe le format
=DATE((MID(A9,5-IF(ISNUMBER(A9),1),2)+1900+IF(MID(A9,5-IF(ISNUMBER(A9),1),2)*1<10,100)),(CHOOSE(MID(A9,8-IF(ISNUMBER(A9),2),1)-IF(MID(A9,8-IF(ISNUMBER(A9),2),1)*1>4,4),1,4,7,10)+IF(MID(A9,9-IF(ISNUMBER(A9),2),2)*1>31,1+IF(MID(A9,9-IF(ISNUMBER(A9),2),2)*1>62,1))),MID(A9,9-IF(ISNUMBER(A9),2),2)-IF(MID(A9,9-IF(ISNUMBER(A9),2),2)*1>31,31+IF(MID(A9,9-IF(ISNUMBER(A9),2),2)*1>62,31)))
 

Discussions similaires

Réponses
16
Affichages
655

Statistiques des forums

Discussions
312 109
Messages
2 085 382
Membres
102 877
dernier inscrit
robinet