IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Suppression lignes selon 1 condition [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut Suppression lignes selon 1 condition
    Bonjour
    J'applique un code qui me supprime des lignes selon la condition "#VALEUR!" mais il me reste toujours quelques lignes et ceci après la suppression de toutes les autres. Comment modifier ce code de façon qu'il supprime toutes les lignes.
    Merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub Module05SupprimerLignesSelonCondition()
     
     
    Dim i As Long, LigDeb As Long, LigFin As Long
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With ActiveCell.CurrentRegion
        LigDeb = .Cells(1).Row
        .Cells(1).EntireRow.Insert
        LigFin = LigDeb + .Rows.Count
    End With
    With ActiveSheet
        If LigFin - LigDeb > 1 Then
            .Range(.Cells(LigDeb, 1), .Cells(LigDeb, 5)).Value = "#VALUE!"
            ActiveCell.CurrentRegion.AdvancedFilter xlFilterInPlace, , , True
            For i = LigFin To LigDeb + 1 Step -1
                If .Rows(i).Hidden Then .Rows(i).Delete
            Next i
        End If
        .Rows(LigDeb).Delete
        If .FilterMode And Cells(LigDeb, 1).CurrentRegion.Rows.Count > 1 Then .ShowAllData
        Cells(LigDeb, 1).Select
    End With
    Application.DisplayAlerts = True
    End Sub

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Plutot que CurrentRegion, j'utiliserais UsedRange

    Citation Envoyé par Aide "CurrentRegion"
    Cette propriété renvoie un objet Range qui représente la zone en cours. Celle-ci est une plage limitée par toute combinaison de lignes et de colonnes vides
    Je ne saurais trop te conseiller de pointer la feuille sur laquelle tu travailles en la placant dans une variable WorkSheet. Depuis cette variable tu pourras ainsi appeler UsedRange

    [Edit]
    Sinon une autre piste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub teste()
    'Virer les lignes #Valeur
    Dim TheCell As Range
    Dim iRow As Long
    Dim MonWs As Worksheet
     
    'Init
    Set MonWs = Worksheets("FEuil1") ' a adapter
     
    With MonWs
        For iRow = .Cells(Rows.Count, "E").End(xlUp).Row To 1 Step -1
            Application.DisplayAlerts = False
            If IsError(.Cells(iRow, "E")) Then .Rows(iRow).Delete 'prend en compte tous type d'erreur
            Application.DisplayAlerts = True
        Next
    End With
    End Sub
    Je ne l'ai pas testé par contre
    [/Edit]

    ++
    Qwaz

  3. #3
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Bonjour Qwazerty
    Quand je fais F5, Cellules, Zone en cours, j'ai bien toute la zone qui m'interesse qui est sélectionnée.
    Je vais essayer de mettre ce code dans une autre feuille pour essai
    Après essai, il ne me reste toujours qu'une ligne, je pense que ce code laisse toujours une ligne
    Il faut que j'essaie de faire autrement
    Merci

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            .Range(.Cells(LigDeb, 1), .Cells(LigDeb, 5)).Value = "#VALUE!"
            ActiveCell.CurrentRegion.AdvancedFilter xlFilterInPlace, , , True
    Je comprend pas ce que tu fais.
    Tu appliques le texte "#Value!" dans toutes tes cellules (Juste pour faire un teste?)
    Tu fais un filtrage avancé mais il n'y a pas de critères de spécifiés.

    Peux tu éclairer ma lanterne? :p
    ++
    Qwaz

  5. #5
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Qwazerty
    J'ai récupéré ce code et j'essaie de l'appliquer dans ma feuille qui comprends des lignes qui ont des cellules avec des "#VALEUR!" mais qui sont du texte suite à copier collage spécial valeur, je souhaiterais donc supprimer toutes les lignes qui ont ce texte et qui sont dans la colonne E sur certaines lignes.
    J'ai aussi essayé avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Module1SuppressionLignesAvecCritères()
     
     
    For n = Range("A65536").End(xlUp).Row To 1 Step -1
          If InStr(Range("A" & n), "#VALEUR!") > 0 Then Rows(n).Delete
        Next n
    End Sub
    mais je dois faire une erreur que je ne trouve pas
    J'espère t'avoir bien expliqué,
    Merci

  6. #6
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Rebonjour Qwazerty
    Je viens de trouver une solution, toujours quelque chose de non codable par un pro car du bricolage, mais bon ça marche.
    C'est le "#" qui me bloquait tout, je le supprime, puis je lance la boucle qui supprimes toutes mes lignes, c'est pas bien beau, mais je fais avec mes connaissance, et tu m'as fait réfléchir autrement.
    Merci à toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Module12Replacer()
     
        Cells.Replace What:="#VALEUR!", Replacement:="VALEUR!", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Module06SuppressionLignesAvecCritères()
     
     
    For n = Range("E65536").End(xlUp).Row To 1 Step -1
          If InStr(Range("E" & n), "VALEUR!") > 0 Then Rows(n).Delete
        Next n
    End Sub

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Re

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub teste()
    'Virer les lignes #Valeur
    Dim TheCell As Range
    Dim iRow As Long
    Dim MonWs As Worksheet
     
    'Init
    Set MonWs = Worksheets("FEuil1") ' a adapter
     
    With MonWs
        For iRow = .Cells(Rows.Count, "E").End(xlUp).Row To 1 Step -1
            Application.DisplayAlerts = False
            If .Cells(iRow, "E") = "#Valeur!" Then .Rows(iRow).Delete 'prend en compte tous type d'erreur
            Application.DisplayAlerts = True
        Next
    End With
    End Sub
    Si ça ne fonctionne pas essai avec la méthode Find appliqué sur la plage de cellule.

    ++
    Qwaz

  8. #8
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Qwazerty
    Je croyai avoir trouvé, mais mon code ne fonctionne pas par VBA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Module12Replacer()
     
        Cells.Replace What:="#VALEUR!", Replacement:="VALEUR!", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    End Sub
    Il ne fonctionne qu'avec l'opérateur

    Ton code bloque sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If .Cells(iRow, "E") = "#Valeur!" Then .Rows(iRow).Delete 'prend en compte tous type d'erreur
    Bon, je continue demain, car boulot

    Merci

  9. #9
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Voila, ce code devrait résoudre ton problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub teste()
    'Virer les lignes #Valeur
    Dim TheCell As Range
    Dim iRow As Long
    Dim MonWs As Worksheet
     
    'Init
    Set MonWs = Worksheets("FEuil1") ' a adapter
     
    With MonWs
        For iRow = .Cells(Rows.Count, "E").End(xlUp).Row To 1 Step -1
            Application.DisplayAlerts = False
            If .Cells(iRow, "E").Text = "#VALEUR!" Then .Rows(iRow).Delete 'prend en compte tous type d'erreur
            Application.DisplayAlerts = True
        Next
    End With
    End Sub
    ++
    Qwaz

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next
    Worksheets("FEuil1").Columns(5).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
    On Error GoTo 0

  11. #11
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Bonjour Qwazerty
    Génial, tout fonctionne, ta macro superbe
    Un grand merci à toi

    Bonjour Mercatog
    J'ai essayé aussi ton code, mais tu sais bien que je bricole, je n'ai pas réussi ta proposition.
    Un grand merci aussi, tu m'as déjà tellement arrangé de code.
    Très cordialement à tous les deux

  12. #12
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub test()
    On Error Resume Next
    Worksheets("Feuil1").Columns(5).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
    On Error GoTo 0
    end sub
    Tu adaptes le nom de la feuille Feuil1 et le N° de colonne (ici 5)
    Les erreurs sont issues de formules, sinon remplace xlCellTypeFormulas par xlCellTypeConstants

  13. #13
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Mercatog
    J'ai du mettre comme tu me l'as proposé sur ton code:

    et tout fonctionne, je dirais que c'est...bluffant, car l'exécution est pratiquement instantanée, il y a une époque ou j'aimais qu'une boucle travaille longtemps et ça me semblait étonnant, maintenant j'essaie de raccourcir le temps d'exécution au maximum. Comment fais tu pour tout connaitre des expressions "xlCellTypeFormulas par xlCellTypeConstants".
    Encore un code qui va me servir pour faciliter le travail de mes collègues et tout ça pour le plaisir d'essayer de lires vos codes tous les soirs après mon boulot ou je ne manque pas de voter quand j'arrive à faire marcher vos propositions de codes.
    Merci.
    Bien cordialement

  14. #14
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour moi, je ne me passe jamais du F1
    Bon week end à contempler la beauté du Mont Blanc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Concaténer plusieurs lignes selon une condition
    Par AJ_ing dans le forum Shell et commandes GNU
    Réponses: 29
    Dernier message: 31/08/2012, 09h51
  2. Suppression lignes tableaux sous condition
    Par ES718 dans le forum VBA Word
    Réponses: 2
    Dernier message: 17/07/2012, 09h07
  3. copier des lignes selon deux conditions
    Par ghatfan99 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/10/2011, 10h58
  4. [XL-2003] Suppression lignes selon colonne de 2 sheets
    Par Vadorblanc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/02/2011, 16h54
  5. [XL-2003] Insérer une ligne selon une condition
    Par MiXinG dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/07/2009, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo