Boucle sur VBA

Résolu
thyroox Messages postés 40 Statut Membre -  
f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
    1. thyroox Messages postés 40 Statut Membre 1
       
      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
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
    1. thyroox Messages postés 40 Statut Membre 1
       
      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
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > thyroox Messages postés 40 Statut Membre
         
        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