Clef de Sécurité Sociale
Comment vérifier ou calculer une clef de sécurité sociale (française) en VBA ?
Solution
Le programme Visual Basic suivant (à taper dans un module standard) effectue le calcul et renvoie une chaîne de caractères de 2 positions. Vous pouvez ensuite comparer la clef fournie par l’utilisateur à celle calculée par la fonction ClefSecu()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
' --- ' CALCUL D'UNE CLEF DE SECURITE SOCIALE FRANCAISE ' --- ' Input : strNumero <- 13 premiers caractères du numéro de sécurité sociale ' Output : ClefSecu -> Clef sur 2 chiffres ' #Erreur en cas... d'erreur ' Function ClefSecu(ByVal strNumero As String) As String Dim dblNumero As Double, intReste As Integer ' Le numéro doit comporter 13 chiffres If Len(strNumero) <> 13 Then MsgBox "Le numéro doit comporter 13 chiffres.", vbExclamation ClefSecu = "#Erreur" Exit Function End If ' Conversion en Double dblNumero = CDbl(strNumero) ' Calcul du modulo 97 intReste = 97 - (dblNumero - Int(dblNumero / 97) * 97) ClefSecu = Format(intReste, "00") End Function |
Exemple d’utilisation
- Imaginez que vous ayez une zone de texte pour la saisie du numéro de sécurité sociale (sur un formulaire, donc). Cette zone s’appellera
txtNumero
pour l’exemple. - Ajoutez le code suivant dans l’événement
Avant MAJ
du formulaire concerné :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Private Sub Form_BeforeUpdate(Cancel As Integer) Dim strNumeroComplet As String Dim strNumero As String Dim strClef As String ' On nettoie un peu le numéro saisi... strNumeroComplet = Trim(Nz(Me.txtNumero, "")) ' Partie du numéro sans la clef de droite strNumero = Trim(Left(strNumeroComplet, Len(strNumeroComplet) - 2)) ' Partie "clef" saisie (2 caractères à droite du numéro complet) strClef = Right(strNumeroComplet, 2) ' On vérifie si la clef saisie et la clef calculée ' sont identiques If strClef <> ClefSecu(strNumero) Then MsgBox "Numéro de sécurité sociale incorrect !", vbExclamation Cancel = True End If End Sub |
Papyty > Merci pour le retour, ça pourra aider quelques visiteurs.
Bonjour,
Exemple d’utilisation avec formatage et en tenant compte des N° Corse.
Private Sub Nss_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim nc As Integer, S As String, S1 As String, S2 As String
Nss = UCase(Nss)
S = Replace(Trim(Nss), » « , « »)
S = Replace(S, « | », « »)
If InStr(7, S, « a », 1) = 7 Then
S = Replace(Trim(S), « a », 0)
S = S – 100000000
End If
If InStr(7, S, « b », 1) = 7 Then
S = Replace(Trim(S), « b », 0)
S = S – 200000000
End If
nc = Len(S)
If nc = 0 Then Exit Sub
If nc <> 15 Or Not IsNumeric(S) Then
MsgBox « Le numéro de sécurité sociale doit comporter 15 chiffres ou être vide », vbExclamation, « Info »
Cancel = True
Exit Sub
Else
S1 = Left(S, 13)
S2 = Right(S, 2)
If S2 <> ClefSecu(S1) Then
MsgBox « Le numéro de sécurité sociale comporte une erreur. » & Chr(10) _
& « Veuillez le corriger ou le laisser vide », vbExclamation, « Info »
Cancel = True
End If
End If
End Sub
Private Sub Nss_Change()
Dim nc As Integer, S As String
Nss = UCase(Nss)
S = Replace(Trim(Nss), » « , « »)
S = Replace(S, « | », « »)
nc = Len(S)
If nc = 0 Then Exit Sub
If (nc <> 15 And nc <> 13) Then
If S <> Nss Then Nss = S
Exit Sub
Else
S = Format(S, IIf(nc = 15, « 0 00 00 00 000 000|00 », _
« 0 00 00 00 000 000 »))
If InStr(7, S, « a », 1) = 7 Then
S = Replace(Trim(S), « a », 0)
S = Format(S, IIf(nc = 15, « 0 00 00 00 000 000|00 », _
« 0 00 00 00 000 000 »))
Mid(S, 10, 1) = « A »
End If
If InStr(7, S, « b », 1) = 7 Then
S = Replace(Trim(S), « b », 0)
S = Format(S, IIf(nc = 15, « 0 00 00 00 000 000|00 », _
« 0 00 00 00 000 000 »))
Mid(S, 10, 1) = « B »
End If
Nss = S
End If
End Sub
Si cela peux aider, dommage la mise en forme n’est conservée,
@+
Papyty
@lamu Content que ça fonctionne. 🙂 Bon développement !
Bonjour Monsieur,
Désolé pour le retard, je viens tout juste d’appliquer vos dernières recommandations, et « ÇA FONCTIONNE merveilleusement.
Mes félicitations pour le site et je vous remercie pour votre aide. Pour info, je gère une petite base de données (avec plusieurs utilisateurs) et je voulais installer un numéro de sécu ds un formulaire afin de ne pas avoir de doublons, et grâce à vous bien sûre, j’ai réussi. (je « ramais » depuis 1 mois sur ce numéro de sécu).
Avec mes Compliments. Merci.
@lamu J’ai posté un bout de code amélioré qui devrait corriger le problème. Remplace entière l’ancien bloc donné dans le paragraphe Exemple d’utilisation par le nouveau. Ça devrait mieux fonctionner !
D’abord, je vous remercie de m’avoir répondu. En effet, j’ai mis en place les 2 portions de code, après avoir valider l’enregistrement des 13 premiers chiffres, j’ai comme message « Numéro de sécurité sociale incorrect ! », et c’est à ce moment là que je n’arrive plus à comprendre (j’ai un champ [Clef] sur mon formulaire et même si je valider avec la clef à 2 chiffres du [txtNumero], le résultat est le même: « Numéro de sécurité sociale incorrect ! ». Je pense que le travail de comparaison de la [Clef] ne se fait pas dans ma démarche, mais après plusieurs jours d’essaies, je n’arrive toujours pas à solutionner cette gestion du Numéro de Sécu sur mon formulaire.
Avec mes Compliments. Merci.
@lamu Si tu as mis en place les 2 portions de code (la fonction et l’exemple du dessous), tu dois avoir un message lorsque tu essaies de valider un formulaire et que la clef est incorrecte.
En gros, tu fais une saisie complète de l’enregistrement, puis tu valides par
Maj+Entrée
(ou menu Enregistrement / Sauvegarder l’enregistrement).Bonjour,
Je n’arrive pas à faire afficher « ClefSecu = « #Erreur » » dans mon formulaire, doit-on ajouter une zone supplémentaire pour la clé.
(Sinon, je pense que j’ai dû compris à moité le programme).
Je vous remercie davance.
aroutcheff > C’est fait 🙂 J’ai ajouté l’exemple dans l’article lui-même.
Bonjour,
est-il possible d’afficher un exemple pour utiliser cette fonction ?
merci