Boucle sur VBA [Résolu]

thyroox 17 Messages postés jeudi 27 juillet 2017Date d'inscription 1 décembre 2017 Dernière intervention - 30 nov. 2017 à 15:37 - Dernière réponse : f894009 12541 Messages postés dimanche 25 novembre 2007Date d'inscription 11 décembre 2017 Dernière intervention
- 1 déc. 2017 à 16:34
Bonjour,


J'ai écrit une petite macro qui s'effectue normalement en deux temps sur les colonnes N et Q (voir mon fichier en pièce jointe avec la macro intégrée).

Feuille "TEST"

1) -Colonne N : si la cellule de colonne Q est égal à "PPK-002" alors la cellule de la colonne N est égal à la valeur de la cellule de la colonne Q
- Colonne Q : la valeur de la cellule de la colonne Q reprend la valeur de la cellule de la colonne AN dans la Feuille "DP Siège".

2) Si la valeur de la cellule de la colonne N est égal à la valeur de la cellule de la colonne Q alors la valeur de la cellule de la colonne Q s'efface. Du coup il ne reste que la valeur de la cellule de la colonne N.



Mon problème réside dans le fait que lorsque je lance ma Macro, elle n'exécute que la partie 1) et je suis OBLIGE de la relancer pour quelle exécute la partie 2)


Pouvez vous retravailler mon code afin que les deux parties puissent s’exécuter l'une âpres l'autre en ne lançant qu'UNE seule fois la Macro, par la même occasion pouvez vous m'expliquer ce qui péchait.


Je vous remercie par avance.


Thyroox
Afficher la suite 

6 réponses

Répondre au sujet
thyroox 17 Messages postés jeudi 27 juillet 2017Date d'inscription 1 décembre 2017 Dernière intervention - 30 nov. 2017 à 15:37
Commenter la réponse de thyroox
jordane45 19267 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 15 décembre 2017 Dernière intervention - 30 nov. 2017 à 16:24
0
Utile
1
Bonjour,

Ta seconde boucle s'attaque à quelle feuille ?
A mon avis ... il faut le préciser dans ton code
For K = 2 To LD
     If taFeuille.Cells(K, "N").Value = taFeuille.Cells(K, "Q").Value Then taFeuille.Cells(K, "Q").ClearContents    
Next K


Et puis, penses à travailler avec les objets plutôt que de répéter le nom des feuilles à chaque ligne de code.

Par exemple :
Sub TRANSFORMATION()
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim LD As Integer
    Dim K As Integer
    
    Dim sDPS As Worksheet
    Set sDPS = Sheets("DP Siège")
    
    Dim sT As Worksheet
    Set sT = Sheets("TEST")
    
    DL = sDPS.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A
    LD = sT.Cells(Application.Rows.Count, "K").End(xlUp).Row
    For I = 6 To DL 'boucle sur toutes les lignes I de 3 à DL
        If sDPS.Cells(I, "AK").Value <> sDPS.Cells(I, "AN").Value And sDPS.Cells(I, "J").Value = "DP Siège" Then sT.Cells(I - 4, "K").Value = sDPS.Cells(I, "A").Value
        If sDPS.Cells(I, "AK").Value <> sDPS.Cells(I, "AN").Value And sDPS.Cells(I, "J").Value = "DP Siège" Then sT.Cells(I - 4, "L").Value = sDPS.Cells(I, "F").Value
        If sDPS.Cells(I, "AK").Value <> sDPS.Cells(I, "AN").Value And sDPS.Cells(I, "J").Value = "DP Siège" Then sT.Cells(I - 4, "Q").Value = sDPS.Cells(I, "AN").Value
        If sT.Cells(I - 4, "Q").Value = "PPK-002" Then sT.Cells(I - 4, "N").Value = sT.Cells(I - 4, "Q").Value
     Next


thyroox 17 Messages postés jeudi 27 juillet 2017Date d'inscription 1 décembre 2017 Dernière intervention - 30 nov. 2017 à 16:33
Hello,


Merci pour le conseil concernant les objets.

Toute la Macro s'attaque à la Feuille "TEST", de ce fait la deuxième boucle s'attaque bel et bien à la Feuille "TEST".
Commenter la réponse de jordane45
f894009 12541 Messages postés dimanche 25 novembre 2007Date d'inscription 11 décembre 2017 Dernière intervention - 1 déc. 2017 à 12:23
0
Utile
2
Bonjour a vous deux,

Si j'ai bien compris:

Sub TRANSFORMATION()
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim LD As Integer
    Dim K As Integer
    Dim sDPS As Worksheet
    Dim sT As Worksheet
    
    Set sDPS = Sheets("DP Siège")
    Set sT = Sheets("TEST")
    With sDPS
        DL = .Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A
        For I = 6 To DL 'boucle sur toutes les lignes I de 3 à DL
            If .Cells(I, "AK").Value <> .Cells(I, "AN").Value And .Cells(I, "J").Value = "DP Siège" Then
                sT.Cells(I - 4, "K").Value = .Cells(I, "A").Value
                sT.Cells(I - 4, "L").Value = .Cells(I, "F").Value
                sT.Cells(I - 4, "Q").Value = .Cells(I, "AN").Value
            End If
            With sT
                If .Cells(I - 4, "Q").Value = "PPK-002" Then
                    .Cells(I - 4, "N").Value = .Cells(I - 4, "Q").Value
                    .Cells(I - 4, "Q").ClearContents
                End If
            End With
        Next I
    End With
End Sub
thyroox 17 Messages postés jeudi 27 juillet 2017Date d'inscription 1 décembre 2017 Dernière intervention - 1 déc. 2017 à 16:17
Bonjour f894009,


Je vous remercie grandement pour votre aide, cela fonctionne :)
Cependant pouvez vous m'expliquer ce qui péchait dans mon code et ce pourquoi le votre fonctionne ?


Cordialement
f894009 12541 Messages postés dimanche 25 novembre 2007Date d'inscription 11 décembre 2017 Dernière intervention > thyroox 17 Messages postés jeudi 27 juillet 2017Date d'inscription 1 décembre 2017 Dernière intervention - 1 déc. 2017 à 16:34
Re,

LD = sT.Cells(Application.Rows.Count, "K").End(xlUp).Row

Pas au bon endroit, vous avez 1 en resultat car vous testez avant d'avoir ecrit toutes vos donnees

Simplification:
Vous faites trois fois le meme test pour ecrire trois cellules differentes, un seul suffit
Vous faites une deuxieme boucle pour rien puisque vous ecrivez
 .Cells(I - 4, "Q").Value
dans la premiere, donc pas la peine d'en remettre une couche

Petit detail, votre deuxieme boucle (avec le LD= .... au bon endroit) ne pouvait marcher que si vous aviez selectionne le feuille TEST
Commenter la réponse de f894009