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 Sub

J'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 Sub

Bonsoir,

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)
Sans guère de conséquences sans doute sur le déroulement de ta proc. mais à la longue les accumulations de ce type finissent par avoir des effets sensibles...

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

Rechercher des sujets similaires à "erreur execution relative"