VBA - probleme suppression ligne
Répondre à la discussion
Affichage des résultats 1 à 26 sur 26

VBA - probleme suppression ligne



  1. #1
    julienslr

    VBA - probleme suppression ligne


    ------

    Bonjour,

    J'ai un petit programme qui doit supprimer entièrement les lignes dont la cellule de la colonne 22 est différente de ""003". Lors de son fonctionnement il ne s'arrête jamais et quand je met pause au programme il se retrouve sur la ligne indiquée. Ai-je fais une erreur ?

    Code:
    Sub MRP3()
    
    Application.ScreenUpdating = False
    Sheets("COOIS").Select
    
    i = 2
    
    While Cells(i, 2) <> ""
    
        If Cells(i, 22) <> "003" Then
        
        Cells(i, 4).EntireRow.Delete
        
        i = i - 1           'Le programme reste sur cette ligne
        
        End If
    
        i = i + 1
    
    Wend
    
    Application.ScreenUpdating = True
    
    End Sub

    -----

  2. #2
    cherbe

    Re : VBA - probleme suppression ligne

    bonjour
    Remarque : il faut indenter le code pour faciliter sa lecture !

    Je ne comprends pas bien les effets de "i=i-1" ?
    Je remplacerais la condition IF par un second WHILE ce qui permettrait de supprimer ce "i=i-1"
    (tant que la cellule de la colonne 22 est différente de "003", on supprime la ligne puis on passe à la ligne suivante)

  3. #3
    julienslr

    Re : VBA - probleme suppression ligne

    Le i = i - 1 permet de ne pas sauter de ligne.

    Si la ligne 10 est supprimer, la ligne 11 va devenir ligne 10. Et le programme lui passe à la ligne 11 après la suppression de la 10...

    J'ai fait les modifications et cela ne change rien.

    Code:
    Sub MRP3()
    
    Application.ScreenUpdating = False
    Sheets("COOIS").Select
    
    i = 2
    
        While Cells(i, 2) <> ""
    
            While Cells(i, 22) <> "003"
        
                Cells(i, 2).EntireRow.Delete
        
            Wend    'Le programme se trouve a cette étape lorsque je l'arrête
    
            i = i + 1
    
        Wend
    
    Application.ScreenUpdating = True
    
    End Sub

  4. #4
    cherbe

    Re : VBA - probleme suppression ligne

    Mets "Application.ScreenUpdatin g = False" en remarque et exécute la macro pas à pas (touche F8) afin de voir ce qui se passe.

  5. A voir en vidéo sur Futura
  6. #5
    julienslr

    Re : VBA - probleme suppression ligne

    Je pense avoir trouvé le problème. Il se trouve qu'il y a des cellules vide à gauche des cellules ou se trouve les valeurs type "003". J'ai mis des valeurs au hasard pour combler les vides et les lignes se retrouves supprimées. Je vais essayer de tourner mon tableau de sorte à combler se vide.
    Je ne pensais pas que cela gênerait la fonction qui supprime la ligne entièrement.

    Merci pour la méthode du programme pas à pas, je suis novice et je ne la connaissais pas. C'est bien pratique

  7. #6
    cherbe

    Re : VBA - probleme suppression ligne

    Citation Envoyé par julienslr Voir le message
    Je pense avoir trouvé le problème. Il se trouve qu'il y a des cellules vide à gauche des cellules ou se trouve les valeurs type "003". J'ai mis des valeurs au hasard pour combler les vides et les lignes se retrouves supprimées.
    Si c'est bien ça, c'est la ligne
    Code:
    Cells(i, 2).EntireRow.Delete
    qui est inadaptée. Essaie :
    Code:
    Row(Cells(i, 1)).EntireRow.Delete

  8. #7
    julienslr

    Re : VBA - probleme suppression ligne

    Lorsque je fais cette modification le programme ne tourne plus, l'erreur est la suivante :

    Compile error :

    Sub or Function not defined

    Qu'est-ce qui ne va pas ?

    Merci

  9. #8
    cherbe

    Re : VBA - probleme suppression ligne

    Quelle modification ?

  10. #9
    julienslr

    Re : VBA - probleme suppression ligne

    Celle-ci :

    Code:
    Row(Cells(i, 2)).EntireRow.Delete

  11. #10
    cherbe

    Re : VBA - probleme suppression ligne

    je me suis mélangé les pinceaux. C'est :
    Code:
    Rows(i).EntireRow.Delete

  12. #11
    julienslr

    Re : VBA - probleme suppression ligne

    Merci cherbe, le programme fonctionne désormais. Néanmoins il est extrêmement long à s'exécuter. Sauriez vous comment gagner du temps ? Il lui faut bien 3-4 min pour arriver à la ligne 1000 et j'en ai environ 10X plus

  13. #12
    cherbe

    Re : VBA - probleme suppression ligne

    même avec Application.ScreenUpdating = False ?

  14. #13
    julienslr

    Re : VBA - probleme suppression ligne

    Oui hélas !

  15. #14
    cherbe

    Re : VBA - probleme suppression ligne

    remet ici le code complet mais je doute pouvoir améliorer sensiblement les choses !

  16. #15
    julienslr

    Re : VBA - probleme suppression ligne

    Voici :

    Code:
    Sub MRP3()
    
    Application.ScreenUpdating = False
    Sheets("COOIS").Select
    
         i = 2
    
         While Cells(i, 2) <> ""
    
              While Cells(i, 14) <> "003"
        
                  Cells(i, 2).EntireRow.Delete
        
              Wend
    
             i = i + 1
    
         Wend
    
    Application.ScreenUpdating = True
    
    End Sub

  17. #16
    cherbe

    Re : VBA - probleme suppression ligne

    Citation Envoyé par julienslr Voir le message
    Voici :
    Code:
    Sub MRP3()
    Application.ScreenUpdating = False
    Sheets("COOIS").Select
         i = 2
    
         While Cells(i, 2) <> ""
              While Cells(i, 14) <> "003"  
                  Cells(i, 2).EntireRow.Delete   
              Wend
             i = i + 1
         Wend
    Application.ScreenUpdating = True
    End Sub
    Je ne comprends pas pourquoi un code aussi compact est aussi long à s'exécuter sans mise à jour de l'écran ? Ton PC est lent ?
    Une remarque : tu as gardé Cells(i, 2).EntireRow.Delete au lieu de Rows(i).EntireRow.Delete.
    Pourquoi ?

  18. #17
    cherbe

    Re : VBA - probleme suppression ligne

    Essaie de commencer par la dernière ligne :
    Code:
    Sub MRP3()
        Application.ScreenUpdating = False
        i = Range("A1048576").End(xlUp).Row
        While Cells(i, 2) <> "" and i >=2
              While Cells(i, 14) <> "003"   
                  Rows(i).EntireRow.Delete  
              Wend
             i = i - 1
        Wend
    Application.ScreenUpdating = True
    End Sub

  19. #18
    julienslr

    Re : VBA - probleme suppression ligne

    J'ai essayé de le laisser tourner jusqu'au bout pour voir si tout allait bien. Je l'ai laissé une heure et le programme tournait toujours. J'ai vérifié, il a bien joué son rôle en suppriment tout ce qui était différent de "003". Il doit y avoir une boucle infini quelque part à cause de la suppression de ligne mais je n'arrive pas à comprendre où elle se trouve.
    Je vais essayer de commencer par la dernière ligne
    Dernière modification par julienslr ; 17/05/2016 à 13h01.

  20. #19
    matthieu2

    Re : VBA - probleme suppression ligne

    Bonjour,

    Je ne sais pas si tu as des calculs automatique dans ton tableau. C'était le cas pour un de mes projet, je te conseille de mettre cette ligne de code:
    Code:
    Application.Calculation = xlCalculationManual
    Après ton:
    Code:
    Application.ScreenUpdating = False
    Ça permet de ne pas faire les calcus automatiquement le temps que ta macro tourne.

    A la fin de ton programme ajoute la ligne suivante pour réactiver les calculs automatiques:
    Code:
    Application.Calculation = xlCalculationAutomatic
    Avant ou après ton:
    Code:
    Application.ScreenUpdating = True
    Cordialement,

  21. #20
    julienslr

    Re : VBA - probleme suppression ligne

    Bonjour matthieu2,

    Suivant vos conseilles à tout les deux il y a du bien ! Le code s'exécute très rapidement et presque correctement. Dernier petit problème. Lorsqu'il a supprimé toutes les lignes nécessaires et arrive à la ligne 2 il se met en erreur sur la ligne :
    Code:
    While Cells(i, 2) <> "" And i >= 2
    De plus lorsque que je relance le programme aussitôt (donc aucune ligne a supprimer) il s'exécute jusqu'à s'arrêter tout seul sans problème... Savez vous pourquoi ? :

    Code:
    Sub MRP3()
        
        Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
        Sheets("COOIS").Select
        
        i = Range("A1048576").End(xlUp).Row
        While Cells(i, 2) <> "" And i >= 2
              While Cells(i, 14) <> "003" And i >= 2
                  Rows(i).EntireRow.Delete
                  i = i - 1
              Wend
             i = i - 1
        Wend
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
    End Sub
    Merci

  22. #21
    julienslr

    Re : VBA - probleme suppression ligne

    J'ai trouvé ! compte tenu des deux

    Code:
    i = i - 1
    qui se suivent, dans certaines conditions i peut être égale a 1. Ce qui plante le programme compte tenu de la première boucle While.

    Voici le programme fonctionnel :

    Code:
    Sub MRP3()
        
        Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
        Sheets("COOIS").Select
        
        i = Range("A1048576").End(xlUp).Row
        While Cells(i, 2) <> "" And i >= 2
    
              While Cells(i, 14) <> "003" And i >= 2
                  Rows(i).EntireRow.Delete
                  i = i - 1
              Wend
    
             If i > 1 Then
             i = i - 1
             End If
    
        Wend
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
    End Sub
    Merci Cherbe et Matthieu2

  23. #22
    cherbe

    Re : VBA - probleme suppression ligne

    problème déjà signalé :
    Code:
    While Cells(i, 14).Value <> "003" And i >= 2
    D'autre part, il semble que :
    Code:
    Do While test
       instructions
    loop
    Soit préférable à :
    Code:
    while test
      instructions
    wend
    mais je n'ai pas compris pourquoi ?
    Dernière modification par cherbe ; 18/05/2016 à 09h01.

  24. #23
    julienslr

    Re : VBA - probleme suppression ligne

    J'ai effectué les retouches que vous me conseillez cherbe.

    Je vais vous expliquer le problème dans le programme. Voici le code qui posais problème, plaçons nous dans le cas où la ligne 2 est à supprimer :


    Code:
    While Cells(i, 2) <> "" And i >= 2                         
              While Cells(i, 14) <> "003" And i >= 2        
                  Rows(i).EntireRow.Delete                        
                  i = i - 1                                                 'Si dans cette boucle i = 2 en entrée i passe à 1 en sortie ce qui fait sortir de cette boucle While
              Wend                                                        
             i = i - 1                                                       'Ensuite à cette ligne, i passe de 1 à 0, ce qui engendre une erreur 
        Wend
    Le fait d'ajouter une boucle If empêche donc ce problème.

  25. #24
    IFFIC-56

    Re : VBA - probleme suppression ligne

    Bonsoir ou Bonjour suivant l'heure,
    Le souci à régler est qu'effectivement la suppression de lignes modifie le numéro d'ordre des suivantes.
    Dans cet exemple, j'ai une Listbox qui énumère les lignes à supprimer suivant des critères en vrac.
    J'ai donc, lors de la collecte, récupéré le n° de ligne initial (Ici la deuxième colonne de la ListBox)
    Ma variable "RECUL" me permet d'avoir une constante ajustant le tir.
    Amicalement, si cela peut servir,
    Code:
    For i = 0 To Me.ListBox1.ListCount - 1
     NO_LIGNE = Me.ListBox1.List(i, 1) + RECUL
    ActiveSheet.Cells(NO_LIGNE, 1).EntireRow.Delete 'Mise à jour de la feuille 
    RECUL = RECUL - 1 ' Ceci rectifie le nouveau numéro de ligne
    Next i
    P.S. A noter que cela est adaptable aisément à une boucle faite directement sur une feuille
    Dernière modification par IFFIC-56 ; 26/05/2016 à 22h53.

  26. #25
    cherbe

    Re : VBA - probleme suppression ligne

    Si tu commençais par la fin de la feuille, tu n'aurais pas de changement de numéro des lignes à supprimer.

  27. #26
    IFFIC-56

    Re : VBA - probleme suppression ligne

    Amusant! Je n'y avais pas pensé!
    N'utilisant quasiment jamais "While/Wend", je vais devoir regarder de plus près.
    Et aussi comprendre la présence du "i = i -1" dans ton code

Discussions similaires

  1. suppression de ligne sous matlab
    Par membreComplexe12 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 22/02/2010, 14h10
  2. problème de suppression
    Par inviteb9df233f dans le forum Matériel - Hardware
    Réponses: 5
    Dernier message: 10/02/2008, 11h37
  3. Probleme suppression de fichier en php
    Par guigui-x dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 29/06/2007, 23h56