Erreur d'exécution relative à "Cells"
Bonjour à tous,
J'essaie d'exécuter le code suivant qui me permet de connaitre toutes les valeurs différentes de la 1ere colonne (qui reviennent plusieurs fois) et de les coller dans la seconde colonne une seule fois :
Sub ValeurUniques()
Dim insert As Boolean
Dlig = Range("A1").End(xlDown).Row
Cells(1, 2).Value = Cells(1, 1).Value
Dlig2 = Range("B1").End(xlDown).Row
For i = 1 To Dlig
insert = True
For j = 1 To Dlig2
If Cells(i, 1).Value = Cells(j, 2).Value Then
insert = False
End If
Next j
If insert = True Then
Cells(Dlig2 + 1, 2).Value = Cells(i, 1).Value
Dlig2 = Dlig2 + 1
End If
Next i
End SubJ'ai cependant une erreur à la ligne Cells(Dlig2 + 1, 2).Value = Cells(i, 1).Value
Erreur d'exécution 1004:
Erreur définie par l'application ou par l'objet
Savez-vous d'où cela peut venir ?
Je vous remercie par avance pour votre aide.
Bonjour Iklou, bonjour le forum,
L'utilisation des dictionnaires est sans conteste la manière la plus rapide pour ce genre de cas. Regarde le code ci-dessous :
Sub ValeurUniques()
Dim TV As Variant 'déclare la variable TV (tableau des valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP1 As Variant 'déclare la variale TMP1 (tableau TeMPoraire 1)
Dim TMP2 As Variant 'déclare la variale TMP2(tableau TeMPoraire 2)
Dim TD() As Variant 'déclare la variale TD (tableau des Doublons)
TV = Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs (en partant de la seconde)
D(TV(I, 1)) = D(TV(I, 1)) + 1 'alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
TMP1 = D.Keys 'récupère dans le tableau temporaire TMP1 les éléments du dictionnaire D sans doublons
TMP2 = D.Items 'récupère dans le tableau temporaire TMP2 le nombre de fois que chaque élément apparaît dans la liste
For I = 0 To UBound(TMP1) 'boucle sur tous les éléments du tableau temporaire TMP1
If TMP2(I) > 1 Then 'si le nombre en TMP2(I) est supérieur à 1
ReDim Preserve TD(J) 'redimensionne le tableau TD
TD(J) = TMP1(I) 'récupère l'élément dans TD(J)
J = J + 1 'incrémente TD
End If 'fin de la condition
Next I 'prochaine élément de la boucle
If J > 0 Then Range("B1").Resize(UBound(TD) + 1, 1).Value = Application.Transpose(TD) 'si J est supérieur à 0, renvoie dans B1 redimensionnée le tableau TD transposé
End SubBonsoir,
ThauThème a raison de te diriger vers le dico pour répertorier des valeurs uniques... Il n'y a pas plus rapide.
Il n'est cependant pas inutile de déceler d'où vient ton erreur. Il n'y a rien d'apparent, mais tu ne dis pas quelle est l'erreur ni quelles sont les valeurs des variables i et j au moment où elle se produit : informations essentielles pour avoir une idée au départ...
Par ailleurs, deux petites améliorations ne nuiraient pas à ton code :
- mettre un : Exit For après exit = False (car inutile de continuer la boucle j quant on a détecté une fois un doublon, perte de temps)
- mettre If insert Then simplement (car dès que tu dis insert, VBA renvoie True, et tu lui demandes de vérifier que True = True, réitération inutile, encore du temps en plus)
Je passe sur les non qualifications pour l'instant (je n'aime pas voir des Range ou Cells sans point devant qui indique la qualification d'un objet de rattachement, garantie que l'objet spécifié est totalement délimité...) sans conséquence non plus a-priori (à moins que ton erreur ne démontre le contraire ?)
Cordialement.
Bonjour,
Je vous remercie pour vos réponses.
C'est noté pour le dictionnaire, ça pourra me servir
J'ai corrigé l'erreur il y a deux jours, dans mes souvenirs c'était un problème avec Range("B1").End(xlDown).Row.
S'il n'y a qu'une valeur dans la colonne B (case B1) alors cette commande renvoie le nombre maximum de lignes (jusqu'à la fin de la feuille).
J'ai donc initialisé Dlig2 = 1.
Bonne journée à vous.
Cordialement