Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Validation NAS canadien sans VBA

28 réponses
Avatar
Denys
Bonjour =E0 tous,

Existe-t-il une formule pour valider un num=E9ro d'assurance sociale
canadien ? Je connais la version VBA, mais cette fois j'aimerais avoir
une formule sans VBA, autrement dit, si j'entre un num=E9ro en B1, je
mettrais la formule en C1 qui dirait si le no est valide ou pas....

Merci pour votre temps....et Joyeuses F=EAtes....

Denys

10 réponses

1 2 3
Avatar
Tatanka
Dans le même ordre d'idée :
Comment se faire du fric en gageant qu'on
peut deviner le dernier chiffre d'un numéro
d'assurance sociale (au Québec en tous cas) :

Sub Devine_Le_Dernier()
Dim v(1 To 8) As Integer
n = InputBox("Entrez les huit premiers chiffres" & _
Chr(13) & "de votre numéro d'assurance-sociale :")
For i = 1 To 8
If i Mod 2 = 0 Then
v(i) = 2 * Mid(n, i, 1)
If v(i) >= 10 Then
v(i) = 1 + Right(v(i), 1)
End If
Else
v(i) = Mid(n, i, 1)
End If
s = s + v(i)
Next i
MsgBox "Le dernier chiffre DOIT ÊTRE un " & _
10 * (Int(s / 10) + 1) - s & ".", _
vbInformation, "Chiffre-preuve"
End Sub

Joyeux Noël !
Serge
Avatar
bcar
Sous Excel 2010 (en français)
Soit ton numéro en A1

la formule suivante devrait répondre à ton besoin :
=SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;
MOD(2*STXT($A$1;{1;2;3;4;5;6;7;8;9};1);10)
+ENT(2*STXT($A$1;{1;2;3;4;5;6;7;8;9};1)/10);
0+STXT($A$1;{1;2;3;4;5;6;7;8;9};1)))

si le chiffre obtenu et divisible par 10 c'est un numéro valide
(utiliser la fonction MOD)

Apparemment, il n'y a même pas besoin du sommeprod, un simple somme
suffit...

Le 23/12/2010 15:59, Denys a écrit :
Bonjour à tous,

Existe-t-il une formule pour valider un numéro d'assurance sociale
canadien ? Je connais la version VBA, mais cette fois j'aimerais avoir
une formule sans VBA, autrement dit, si j'entre un numéro en B1, je
mettrais la formule en C1 qui dirait si le no est valide ou pas....

Merci pour votre temps....et Joyeuses Fêtes....

Denys
Avatar
LSteph
Bonjour les amis,

Désolé ces numéros NAS cela doit être typiquement .CA selon le ret our
direct de google..
sinon j'aurais au moins essayé.

Alors je viens quand même intervenir ici car
il me semble que le Monsieur vous demande
depuis le début s'il existe une solution sans VBA.

Cordialement.

--
LSteph



On 23 déc, 18:54, isabelle wrote:
pour une formulle perso,

Function nas(cellule As Range) As String
x = Application.Substitute(cellule, "-", "")
For i = 1 To Len(x)
Select Case i
     Case 2, 4, 6, 8
         y = Mid(x, i, 1) * 2
         If y >= 10 Then y = CDbl(Mid(y, 1, 1)) + CDbl(Mid( y, 2, 1))
         r = r + y
     Case Else
         r = r + CDbl(Mid(x, i, 1))
     End Select
Next
If r Mod 10 = 0 Then
   nas = "VRAI"
Else
   nas = "FAUX"
End If
End Function

isabelle

Le 2010-12-23 11:48, isabelle a crit :



> bonjour Denys,

> en attendant que Denis revienne,

> Sub Test_NAS()
> x = Application.Substitute(Range("A1"), "-", "")
> For i = 1 To Len(x)
> Select Case i
> Case 2, 4, 6, 8
> y = Mid(x, i, 1) * 2
> If y >= 10 Then y = CDbl(Mid(y, 1, 1)) + CDbl(Mid(y, 2, 1))
> r = r + y
> Case Else
> r = r + CDbl(Mid(x, i, 1))
> End Select
> Next
> MsgBox r
> End Sub

> passe de bonne f te,
> isabelle

> Le 2010-12-23 11:10, michdenis a crit :
>> POUR VALIDER UN NAS, PROC DER DE LA FA ON SUIVANTE :
>> -- INSCRIRE le NAS sur une feuille de papier, comme suit: 044-096-857;
>> -- COCHER le deuxi me, quatri me, sixi me et huiti me chiffre;
>> -- INSCRIRE le NAS de nouveau, mais cette fois en multipliant par deux
>> les chiffres mentionn s, comme suit : 084-0912-8107.

>> LORSQUE CETTE MULTIPLICATION DONNE UN NOMBRE DEUX CHIFFRES, ALORS :
>> -- ADDITIONNER ces deux chiffres pour n'en faire qu'un seul,
>> -- ET additionner l'ensemble de ces chiffres, soit :
>> 0+8+4+0+9+1+2+8+1+0+7 = 40.

>> SI LE TOTAL QUI EN R SULTE EST UN MULTIPLE DE DIX, LE NAS EST VALIDE.
>> Donc, le NAS ci-dessus est valide, puisque le total est 40.

>> Si tu as besoin d'une fonction personnalis e pour faire cela, je serai
>> de retour
>> en PM...et j'y regarderai de plus pr s si j'ai le temps.- Masquer le t exte des messages précédents -

- Afficher le texte des messages précédents -
Avatar
michdenis
Bonjour,

à partir de la suggestion de Bcar, on pourrait utiliser cette formule

=SI(ARRONDI((SOMMEPROD(SI((MOD({1;2;3;4;5;6;7;8;9};2)=0)+(NBCAR(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";""))=9)=2;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);5)-ARRONDI((SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);0)=0;VRAI;FAUX)

Exemple : 244-244-244
Si l'usager tape une autre chose que 9 chiffres séparés par un "-" ou un espace, la fonction Retourne #Valeur
Autrement, la formule évalue la chaîne du NAS correctement et renvoie un Vrai ou Faux selon le cas.

En d'autres termes, la chaine peut avoir
un nombre indéterminé de "-" ou " "
elle doit avoir obligatoirement 9 chiffres
Si la cellule contient plus de 9 caractères (chiffre ou lettre) elle renvoie False
Tout autre caractère provoque une erreur représenté par #VALEUR!

Pour la compréhension, je préfère de loin, une fonction personnalisée!

MichD
--------------------------------------------
"LSteph" a écrit dans le message de groupe de discussion :


Bonjour les amis,

Désolé ces numéros NAS cela doit être typiquement .CA selon le retour
direct de google..
sinon j'aurais au moins essayé.

Alors je viens quand même intervenir ici car
il me semble que le Monsieur vous demande
depuis le début s'il existe une solution sans VBA.

Cordialement.

--
LSteph



On 23 déc, 18:54, isabelle wrote:
pour une formulle perso,

Function nas(cellule As Range) As String
x = Application.Substitute(cellule, "-", "")
For i = 1 To Len(x)
Select Case i
Case 2, 4, 6, 8
y = Mid(x, i, 1) * 2
If y >= 10 Then y = CDbl(Mid(y, 1, 1)) + CDbl(Mid(y, 2, 1))
r = r + y
Case Else
r = r + CDbl(Mid(x, i, 1))
End Select
Next
If r Mod 10 = 0 Then
nas = "VRAI"
Else
nas = "FAUX"
End If
End Function

isabelle

Le 2010-12-23 11:48, isabelle a crit :



> bonjour Denys,

> en attendant que Denis revienne,

> Sub Test_NAS()
> x = Application.Substitute(Range("A1"), "-", "")
> For i = 1 To Len(x)
> Select Case i
> Case 2, 4, 6, 8
> y = Mid(x, i, 1) * 2
> If y >= 10 Then y = CDbl(Mid(y, 1, 1)) + CDbl(Mid(y, 2, 1))
> r = r + y
> Case Else
> r = r + CDbl(Mid(x, i, 1))
> End Select
> Next
> MsgBox r
> End Sub

> passe de bonne f te,
> isabelle

> Le 2010-12-23 11:10, michdenis a crit :
>> POUR VALIDER UN NAS, PROC DER DE LA FA ON SUIVANTE :
>> -- INSCRIRE le NAS sur une feuille de papier, comme suit: 044-096-857;
>> -- COCHER le deuxi me, quatri me, sixi me et huiti me chiffre;
>> -- INSCRIRE le NAS de nouveau, mais cette fois en multipliant par deux
>> les chiffres mentionn s, comme suit : 084-0912-8107.

>> LORSQUE CETTE MULTIPLICATION DONNE UN NOMBRE DEUX CHIFFRES, ALORS :
>> -- ADDITIONNER ces deux chiffres pour n'en faire qu'un seul,
>> -- ET additionner l'ensemble de ces chiffres, soit :
>> 0+8+4+0+9+1+2+8+1+0+7 = 40.

>> SI LE TOTAL QUI EN R SULTE EST UN MULTIPLE DE DIX, LE NAS EST VALIDE.
>> Donc, le NAS ci-dessus est valide, puisque le total est 40.

>> Si tu as besoin d'une fonction personnalis e pour faire cela, je serai
>> de retour
>> en PM...et j'y regarderai de plus pr s si j'ai le temps.- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -
Avatar
LSteph
Bonjour,

Pour la compréhension


En effet, au vu de cela plus que pour la compréhension, vu l'alambiquage
d'alambic, je comprends mieux ,
sans VBA possible mais très lourd...
une sub pour ce genre de cas, prendra une fois pour toute quand on le
souhaite le temps d'obtenir la subsitution,
sinon gare aux recalculs si une telle formule même sous forme de fonction
personalisée doit oeuvrer sur de nombreuses lignes d'un tableau .
Si l'usager tape


a fortiori, si c'est juste sur la frappe de l'utilisateur la première forme
que tu envisageais private sub, limiterait avantageusement à la cible.

--
LSteph

"michdenis" a écrit dans le message de
news:ifav6l$i58$
Bonjour,

à partir de la suggestion de Bcar, on pourrait utiliser cette formule

=SI(ARRONDI((SOMMEPROD(SI((MOD({1;2;3;4;5;6;7;8;9};2)=0)+(NBCAR(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";""))=9)=2;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);5)-ARRONDI((SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);0)=0;VRAI;FAUX)

Exemple : 244-244-244
Si l'usager tape une autre chose que 9 chiffres séparés par un "-" ou un
espace, la fonction Retourne #Valeur
Autrement, la formule évalue la chaîne du NAS correctement et renvoie un
Vrai ou Faux selon le cas.

En d'autres termes, la chaine peut avoir
un nombre indéterminé de "-" ou " "
elle doit avoir obligatoirement 9 chiffres
Si la cellule contient plus de 9 caractères (chiffre ou lettre) elle
renvoie False
Tout autre caractère provoque une erreur représenté par #VALEUR!

Pour la compréhension, je préfère de loin, une fonction personnalisée!

MichD
--------------------------------------------
"LSteph" a écrit dans le message de groupe de discussion :


Bonjour les amis,

Désolé ces numéros NAS cela doit être typiquement .CA selon le retour
direct de google..
sinon j'aurais au moins essayé.

Alors je viens quand même intervenir ici car
il me semble que le Monsieur vous demande
depuis le début s'il existe une solution sans VBA.

Cordialement.

--
LSteph



On 23 déc, 18:54, isabelle wrote:
pour une formulle perso,

Function nas(cellule As Range) As String
x = Application.Substitute(cellule, "-", "")
For i = 1 To Len(x)
Select Case i
Case 2, 4, 6, 8
y = Mid(x, i, 1) * 2
If y >= 10 Then y = CDbl(Mid(y, 1, 1)) + CDbl(Mid(y, 2, 1))
r = r + y
Case Else
r = r + CDbl(Mid(x, i, 1))
End Select
Next
If r Mod 10 = 0 Then
nas = "VRAI"
Else
nas = "FAUX"
End If
End Function

isabelle

Le 2010-12-23 11:48, isabelle a crit :



> bonjour Denys,

> en attendant que Denis revienne,

> Sub Test_NAS()
> x = Application.Substitute(Range("A1"), "-", "")
> For i = 1 To Len(x)
> Select Case i
> Case 2, 4, 6, 8
> y = Mid(x, i, 1) * 2
> If y >= 10 Then y = CDbl(Mid(y, 1, 1)) + CDbl(Mid(y, 2, 1))
> r = r + y
> Case Else
> r = r + CDbl(Mid(x, i, 1))
> End Select
> Next
> MsgBox r
> End Sub

> passe de bonne f te,
> isabelle

> Le 2010-12-23 11:10, michdenis a crit :
>> POUR VALIDER UN NAS, PROC DER DE LA FA ON SUIVANTE :
>> -- INSCRIRE le NAS sur une feuille de papier, comme suit: 044-096-857;
>> -- COCHER le deuxi me, quatri me, sixi me et huiti me chiffre;
>> -- INSCRIRE le NAS de nouveau, mais cette fois en multipliant par deux
>> les chiffres mentionn s, comme suit : 084-0912-8107.

>> LORSQUE CETTE MULTIPLICATION DONNE UN NOMBRE DEUX CHIFFRES, ALORS :
>> -- ADDITIONNER ces deux chiffres pour n'en faire qu'un seul,
>> -- ET additionner l'ensemble de ces chiffres, soit :
>> 0+8+4+0+9+1+2+8+1+0+7 = 40.

>> SI LE TOTAL QUI EN R SULTE EST UN MULTIPLE DE DIX, LE NAS EST VALIDE.
>> Donc, le NAS ci-dessus est valide, puisque le total est 40.

>> Si tu as besoin d'une fonction personnalis e pour faire cela, je serai
>> de retour
>> en PM...et j'y regarderai de plus pr s si j'ai le temps.- Masquer le
>> texte des messages précédents -

- Afficher le texte des messages précédents -



Avatar
bcar
Bonjour,

Je ne crois pas qu'il y ait de séparateurs pour un numéro NAS.
Il doit par contre exister un formatage spécial Excel comme le formatage
"Numéro de sécurité sociale.

En admettant qu'il y ait des séparateurs, il y a (au moins) 2 autres
solutions (il est vrai que déjà ma formule est un peu longue alors avec
des substitute inclus dedans...) :

- une dans l'esprit de michdenis, ou on passerait par une cellule
intermédiaire pour convertir le nas dans un format sans séparateur
ex : A1 = 123-456-789
A2 = substitute(A1;"-";"")
A3 = la formule que j'ai proposé plus bas.

- une ou il faudrait modifier un peu les matrices de la formule que j'ai
donné de manière à ce que les séparateurs n'influent pas sur les calculs

Sinon j'ai aussi essayé de commettre un truc plus court et plus pratique
à manipuler (une seule référence à la cellule à vérifier(A1)) avec

=SOMMEPROD(INDEX({0;21;42;63;84;15;36;57;78;99};1+STXT($A$1;{1;2;3;4;5;6;7;8;9};1);1+MOD({1;2;3;4;5;6;7;8;9};2)))

ou encore

=SOMMEPROD(INDEX({0;2;4;6;8;1;3;5;7;9;0;1;2;3;4;5;6;7;8;9};1+STXT($A$1;{1;2;3;4;5;6;7;8;9};1)+SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;0;10)))

mais il y a un truc qui m'échappe car ca ne fonctionne pas (en fait ça
fait juste la somme de la matrice présentée dans index).
Si quelqu'un à 2 minutes pour regarder...

en fait je ne vois pas pourquoi avec

A1=1
A2=2
A3=3
B4=sommeprod(index({2;3;4;5};A1:A3))

ne fonctionne pas (mais en formule matricielle
(je m'attendrai à avoir 2+3+4=9)

Le 27/12/2010 22:07, michdenis a écrit :
Bonjour,

à partir de la suggestion de Bcar, on pourrait utiliser cette formule

=SI(ARRONDI((SOMMEPROD(SI((MOD({1;2;3;4;5;6;7;8;9};2)=0)+(NBCAR(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";""))=9)=2;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);5)-ARRONDI((SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);0)=0;VRAI;FAUX)

Exemple : 244-244-244
Si l'usager tape une autre chose que 9 chiffres séparés par un "-" ou un espace, la fonction Retourne #Valeur
Autrement, la formule évalue la chaîne du NAS correctement et renvoie un Vrai ou Faux selon le cas.

En d'autres termes, la chaine peut avoir
un nombre indéterminé de "-" ou " "
elle doit avoir obligatoirement 9 chiffres
Si la cellule contient plus de 9 caractères (chiffre ou lettre) elle renvoie False
Tout autre caractère provoque une erreur représenté par #VALEUR!



Oui la fonction personnalisée c'est mieux dans la plupart des cas (plus
lisible, possibilité d'y adjoindre des commentaires, facilité
d'implémentation, vérifications...)

Mais l'exercice est intéressant et il arrive parfois de devoir produire
des classeurs sans macros et il est toujours bon de savoir faire un
maximum de choses sans celles-ci

Pour la compréhension, je préfère de loin, une fonction personnalisée!

MichD
Avatar
Modeste
Bonsour®

"bcar" a écrit
Je ne crois pas qu'il y ait de séparateurs pour un numéro NAS.
Il doit par contre exister un formatage spécial Excel comme le formatage
"Numéro de sécurité sociale.

Le 27/12/2010 22:07, michdenis a écrit :
à partir de la suggestion de Bcar, on pourrait utiliser cette formule

=SI(ARRONDI((SOMMEPROD(SI((MOD({1;2;3;4;5;6;7;8;9};2)=0)+(NBCAR(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";""))=9)=2;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);5)-ARRONDI((SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);0)=0;VRAI;FAUX)





pour le fun ;o)))
http://www.cijoint.fr/cjlink.php?file=cj201012/cij5up4dsc.xls
Avatar
michdenis
Bonjour Modeste,

Intéressant si tu veux devenir un fonctionnaire canadien...
;-)

MichD
--------------------------------------------

"Modeste" a écrit dans le message de groupe de discussion : 4d19cc85$0$21683$

Bonsour®

"bcar" a écrit
Je ne crois pas qu'il y ait de séparateurs pour un numéro NAS.
Il doit par contre exister un formatage spécial Excel comme le formatage
"Numéro de sécurité sociale.

Le 27/12/2010 22:07, michdenis a écrit :
à partir de la suggestion de Bcar, on pourrait utiliser cette formule

=SI(ARRONDI((SOMMEPROD(SI((MOD({1;2;3;4;5;6;7;8;9};2)=0)+(NBCAR(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";""))=9)=2;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);5)-ARRONDI((SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);0)=0;VRAI;FAUX)





pour le fun ;o)))
http://www.cijoint.fr/cjlink.php?file=cj201012/cij5up4dsc.xls
Avatar
michdenis
Bonjour Bcar,

Effectivement, si les cellules ont un format spécial NAS canadien
on peut enlever de la formule les "Substitue" ce qui diminue la
longueur de la formule.

Une particularité à propos de ce format, c'est qu'il tient compte des
derniers 9 chiffres saisis.
Exemple, on saisit : 012 345 678
si on ajoute un chiffre de trop, un 9 par exemple, le contenu de la
cellule retient : 123 456 789 . En supposant que ce chiffre donne
aussi un résultat vrai, cela pourrait être une source d'erreur....!!!

Pour ce qui est de la formule, je vais laisser Lsteph te faire ses suggestions
il semble friand de formules ! ;-)

MichD
--------------------------------------------
"bcar" a écrit dans le message de groupe de discussion : ifc84u$mka$

Bonjour,

Je ne crois pas qu'il y ait de séparateurs pour un numéro NAS.
Il doit par contre exister un formatage spécial Excel comme le formatage
"Numéro de sécurité sociale.

En admettant qu'il y ait des séparateurs, il y a (au moins) 2 autres
solutions (il est vrai que déjà ma formule est un peu longue alors avec
des substitute inclus dedans...) :

- une dans l'esprit de michdenis, ou on passerait par une cellule
intermédiaire pour convertir le nas dans un format sans séparateur
ex : A1 = 123-456-789
A2 = substitute(A1;"-";"")
A3 = la formule que j'ai proposé plus bas.

- une ou il faudrait modifier un peu les matrices de la formule que j'ai
donné de manière à ce que les séparateurs n'influent pas sur les calculs

Sinon j'ai aussi essayé de commettre un truc plus court et plus pratique
à manipuler (une seule référence à la cellule à vérifier(A1)) avec

=SOMMEPROD(INDEX({0;21;42;63;84;15;36;57;78;99};1+STXT($A$1;{1;2;3;4;5;6;7;8;9};1);1+MOD({1;2;3;4;5;6;7;8;9};2)))

ou encore

=SOMMEPROD(INDEX({0;2;4;6;8;1;3;5;7;9;0;1;2;3;4;5;6;7;8;9};1+STXT($A$1;{1;2;3;4;5;6;7;8;9};1)+SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;0;10)))

mais il y a un truc qui m'échappe car ca ne fonctionne pas (en fait ça
fait juste la somme de la matrice présentée dans index).
Si quelqu'un à 2 minutes pour regarder...

en fait je ne vois pas pourquoi avec

A1=1
A2=2
A3=3
B4=sommeprod(index({2;3;4;5};A1:A3))

ne fonctionne pas (mais en formule matricielle
(je m'attendrai à avoir 2+3+4=9)

Le 27/12/2010 22:07, michdenis a écrit :
Bonjour,

à partir de la suggestion de Bcar, on pourrait utiliser cette formule

=SI(ARRONDI((SOMMEPROD(SI((MOD({1;2;3;4;5;6;7;8;9};2)=0)+(NBCAR(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";""))=9)=2;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);5)-ARRONDI((SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1)))/10);0)=0;VRAI;FAUX)

Exemple : 244-244-244
Si l'usager tape une autre chose que 9 chiffres séparés par un "-" ou un espace, la fonction Retourne #Valeur
Autrement, la formule évalue la chaîne du NAS correctement et renvoie un Vrai ou Faux selon le cas.

En d'autres termes, la chaine peut avoir
un nombre indéterminé de "-" ou " "
elle doit avoir obligatoirement 9 chiffres
Si la cellule contient plus de 9 caractères (chiffre ou lettre) elle renvoie False
Tout autre caractère provoque une erreur représenté par #VALEUR!



Oui la fonction personnalisée c'est mieux dans la plupart des cas (plus
lisible, possibilité d'y adjoindre des commentaires, facilité
d'implémentation, vérifications...)

Mais l'exercice est intéressant et il arrive parfois de devoir produire
des classeurs sans macros et il est toujours bon de savoir faire un
maximum de choses sans celles-ci

Pour la compréhension, je préfère de loin, une fonction personnalisée!

MichD
Avatar
bcar
Notons tout de même que si l'onglet Feuil2 est fort bien présenté (mais
avec beaucoup d'étapes intermédiaires), l'onglet Feuil1 lui n'est pas
correct :

- la fonction "nas" a été mal traduite depuis un autre langage, il est
nécessaire de la corriger pour qu'elle fonctionne.

- la formule =DROITE(2*HEXDEC(DECHEX(ENT(A1/16)))+A1;1)="0" n'est pas
correcte non plus (par exemple avec 110 000 000). Je ne vois pas trop ce
que le créateur de la formule a voulu faire
(HEXDEC(DECHEX(X))=X donc je ne vois pas l'intérêt de cette opération)


Le 28/12/2010 12:39, Modeste a écrit :
Bonsour®

"bcar" a écrit
Je ne crois pas qu'il y ait de séparateurs pour un numéro NAS.
Il doit par contre exister un formatage spécial Excel comme le formatage
"Numéro de sécurité sociale.



Le 27/12/2010 22:07, michdenis a écrit :
à partir de la suggestion de Bcar, on pourrait utiliser cette formule

=SI(ARRONDI((SOMMEPROD(SI((MOD({1;2;3;4;5;6;7;8;9};2)=0)+(NBCAR(SUBSTITUE(SUBSTITUE($A$1;"-";"");"

";""))=9)=2;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"
";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"

";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"

";"");{1;2;3;4;5;6;7;8;9};1)))/10);5)-ARRONDI((SOMMEPROD(SI(MOD({1;2;3;4;5;6;7;8;9};2)=0;MOD(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"

";"");{1;2;3;4;5;6;7;8;9};1);10)+ENT(2*STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"

";"");{1;2;3;4;5;6;7;8;9};1)/10);0+STXT(SUBSTITUE(SUBSTITUE($A$1;"-";"");"

";"");{1;2;3;4;5;6;7;8;9};1)))/10);0)=0;VRAI;FAUX)





pour le fun ;o)))
http://www.cijoint.fr/cjlink.php?file=cj201012/cij5up4dsc.xls
1 2 3