Bonjour,
C'est bien ce qui répond au problème, je vous remercie.
En premier, merci encore pour votre concours. J'ai essayé d'insérer votre code concernant le calcul du Chksum avec l'opérateur XOR, en bas du code ci-dessous que j'utilise pour tester cette génération de codes uniques. Mais ça ne marche pas avec un message d'erreur : argument incorrect ou quelque chose comme ça. Je ne maitrise ni la syntaxe VBA, ni la logique VBA. J'ai essayé de déclarer les variables le plus logiquement du monde pour moi, mais je ne comprends pas vraiment ce qui cloche.
Le code ci-dessous provient d'un contributeur ayant posté sur un autre forum un générateur excel de codes dédoublonnés et archivés, mais ne permettant pas de sélectionner le nombre de codes. Quoi qu'il en soit, je le remercie également. J'ai juste tenté d'appliquer le checksum selon votre propre code qui fonctionne très bien, mais que je ne sais pas écrire : j'ai ajouté la variable Chksum et les lignes de votre code en essayant de les adapter aux variables déclarées, mais...
Si vous pouviez m'expliquer ce qui cloche, je me sentirais un peu moins bête. Merci encore pour votre attention
Option Explicit
Const Plage = "A1:A50"
Const carac = "23456789ABCDEFGHJKLMNPRSTUVWXYZ"
Sub Aleatoire()
Dim xrg As Range, cel As Range, x
Dim op1, op2, tail, i&, max&, total&, prefix, dico, n&
Dim tablo, Ou As Range, col&
Dim Chksum As String
Set xrg = Range(Plage): total = xrg.Count
'on efface la plage
xrg.ClearContents: Application.ScreenUpdating = False
op1 = UCase([g1]): op2 = UCase([g2]): tail = UCase([g3])
max = Len(carac): prefix = op1 & op2
Set dico = CreateObject("scripting.dictionary")
With Sheets("Archive")
'recherche de la clef (op1 & op2 & tail)
On Error Resume Next
Set Ou = .Rows("1:1").Find(op1 & op2 & tail, .Range("a1"), xlValues, xlWhole)
On Error GoTo 0
If Ou Is Nothing Then
Set Ou = .Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1)
End If
Ou = op1 & op2 & tail
tablo = .Range(Ou, .Cells(.Rows.Count, Ou.Column).End(xlUp))
If IsArray(tablo) Then
For i = 2 To UBound(tablo): dico(tablo(i, 1)) = "": Next i
End If
total = total + dico.Count
End With
Randomize
Do
x = prefix
For i = 3 To tail
x = x & Mid(carac, 1 + (Int((Rnd * 1000000)) Mod max), 1)
Next i
dico(x) = ""
Loop Until dico.Count = total
On Error Resume Next
If IsArray(tablo) Then For i = 2 To UBound(tablo): dico.Remove tablo(i, 1): Next i
On Error GoTo 0
n = Sheets("Archive").Cells(Rows.Count, Ou.Column).End(xlUp).Row
For Each cel In xrg
x = dico.keys()(0): cel = x
n = n + 1: Sheets("Archive").Cells(n, Ou.Column) = x
dico.Remove x
Next cel
For Each cel In xrg
Chksum = 0
For i = 1 To max
Chksum = Chksum Xor Asc(Mid(x, i, 1))
Next i
Chksum = WorksheetFunction.Dec2Hex(Chksum)
xrg.Cells(i, 1) = xrg & Right("00" & Chksum, 2)
Next cel
End Sub