Je vous donne la solution sur laquelle je travaille depuis 90mn ! juste testée, mais il faudrait plusieurs utilisateurs.
Le code Luhn de vérification :
Function isLuhnAlphaNValid(chaine As String, code As String) As Boolean
iteration = Len(code)
chaine = chaine & code
NewChaine = ""
For n = 1 To Len(chaine) - iteration
CodeAsc = Asc(Mid(chaine, n, 1))
If CodeAsc < 100 Then
NewChaine = NewChaine & "0" & Asc(Mid(chaine, n, 1))
Else
NewChaine = NewChaine & Asc(Mid(chaine, n, 1))
End If
Next
isLuhnAlphaNValid = True
For m = 1 To iteration
isLuhnAlphaNValid = isLuhnAlphaNValid And isLuhnValidTemp(NewChaine & (Mid(chaine, n, m)))
Next
End Function
Function isLuhnValidTemp(chaine) As Boolean
For n = Len(chaine) To 1 Step -1
i = CInt(Mid(chaine, n, 1)): If b Then i = i * 2
If i > 9 Then t = t + (i Mod 10) + 1 Else t = t + i
If b Then b = False Else b = True
Next
If t Mod 10 = 0 Then isLuhnValidTemp = True
End Function
A l'ouverture du fichier :
Private Sub Workbook_Open()
Dim codealpha As String
' creation nom si inexistant
flag = False
For Each nm In ThisWorkbook.Names
If nm.Name = "luhn" Then flag = True: Exit For
Next
If Not flag Then ThisWorkbook.Names.Add Name:="luhn", RefersTo:="=""|"""
controleacces:
tbl = Split(Replace(Names("luhn").RefersTo, """", ""), "|")
If UBound(tbl) = 1 Then GoTo codeacces
For i = 1 To UBound(tbl) - 1
codealpha = tbl(i)
If isLuhnAlphaNValid(Environ("username"), codealpha) Then GoTo acces
Next
codeacces:
Do
code = Application.InputBox("Votre code d'accès ?", Type:=1, Title:="Saisir de 4 à 6 chiffres")
Loop While (Len(code) < 4 Or Len(code) > 6) And code <> False
If code = False Then MsgBox "Opération annulée !": ThisWorkbook.Close
codealpha = code
If Not isLuhnAlphaNValid(Environ("username"), codealpha) Then MsgBox "Code erroné !": ThisWorkbook.Close
Names("luhn").RefersTo = "=""" & Replace(Replace(Names("luhn").RefersTo, """", ""), "=", "") & codealpha & "|"""
acces:
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Accueil" Then Ws.Visible = True
Next Ws
End Sub
cette procédure permet d'accumuler les codes propres à plusieurs "premiers" utilisateurs de sorte que si le fichier est sur le réseau il puisse être lus par plusieurs sans que chacun n'ait à retaper son code.
A la fermeture :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Ws As Worksheet
Sheets("Accueil").Visible = True
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Accueil" Then Ws.Visible = xlSheetVeryHidden
Next Ws
ActiveWorkbook.Close savechanges:=True
End Sub
afin que si les macros ne sont pas activées on ne puisse pas accéder aux onglets.
Il faudra aussi protéger la macro elle-même.
Enfin un outil d'administration pour déterminer le code d'accès