2 fonctions booléennes qui retournent True si
function 1 : le Siren passé en parametre est juste sinon False
function 2 : le Siret passé en parametre est juste sinon False
[Juste ou faux selon l'algorithme de la clé de luhn]
- peuvent recevoir un nombre "variant"
- controle strict du parametre entré
Source / Exemple :
Option Explicit
Public Function Siren_IsValid(ByVal pvValue As Variant) As Boolean
Dim i As Integer
Dim v As Integer
Dim iLuhnKey As Integer
Siren_IsValid = False
If Not IsNumeric(pvValue) Then Exit Function
If Len(Format$(CDbl(pvValue), "000000000")) <> 9 Then Exit Function
If pvValue = "000000000" Then Exit Function
iLuhnKey = 0
For i = 1 To Len(pvValue)
v = CInt(Mid$(pvValue, i, 1))
'*** Siren : les chiffres PAIRS pour le Siren sont doublés
If (i Mod 2) = 0 Then
v = v * 2
End If
If v >= 10 Then
iLuhnKey = iLuhnKey + (v - 9)
Else
iLuhnKey = iLuhnKey + v
End If
Next i
Siren_IsValid = (iLuhnKey Mod 10 = 0)
End Function
Public Function Siret_IsValid(ByVal pvValue As Variant) As Boolean
Dim i As Integer
Dim v As Integer
Dim iLuhnKey As Integer
Siret_IsValid = False
If Not IsNumeric(pvValue) Then Exit Function
If Len(Format$(CDbl(pvValue), "00000000000000")) <> 14 Then Exit Function
If pvValue = "00000000000000" Then Exit Function
If Not Siren_IsValid(Left$(pvValue, 9)) Then Exit Function
iLuhnKey = 0
For i = 1 To Len(pvValue)
v = CInt(Mid$(pvValue, i, 1))
'*** Siret : les chiffres IMPAIRS sont doublés
If (i Mod 2) = 1 Then
v = v * 2
End If
If v >= 10 Then
iLuhnKey = iLuhnKey + (v - 9)
Else
iLuhnKey = iLuhnKey + v
End If
Next i
Siret_IsValid = (iLuhnKey Mod 10 = 0)
End Function
Conclusion :
Remerciements à Jacques Presteau (CALCUL SIREN ET SIRET) pour la fourniture initiale du code.
Les améliorations sont les suivantes :
- meilleur contrôle de ce qui est transmis aux fonctions siren/siret. Les paramêtres doivent respecter le format "000000000", soit 9 caractéres "nombres" pour le siren et "00000000000000", soit 14 car "nombres" pour le siret. On peut chercher à passer par exemple le siren sous ce format "000 000 000", mais la fonction de check ne l'acceptera pas.
- De plus, si l'on passe vraiment la valeur "000000000" pour le siren ou "00000000000000" pour le siret, les fonctions respectives retournent faux.
- étant donné que les siren et siret sont des paramêtres variants, cette v2 est plus "utilisable" couplé à des formulaires (si null est passé, le check siret/siret est forcément faux).
- 25 fois plus rapide que le code v1 : hormis les considérations ci-dessus, j'avais pour un projet besoin d'une certaine rapidité de traitement et la fonction "s'intègre" très bien dans une requêtes qui checke beaucoup de siren ou siret
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.