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.