Boucle sur VBA

Résolu/Fermé
thyroox Messages postés 34 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 25 février 2022 - 30 nov. 2017 à 15:37
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 - 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

3 réponses

thyroox Messages postés 34 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 25 février 2022 1
30 nov. 2017 à 15:37
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
30 nov. 2017 à 16:24
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


0
thyroox Messages postés 34 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 25 février 2022 1
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".
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
1 déc. 2017 à 12:23
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
0
thyroox Messages postés 34 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 25 février 2022 1
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
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > thyroox Messages postés 34 Date d'inscription jeudi 27 juillet 2017 Statut Membre Dernière intervention 25 février 2022
Modifié le 1 déc. 2017 à 16:43
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
0