Macro VBA suppresion de lignes qd contenu<5

Frany -  
 Frany12 -
Bonjour,
ca fait des jours que j'essaie d'avoir une solution en VBA (je suis debutante).
Je souhaite faire une macro qui me fait le sous total automatique du nombre de jour par personne (ca j'y arrive sans probleme) et ensuite supprimer uniquement les lignes ou le sous total est <5 jours (sans supprimer le detail). Que faire?
Merci enormement d'avance.
Frany
Configuration: Windows XP
Internet Explorer 6.0

15 réponses

  1. Utilisateur anonyme
     
    Bonjour,

    exemple :

    Option Explicit
    '
    
    Sub EffaceLigne()
    
        Dim Plage As Range, Cellule As Range
        
        Set Plage = Range("A2:A25")
        
        For Each Cellule In Plage
            If (Cellule.Value < 5) Then
                Cellule.EntireRow.Delete
            End If
        Next Cellule
        
    End Sub
    

    Lupin
    0
  2. frany12 Messages postés 2 Statut Membre
     
    Bonsoir Lupin,

    Merci pour ton aide.
    Ca marche mais pas comme je le souhaite...
    En fait je souhaite effacer uniquement les lignes de sous totaux qui apparaissent comme des cellules speciales ci dessous (car je fais un sous-total automatic)

    ' Selection.SpecialCells(xlCellTypeFormulas, 1).Select'

    je ne veux pas supprimer les lignes ou se trouvent le detail

    Merci encore ca me fera un gros soulagement qd j'aurai trouve la solution.

    Frany
    0
  3. Utilisateur anonyme
     
    re:

    Il me manque beaucoup d'information pour créer l'algorithme, mais voici une autre méthode !

    Sub EffaceSelection()
    
        Dim Cellule As Range
        
        Selection.SpecialCells(xlCellTypeFormulas, 1).Select
        For Each Cellule In Selection
            If (Cellule.Value < 5) Then
                Cellule.EntireRow.Delete
                Range("A1").Select
                Selection.SpecialCells(xlCellTypeFormulas, 1).Select
            End If
        Next Cellule
        
    End Sub
    '
    

    Lupin
    0
    1. frany12 Messages postés 2 Statut Membre
       
      Re Lupin,
      Je vais essaye d’expliquer un peu mieux mon cas
      J’ai un tableau ou se trouvent en colonnes: nom personne, projet, manager, etc ensuite viennent les colonnes ou j’ai la semaine1, semaine2, semaine3…
      La personne 1 peut travailler sur plusieurs projets, donc son temps est reparti entre plusieurs projets. Ainsi de suite.
      Je veux afficher uniquement le sous total et le detail ou les jours sont > 5

      Ex :
      Semaine1
      Alain projet A 1j
      projet B 2j
      projet C 1j
      total Alain 4j

      Le total Alain est <5 donc je veux supprimer toutes ces 4 lignes mais a condition que sur toute la ligne tous les sous-totaux soient <5. Par contre si j’ai 1 seul sous total qui est >=5 je laisse toute la ligne

      Optionnel : Ensuite j’efface le contenu des cellules ou le sous total est <5 dans les lignes ou il y a un sous total >=5.
      Ps : le plus important c’est le 1er point.

      Merci encore pour ton aide.

      Frany
      0
  4. Utilisateur anonyme
     
    re:

    je commence à voir la feuille ...

    Semaine1                                    Semaine2
    Alain
                         Projet1     1j                                Projet1    1j
                         Projet2     2j                                Projet2    2j
                         Projet3     1j                                Projet3    3j
    Totaux        Total          4j                                Total         6j
    Semaine1                                    Semaine2
    Pierre
                         Projet1     2j                                Projet1    1j
                         Projet2     2j                                Projet2    1j
                         Projet3     2j                                Projet3    3j
    Totaux        Total          6j                                Total         5j
    Semaine1                                    Semaine2
    Claude
                         Projet1     1j                                Projet1    1j
                         Projet2     2j                                Projet2    1j
                         Projet3     1j                                Projet3    1j
    Totaux        Total          4j                                Total         3j
    
    


    si j'ai bien compris, ici il faut supprimer les lignes se reportant à Claude et conserver les deux autres ?

    pour conserver une certaine tabulation de tes posts, place ton texte entre les balises de code !

    ........<.......code...........>............
                        texte          texte
                        texte          texte
    

    .........<.../...code.......>...........

    sans les points pour les balises, je l'ai ai inclus car les balises ne sont pas visible dans le message.

    Lupin
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Frany12
     
    Bonjour Lupin,
    En effet il faut supprimer les lignes de Claude.
    Merci aussi pour l'astuce du code. Tres utile.
    0
  7. Utilisateur anonyme
     
    re :

    autre question avant de te pondre un exemple !

    Peut-il y avoir un nombre différent de projet

    .........a) pour une semaine donnée
    .........b) pour une personne donnée

    avec ces infos je devrais pour pondre quelque chose de viable :-)

    Lupin
    0
  8. Frany12
     
    Il peut y avoir un nombre different de projets par personne.
    Normalement le nombre de projets ne change pas s'une semaine a l'autre (mais cela peut etre envisage)

    Merci
    Francy
    0
  9. Utilisateur anonyme
     
    Bonjour,

    Voilà, j'ai tardé un peu, cette algo m'a donné un peu de difficulté :-)

    voici l'exemple :

    http://www.forum-openoffice.org/ci-joint/fichier/2007/08/09-112154.xls

    et le code lui-même :

    Option Explicit
    
    Sub Nettoyage()
    
        Const AdresseFin = 11
    
        Dim Lignes() As Long, Compteur As Long
        Dim PremiereLigne As Long, DerniereLigne As Long, Limite As Long
        Dim Cellule As Range, Plage As Range, Drapeau As Boolean
        
        Application.ScreenUpdating = False
        Selection.SpecialCells(xlCellTypeFormulas, 1).Select
        Compteur = 1
        For Each Cellule In Selection
            If (Cellule.Value < 5) Then
                ReDim Preserve Lignes(Compteur)
                Lignes(Compteur - 1) = Cellule.Row
                Compteur = (Compteur + 1)
            End If
        Next Cellule
    
        Compteur = 0
        For Compteur = 0 To (UBound(Lignes) - 1)
            Cells(Lignes(Compteur), 1).Select
            Set Plage = Range(ActiveCell.Offset(0, 0).Address, ActiveCell.Offset(0, AdresseFin).Address)
            Plage.Select
    
            Drapeau = False
            For Each Cellule In Plage
                If (Cellule.FormulaLocal <> Cellule.Value) Then
                    If (Cellule.Value > 5) Then
                        Drapeau = True
                        Range("A" & Cellule.Row).Value = "Conserver"
                        Exit For
                    Else
                        Range("A" & Cellule.Row).Value = "Détruire"
                        DerniereLigne = Cellule.Row
                        Limite = DerniereLigne
                    End If
                End If
            Next Cellule
        Next Compteur
        
        Drapeau = True
        
        While (Drapeau)
            Range("A" & DerniereLigne).Select
            ActiveCell.Offset(-1, 0).Select
            While (ActiveCell.Offset(0, 0).Value = "")
                ActiveCell.Offset(-1, 0).Select
                If (ActiveCell.Row = 1) Then
                    Drapeau = False
                End If
            Wend
            PremiereLigne = ActiveCell.Offset(0, 0).Row
            Rows(PremiereLigne & ":" & DerniereLigne).Select
            Selection.Delete
            DerniereLigne = Range("A" & (PremiereLigne - 1)).Row
            If (Range("A" & DerniereLigne).Value = "Conserver") Then
                Range("A" & (DerniereLigne - 1)).Select
                While (ActiveCell.Offset(0, 0).Value <> "Détruire") And (Drapeau)
                    ActiveCell.Offset(-1, 0).Select
                    If (ActiveCell.Row = 1) Then
                        Drapeau = False
                    End If
                Wend
                DerniereLigne = ActiveCell.Offset(0, 0).Row
            End If
        Wend
        
        Range("A" & Limite).Select
        While (ActiveCell.Offset(0, 0).Row > 1)
            If (ActiveCell.Offset(0, 0).Value = "Conserver") Then
                ActiveCell.Offset(0, 0).Value = ""
            End If
            ActiveCell.Offset(-1, 0).Select
        Wend
        Application.ScreenUpdating = True
        
    End Sub
    '
    


    Lupin
    0
  10. frany12
     
    Bonjour Lupin,
    Ca c'est du code!!!! Merci infiniment.
    Cependant je n'arrive pas completement a executer la macro sur mon fichier. J'ai teste sur ton fichier c'est impeccable.

    Il bloque apres drapeau= true sur le 1er :
    ActiveCell.Offset(-1, 0).Select
    Je ne comprends pas trop pourquoi?

    PS precision supplementaire la presentation du tableau est comme ci-dessous

    ........<.......code...........>............
    Alain sem1 sem2 sem3
    Projet1 1 0 1
    Projet2 2 1 1
    Projet3 1 1 1
    Projet4 2 1 1
    Total 6 3 4

    .........<.../...code.......>...........

    Les noms commenc a la cellule D2, D3, D4,...D293 et les semaines a partir de K2:CH293
    Peut-etre que ca change qqchose?
    0
  11. Utilisateur anonyme
     
    Bonjour Frany,

    Premier point :

    les balises de code :

    ........<.......code...........>............
    texte texte
    texte texte

    .........<.../...code.......>...........

    sans les points pour les balises, je l'ai ai inclus car les balises ne sont pas visible dans le message.

    pour donner un autre exemple, je remplace le mot [code] par le mot [Lupin]

    <Lupin>
              sans          les          points
    </Lupin>
    


    Deuxième point :

    Effectivement, la structure de la feuille est très importante, avec les infos que tu m'as
    fournit : [ Les noms commenc a la cellule D2, D3, D4,...D293 et les semaines a partir de K2:CH293 ]
    je vais tenter de regénérer la feuille, toutefois il serait plus efficace que tu place ton classeur
    sur [ ci-joint ] comme j'ai fait si celui-ci ne contient pas d'information confidentiel.

    Si ton classeur contient des informations confidentiel, recopie la feuille dans un nouveau
    classeur et ne conserve que le première itération ( dans tes exemple celle de Alain ) en
    modifiant les données sans modifier la structure.

    Autre point :

    Il serait aussi possible d'apprendre a débogger le code !

    Tu place en commentaire les lignes :
        'Application.ScreenUpdating = False
        ...
        'Application.ScreenUpdating = True
    


    et tu lance la macro en mode [ pas à pas détaillé ], ainsi tu peux suivre le code ligne à ligne !

    Lupin
    0
  12. Utilisateur anonyme
     
    re :

    Les semaines ???
    En commencant les semaine à la colonne K2 et en intercalant une colonne vide entre chaque, je me rends à la colonne DI2
    Si j'omets d'intercaler un colonne vide, je me rends à la colonne BJ2

    Les Noms ???
    Les noms commenc a la cellule D2, D3, D4,...D293

    si la structure est :

    Alain
    Projet1
    Projet2
    Projet3
    Projet4
    Total
    Pierre
    Projet1
    Projet2
    etc ...

    J'obtiens pour les noms :

    [ D2 : D8 : D14 : etc... ]

    Je ne comprends pas bien la structure !

    Lupin
    0
  13. frany12
     
    Bonjour Lupin,

    Merci pour les commentaires plus haut. J'ai mis l'ossature de mon fichier sur ci joint:
    [url]http://www.forum-openoffice.org/ci-joint/fichier/2007/08/11-091650.xls[/url]

    J'espere que ca t'aidera a avoir une vue plus precise.
    Je te remercie infiniment du temps que tu consacres a mon probleme.

    Bon week end

    Frany
    0
  14. Utilisateur anonyme
     
    Bonjour Frany,

    Alors voici ce que ça donne :

    Option Explicit
    
    Sub Nettoyage()
    
        Const AdresseFin = 86
        Const Detruire = "Kill"
        Const Conserver = "Keep"
    
        Dim Lignes() As Long, Compteur As Long, Boucle As Long
        Dim PremiereLigne As Long, DerniereLigne As Long, Limite As Long
        Dim Cellule As Range, Plage As Range, Drapeau As Boolean, Flag As Boolean
        
        Application.ScreenUpdating = False
        Selection.SpecialCells(xlCellTypeFormulas, 1).Select
        Compteur = 1
        For Each Cellule In Selection
            If (Cellule.Value < 5) Then
                ReDim Preserve Lignes(Compteur)
                Lignes(Compteur - 1) = Cellule.Row
                Compteur = (Compteur + 1)
            End If
        Next Cellule
    
        Compteur = 0
        For Compteur = 0 To (UBound(Lignes) - 1)
            Cells(Lignes(Compteur), 1).Select
            Set Plage = Range(ActiveCell.Offset(0, 0).Address, ActiveCell.Offset(0, AdresseFin).Address)
            Plage.Select
    
            Drapeau = False
            For Each Cellule In Plage
                If (Cellule.FormulaLocal <> Cellule.Value) Then
                    If (Cellule.Value > 5) Then
                        Drapeau = True
                        Range("A" & Cellule.Row).Value = Conserver
                        Exit For
                    Else
                        Range("A" & Cellule.Row).Value = Detruire
                        DerniereLigne = Cellule.Row
                        Limite = DerniereLigne
                    End If
                End If
            Next Cellule
        Next Compteur
        
        Drapeau = True: Flag = True
        
        While (Drapeau) Or (Flag)
            Range("A" & DerniereLigne - 1).Select
            While ((ActiveCell.Offset(0, 0).Value <> Conserver) And (ActiveCell.Offset(0, 0).Value <> Detruire)) And (ActiveCell.Offset(0, 0).Row > 1)
                ActiveCell.Offset(-1, 0).Select
            Wend
            Drapeau = False
            PremiereLigne = ActiveCell.Offset(1, 0).Row
            Rows(PremiereLigne & ":" & DerniereLigne).Select
            Selection.Delete
            DerniereLigne = PremiereLigne - 1
            Range("A" & DerniereLigne).Select
            If (ActiveCell.Offset(0, 0).Value <> Detruire) Then
                While ((ActiveCell.Offset(0, 0).Value <> Detruire)) And (ActiveCell.Offset(0, 0).Row > 1)
                    ActiveCell.Offset(-1, 0).Select
                Wend
            End If
            DerniereLigne = ActiveCell.Offset(0, 0).Row
            Range("A" & (DerniereLigne)).Select
            While ((ActiveCell.Offset(0, 0).Value <> Conserver) And (ActiveCell.Offset(0, 0).Value <> Detruire)) And (ActiveCell.Offset(0, 0).Row > 1)
                ActiveCell.Offset(-1, 0).Select
            Wend
            If (ActiveCell.Offset(0, 0).Row < 2) Then
                Flag = False
            End If
        Wend
        Range("A2").Select
        For Boucle = 0 To Limite
            If (ActiveCell.Offset(Boucle, 0).Value = Conserver) Then
                ActiveCell.Offset(Boucle, 0).Value = ""
            End If
        Next Boucle
        Range("A1").Select
        Application.ScreenUpdating = True
        
    End Sub
    '
    


    Je tiens tout de même à te dire que l'algo n'est pas optimisé. J'ai travaillé à l'envers.
    C'est à dire que j'ai codé avant de faire l'algo (i.e. d'avoir une vue d'ensemble).

    Il n'y a pas de contrôle sur l'ossature du classeur, si des erreurs se glisse dans l"ossature
    la macro va planter ou mal réagir.

    Conseil pratique : Dans un classeur de donnée, conserve toujours la colonne A pour créer
    un index si tu veux implanter du VBA, ce sera toujours plus simple. De plus, je ne suis pas
    convaincu que l'utilisation de sous-total soit mieux qu'un simple total !

    Alors voilà, bonne semaine, je demeure sur le fil ...

    Lupin
    0
  15. frany12
     
    Bonsoir Lupin,
    Le code plante lorsque je l'execute sur mon fichier au premier:

    Range("A" & DerniereLigne - 1).Select

    apres
    Drapeau = True: Flag = True

    While (Drapeau) Or (Flag)

    Il faut que j'apprenne un peu plus le code VBA car j'avoue ne pas bien comprendre tout le code que tu as ecris.

    Pour l'instant j'ai trouve une solution qui a l'air de marcher. J'ai fait un filtre automatique sur la base de donnees et ensuite clique sur la petite fleche a droite en entete de colonne de l'une des semaines, fais "custom autofilter" (j'utilise une version anglaise excel) et ai mis comme critere >=5... je vais verifier pour voir s'il a tout pris car a premiere vue ca a l'air d'etre bon : il n' affiche les lignes que lorsque il y a au moins un sous-total >=5 Voici ce que donne le code pour info:

    <.......code...........>
    Sub ensemble()
    '
    ' showspecific5 Macro
    ' '
    Range("F2").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=11, Criteria1:=">=5", Operator:=xlAnd
    End Sub

    <.../...code.......>

    Encore une fois un grand merci pour ton aide tout au long de la semaine. C'est sympa d'avoir des gens qui s'entraident comme cela.

    PS: j'ai utilise un sous-total car toute debutante que je suis j'ai trouve cette solution automatique pratique plutot que de m'amuser a faire un sous-total conditionnel. Aurais-tu une solution simple pour faire une somme par personne plutot qu'un sous total quand tu as plusieurs lignes?

    Bonne semaine,

    Frany
    0
  16. Utilisateur anonyme
     
    Bonjour Frany,

    Dans un premier temps, récupère le prototype que j'ai fait et essai de voir les différence.

    http://membre.oricom.ca/lupin/documents/ex_horaire.xls

    n.b. ce lien n'est que temporaire et sera détruit après usage.

    Je vais regarder s'il n'y aurait pas une autre approche pour ton besoin.

    Cordialement

    Lupin
    0
    1. Frany12
       
      Bonjour Lupin,
      Je vais regarder le proto que tu as fais et te tiens au courant.
      Merci et bonne soiree

      Frany
      0