Verification siren et siret v2

Contenu du snippet

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

A voir également

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.