Erreur de syntaxe dans une procédure utilisant une variable tableau
Bonjour à tous,
J'ai adapté une macro pour créer un identifiant unique composé de chiffres et de lettres sous la forme
8qzbszwy-049q-fyu3-85l3-r2l87ghdht21
5wxc7aco-uvav-c2px-iwf4-xuaxujawz0f4
J'ai souvent besoin de traiter des fichiers relativement conséquent de 500 à plus de 20.000 lignes et là, c'est assez long.
J'ai tenté de passer par une variable tableau, mais j'ai une erreur. Sûrement un problème de syntaxe ??
Je mets mon code ci-dessous et je joins un classeur ex. volontairement limité à cette fonctionnalité.
Les 2 lignes ci-dessous sont en commentaire pour permettre d'aller au bout de la macro, mais ce sont ces 2 lignes qui constituent le problème.
'tablo(n) = code_alea
'Range("D1:D" & derLigne) = tablo
Merci d'avance pour l'aide et conseils toujours avisés, ainsi que pour le temps passé.
Bien cordialement,
Dan
Option Explicit
Sub code_aleatoire()
'www.excel-pratique.com/fr/astuces_vba/generer_codes_aleatoires
Dim carac As String
Dim code_alea As String
Dim i As Integer
Dim n As Long
Dim nombre_aleatoire As Integer
Dim derLigne As Long
Dim tablo As Variant
derLigne = ActiveSheet.Range("B999999").End(xlUp).Row
Application.ScreenUpdating = False
Randomize
carac = "abcdefghijklmnopqrstuvwxyz0123456789"
code_alea = ""
For n = 1 To derLigne
For i = 1 To 8
nombre_aleatoire = Int(Len(carac) * Rnd) + 1
code_alea = code_alea & Mid(carac, nombre_aleatoire, 1)
Next
code_alea = code_alea & "-"
For i = 1 To 4
nombre_aleatoire = Int(Len(carac) * Rnd) + 1
code_alea = code_alea & Mid(carac, nombre_aleatoire, 1)
Next
code_alea = code_alea & "-"
For i = 1 To 4
nombre_aleatoire = Int(Len(carac) * Rnd) + 1
code_alea = code_alea & Mid(carac, nombre_aleatoire, 1)
Next
code_alea = code_alea & "-"
For i = 1 To 4
nombre_aleatoire = Int(Len(carac) * Rnd) + 1
code_alea = code_alea & Mid(carac, nombre_aleatoire, 1)
Next
code_alea = code_alea & "-"
For i = 1 To 12
nombre_aleatoire = Int(Len(carac) * Rnd) + 1
code_alea = code_alea & Mid(carac, nombre_aleatoire, 1)
Next
code_alea = code_alea
'tablo(n) = code_alea
Range("D" & n) = code_alea
code_alea = Empty
Next n
'Range("D1:D" & derLigne) = tablo
Application.ScreenUpdating = True
End Sub
Bonjour,
Je ne suis pas persuadé qu'une variable tableau soit bien utile dans le cas présent :
Un brin d'optimisation devrait suffire :
Sub code_aleatoire()
Dim i%, iLR&, iNb%, x&, carac$, tmp$
Application.ScreenUpdating = False
iLR = ActiveSheet.Range("B999999").End(xlUp).Row
carac = "abcdefghijklmnopqrstuvwxyz0123456789"
Randomize
For x = 1 To iLR
tmp = ""
For i = 1 To 32
iNb = Int(Len(carac) * Rnd) + 1
tmp = tmp & Mid(carac, iNb, 1)
Next
Cells(x, 4) = Left(tmp, 8) & "-" & _
Mid(tmp, 9, 4) & "-" & _
Mid(tmp, 13, 4) & "-" & _
Mid(tmp, 17, 4) & "-" & _
Right(tmp, 12)
Next x
End SubTesté sur 50 000 en 3 ou 4 " environ...
Je te le donne avec un Array : (on gagne environ 2" sur 50 000)
Sub code_aleatoire()
Dim i%, iLR&, iNb%, x&, carac$, tmp$
Dim Arr
iLR = ActiveSheet.Range("B" & 2 ^ 20).End(xlUp).Row
Arr = Range("D1:D" & iLR).Value
carac = "abcdefghijklmnopqrstuvwxyz0123456789"
Randomize
For x = 1 To iLR
tmp = ""
For i = 1 To 32
iNb = Int(Len(carac) * Rnd) + 1
tmp = tmp & Mid(carac, iNb, 1)
Next
Arr(x, 1) = Left(tmp, 8) & "-" & _
Mid(tmp, 9, 4) & "-" & _
Mid(tmp, 13, 4) & "-" & _
Mid(tmp, 17, 4) & "-" & _
Right(tmp, 12)
Next x
Range("D1:D" & iLR) = Arr
End SubA+
Bonjour,
Merci beaucoup pour l'aide apportée et l'amélioration du code qui me laisse toujours "sur le cul !".
J'ai testé les 2 versions :
- la 1ere qui ne passe pas par un Array ne gagne rien en temps (sur mon ordi). Testé sur 5000 lignes en 19" (même durée qu'avec ma propre version)
- la seconde fait le travail en 0.1" (toujours pour 5000 lignes, donc rien à voir)
J'ai peut-être quelque chose de mal configuré sur mon pc pour qu'il y ait tant de différences ?
Toujours est-il que le but est largement atteint.
Merci encore et au plaisir de lire tes conseils.
Bonne journée,
Dan
Bonjour,
Je ne peux pas te dire : Je suis un peu étonné que ça passe presque instantanément sur 50 000 lignes chez moi et qu'il te faille 20 " pour 5000 :
Je n'ai pas une bécane extrêmement puissante c'est un portable convenable sans plus...
Peut-être un peu le bazar sur ton disque dur ? Un peu trop rempli ou/et fragmenté ?
Sinon on considère comme normal que le code s'exécute environ 20 fois plus vite avec Array.
A+