VBA : Tableau, Range et doublon

Bonsoir le forum,

Depuis quelques jours, j'ai un souci avec les variables tableaux.

Dans le code ci dessous, j'ai un tableau mytab1 (qui contient les valeurs d'une plage A2:A11 (une liste de nom par exemple).

Je souhaite faire une boucle sur mytab1 pour le remplir mais sans doublon. Je bloque, j'ai tout essayé.

Sub macrotab()

Dim mytab1 As Variant, i As Byte

mytab1 = Range("A2:A11").Value

For i = 1 To 10
' code pour remplir le tableau sans doublon
Next i

End Sub

Merci pour l'aide. J'ai vu tellement de chose sur internet, du genre on ne peut pas assigner une variable tableau à un range de valeur, ou aussi qu'il faut boucler sur la plage avant ensuite on pouvait remplir le tableau, je ne sais plus comment faire.

En gros, pour résumé, j'ai un tableau mytab1 qui contient des valeurs.

Je souhaite boucler chaque valeur du tableau, si elle est présente + de 2 fois on supprime les doublons, tout ceci avec des variables tableaux.

Bonsoir

Un essai

Testé avec 2003 FR

Sub Sans_Doublons()
Dim Tablo()
Dim MonDico As Object
Dim C As Range

 Set MonDico = CreateObject("Scripting.Dictionary")
 On Error Resume Next
  For Each C In Range("A2:A11"))
    MonDico.Add C.Value, C.Value
  Next C

  Tablo = Application.Transpose(MonDico.items)
End Sub
Option Base 1

Sub macrotab()

Dim mytab1() As Variant, i As Long
Dim mytab2() As Variant, j As Long, k As Long
Dim doublon As Boolean
Dim msg As String, temp1 As Single, temp2 As Single

temp1 = Timer

k = 1
mytab1 = Range("A2:A5000").Value
doublon = False

For i = 1 To UBound(mytab1, 1) - 1
    doublon = False
    For j = i + 1 To UBound(mytab1, 1)
        If mytab1(i, 1) = mytab1(j, 1) Then
            doublon = True
        End If
    Next j
    If doublon = False Then
        ReDim Preserve mytab2(1 To k)
        mytab2(k) = mytab1(i, 1)
        k = k + 1
    End If
Next i

'/*--------------------Nouvelle partie ajoutée--------------------------*/

ReDim Preserve mytab2(1 To k)
mytab2(k) = mytab1(UBound(mytab1, 1), 1)

For i = 2 To UBound(mytab2) + 1
    Cells(i, 2) = mytab2(i - 1)
Next i   

End Sub

Merci à vous deux pour vos réponses.

Banzai, je ne peux tester la méthode (étant sur mac). En regardant le code, je vois que tu boucles sur la plage directement. Je souhaitais éviter cela pour gain de rapidité, et justement n'utiliser que des variables tableaux.

Gauguin, merci pour ta réponse, c'est exactement ce que je rechercherai. Tu confirmes, cette méthode est beaucoup plus rapide que celle proposée par Banzai ? le code fonctionne juste avec les variables tableaux?

En tout cas, merci à vous deux.

ps: gauguin dans ton code, est-il possible de transformer mytab2 en deux dimensions pour avoir un truc du genre : Range("B2:B10")=mytab2

(pour copier les valeurs de mytab2 dans la plage ("B2:B10") (s'il y a 10 noms dans mytab2 par exemple)

Attention, je m'aperçois en re-testant que mon code ne marche pas comme il le faudrait.Il zappe une valeur.

Je regarde ça et je re-poste.

En passant la méthode (que j'ignorais complétement) de Banzaï est redoutable et au niveau rapidité, cela n'a rien à voir avec la mienne: (1/5 de seconde pour 5000 lignes contre plus de 4 secondes pour mon algo bancal)

-- Mar Déc 07, 2010 1:20 am --

Voilà, j'ai édité mon code (ci-dessus dans mon premier post), et à présent il fonctionne.

Pour la recopie dans les cellules j'ai bouclé sur le tableau et placé les valeurs dans les cellules car, à ma connaissance on ne peut redimensionner que la deuxième dimensions d'un tableau.

il faudrait donc encore un petit bout de code pour:

  • déclarer un tableau (ex:mytab3) à deux dimensions pour lequel on calerait sa première dimension sur la taille de mytab2 (après récup' des valeurs uniques dans mytab2)
  • transférer les valeurs de mytab2 dans la première dimension de mytab3.

Je pense par contre que mon code est loin d'être ce que l'on peut faire de mieux en terme d'optimisation !

Merci gauguin, je vais étudier le code pour comprendre la mécanique. En tout cas, l"utilisation des tableaux demande pas mal de rigueur ! Merci également Banzai pour ton code qui semble être la solution la plus performante.

Rechercher des sujets similaires à "vba tableau range doublon"