Erreur définie par l'application ou par l'objet

Bonjour à toutes, bonjour à tous,

Comme indiqué dans le titre, j'ai un problème sur mon code : il génère le message d'erreur "Erreur 1004, erreur définie par l'application ou par l'objet".

Voici le code en question :

Sub AperçuVmax_Bouton6_Cliquer()

Dim TW As Workbook
Dim TS As Worksheet
Dim ACC As Worksheet

Dim i As Long
Dim p As Long
Dim q As Long
Dim Pkmax As Double

Set TW = ThisWorkbook
Set TS = TW.Worksheets("Aperçu Vmax")
Set ACC = TW.Worksheets("ACCUEIL")
Pkmax = ACC.Range("G18").Value

p = 5
q = 6
i = 6

Do Until Cells(i, "B") >= Pkmax

    If TS.Cells(q, "F") = TS.Cells(p, "F") Then

    Else

    TS.Cells(i, "H").Value = TS.Cells(q, "B").Value
    TS.Cells(i, "I").Value = TS.Cells(q, "F").Value

    i = i + 1

    End If

    q = q + 1
    p = p + 1

Loop

End Sub

L'idée est de parcourir des lignes de deux colonnes pour sortir de la seconde colonne chaque valeur dès lors qu'elle est différente de la précédente. Mais voilà, ça me sort l'erreur décrite. Qui plus est, dans mon tableau Excel, des fois il me sort des valeurs qui pourtant sont consécutivement égales, ce que je ne souhaite pas.

Enfin, autre erreur que je rencontre (erreur que j'ai eue quand la précédente n'apparaissait pas), il me sort un dépassement de capacité, surlignant la ligne "q=q+1". Est-ce que quelqu'un aurait une idée d'où pourraient venir ces différentes erreurs ?

Si jamais vous avez besoin d'un fichier en appui, j'essaierai d'en faire un petit.

En vous remerciant, je vous souhaite un bon mardi.

Rod'

Salut Rododom,

sans fichier, difficile d'avoir un avis définitif, évidemment, mais il me semble que tu faisais de la soupe entre tes variables i et q !

A vérifier sinon, un fichier serait le bienvenu!

Attention à ton indentation (et aussi) aux espaces démesurés entre les lignes de code! Inutiles et qui rendent ta prose illisible!

Do Until Cells(q, "B") >= Pkmax
    If TS.Cells(q, "F") <> TS.Cells(q - 1, "F") Then
        TS.Cells(i, "H") = TS.Cells(q, "B")
        TS.Cells(i, "I") = TS.Cells(q, "F")
        i = i + 1
    End If
    q = q + 1
Loop

A+

Bonsoir,

On ne peut déduire une erreur 1004 (erreur Excel) du code, d'autant que tu ne dis pas sur quelle ligne elle se produit, ni quelles sont les valeurs des variables à ce moment.

On peut seulement noter une expression non quelifiée :

Do Until Cells(i, "B") ...

Pas de feuille à laquelle Cells réfère... et on ne sait quelle est la feuille active (ni la feuille concernée d'ailleurs).

NB- Même si cette façon d'utiliser la méthode Cells fonctionne généralement, il est préférable d'utiliser des index numérique, pour les colonnes comme pour les lignes, ainsi que le prévoit la syntaxe (il arrive en effet que cela ne fonctionne pas ! On se demande alors pourquoi, mais il n'y a pas vraiment lieu de s'étonner si on déroge à la syntaxe prévue...)

Note aussi que les TW et ACC sont inutiles. TW parce que ThisWorkbook joue déjà ce rôle (tu peux aussi bien en rajouter et faire

Set TWbis = TW... tu ne fais qu'occuper de la mémoire sans utilité pratique). Et ACC pareil car à usage unique.

Tu aurais fait :

    With ThisWorkbook
        Set TS = .Worksheets("Aperçu Vmax")
        Pkmax = .Worksheets("ACCUEIL").Range("G18").Value
    End With

Tu aurais eu tes deux variables utiles, deux de moins en mémoire et sans écrire plus !

Cordialement.

Bonjour MFerrand,

exact, j'avais loupé ce défaut!

Do Until Cells(i, "B") >= Pkmax

Heureusement, je sais que tu as l'oeil et que tu couvres nos arrières!

Je suis souvent tes explications, de sujet en sujet, et ton expertise dans le propos me laisse toujours pantois!

A+

4exemple2.xlsm (69.44 Ko)

Bonjour tout le monde !

Tout d'abord, merci beaucoup pour l'intérêt que vous portez à mon sujet.

J'ai fait un petit fichier qui, je l'espère correspond le plus à mon besoin, et surtout à mon problème.

Entre parenthèses, les différentes valeurs des colonnes C et E sont normalement données par des INDEX-EQUIV venant d'autres onglets du classeur.

J'ai un peu parcouru et essayé vos suggestions, mais celles-ci ne fonctionnent pas pour le moment : j'ai toujours les mêmes petits problèmes : erreur 1004, surlignant la ligne 44 (le If TS.Cells(q,"F")<>TS.Cells(q-1,"F").Value Then,des valeurs identiques consécutives inscrites dans la colonne I alors que le programme est justement censé ne sortir les valeurs que lorsqu'elles changent, et un dépassement de capacité dû à la ligne q=q+1. Je ne suis donc pas au bout de mes peines.

Merci pour les petits conseils néanmoins, je suis débutant en VBA, et c'est toujours bon d'en apprendre un peu tous les jours.

Rod'

Bonjour,

J'ai l'impression qu'il y a beaucoup de confusion !

D'abord :

Do Until Cells(i, "B") >= Pkmax

Ceci génère une boucle sans fin ! B s'arrête à 494, Pkmax =5000 ! Aucune chance que cette valeur soit atteinte en B, la boucle peut continuer indéfiniment...

Puis :

TS.Cells(i, "F").Value = VIN.Cells(i, "I").Value

La colonne I est vide, la colonne F est vidée en conséquence... !

La colonne F étant devenue vide, plus rien à voir à la suite. De toute façon, la remplir avec des 60 (colonne F de VIN) serait pareil dans ce fichier.

Et les colonnes H et I ne sont pas effacées au lancement de la proc. qui doit les servir...

Il y a de l'ordre à remettre, et des précisions à donner, avant même de pouvoir regarder les erreurs. Ton fichier est inadéquat !

2exemple2.xlsm (69.41 Ko)

Bonjour,

Oui effectivement, j'ai copié les valeurs dans la mauvaise colonne, autant pour moi. Je dois être encore en train de dormir !

Quant à la boule infinie...oui, effectivement vu comme ça je le comprends. Sur mon fichier complet ça monte à 5000. Mais je crois que cette petite remarque m'a ouvert les yeux quant à la boucle infinie : dans mon fichier, après le 5000, il y a des cellules vide. Peut-être que si je mets un "Do Until Cells(i,"B") >= Pkmax-1", ça marchera peut-être mieux. Néanmoins c'est aussi la raison pour laquelle en première lieu j'avais mis un "Do Until (i,"B") = "" " : j'espérais que mon programme s'arrête dès qu'il détecte une ligne vide.

Comment fait-on pour effacer les colonnes H et I à partir d'une certaine ligne ?

Encore merci, et désolé pour les petites confusions. J'espère que maintenant le fichier est mieux exploitable !

Bon, après réflexion j'ai enfin réussi à faire ce que je voulais faire. Et effectivement j'avais mis des i là où il fallait des q, forcément ça ne pouvait pas marcher. ^^ Je mets le code ici pour montrer la solution :

Sub AperçuVmax_Bouton6_Cliquer()

Dim TW As Workbook
Dim TS As Worksheet
Dim VIN As Worksheet
Dim ACC As Worksheet

Dim i As Long
Dim p As Long
Dim q As Long
Dim Pkmax As Double

Set TW = ThisWorkbook
Set TS = TW.Worksheets("Aperçu Vmax")
Set ACC = TW.Worksheets("ACCUEIL")
Set VIN = TW.Worksheets("Validation infrastructures")
Pkmax = ACC.Range("G18").Value

'p = 5
q = 6
i = 6

Do While Cells(q, "B") <> ""

        TS.Cells(q, "F").Value = VIN.Cells(q, "I").Value

        q = q + 1

    Loop

     q = 6
     TS.Cells(i, "H").Value = TS.Cells(q, "F").Value
     TS.Cells(i, "I").Value = TS.Cells(q, "F").Value
     i = i + 1
     q = q + 1

Do While Cells(q, "B") <> ""

    If TS.Cells(q, "F").Value <> TS.Cells(q - 1, "F").Value Then

    TS.Cells(i, "H").Value = TS.Cells(q, "B").Value
    TS.Cells(i, "I").Value = TS.Cells(q, "F").Value

    i = i + 1

    End If

    q = q + 1
    'p = p + 1

Loop

End Sub

Merci quand même pour vos conseils, ils pourront me servir plus tard.

Je vais maintenant ouvrir un nouveau topic pour un autre sujet étroitement lié à ce programme, mais différent du titre préalable.

Cordialement,

Rod'

Effectivement la variable i n'était pas adéquate pour sortir de la boucle, l'erreur intervenait quand Q arrivait en fin de feuille...

Mais tu laisses toujours en place les anciennes valeurs...

J'ai rajouté un petit TS.Range("H6:I25005").ClearContents pour me débarrasser des anciennes valeurs.

Rechercher des sujets similaires à "erreur definie application objet"