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
8generateur-id.xlsm (98.29 Ko)

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 Sub

Testé 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 Sub

A+

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+

Rechercher des sujets similaires à "erreur syntaxe procedure utilisant variable tableau"