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 :

Supprimer lignes si cellule vide sur plusieurs sheets


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de camzo
    Homme Profil pro
    ingénieur en documentation
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur en documentation
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Points : 101
    Points
    101
    Par défaut Supprimer lignes si cellule vide sur plusieurs sheets
    Bonsoir,

    Je tente d'appliquer la macro Supprime les lignes si cellule vide en colonne A sur plusieurs feuilles d'un classeur.

    Pour cela, j'ai trouvé de quoi prendre en compte toutes les feuilles d'un classeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim fl As Worksheet
    For Each fl In ThisWorkbook.Worksheets
    ...
    Next fl
    Et j'ai testé avec succès la suppression des lignes dont la cellule en colonne A est vide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim i As Integer
    Dim LastRow As Integer
    LastRow = Range("A65536").End(xlUp).Row
     
        For i = LastRow To 2 Step -1
            If Cells(i, 1) = "" Then Rows(i).Delete
        Next i
    Du coup, j'ai voulu mixer l'ensemble comme suit dans une macro:

    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
    Sub Test()
     
    Dim i As Integer
     
    Dim LastRow As Integer
    LastRow = Range("A65536").End(xlUp).Row
     
    Dim fl As Worksheet
     
    For Each fl In ThisWorkbook.Worksheets
     
        For i = LastRow To 2 Step -1
            If Cells(i, 1) = "" Then Rows(i).Delete
        Next i
     
    Next fl
     
    End Sub
    J'imagine que cela vous saute aux yeux...
    Merci par avance pour vos lumières

    Camzo

  2. #2
    Membre régulier Avatar de camzo
    Homme Profil pro
    ingénieur en documentation
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur en documentation
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Points : 101
    Points
    101
    Par défaut
    Pardon, j'ai oublié d'expliquer le résultat: cela fonctionne bien sur la feuille active mais pas d'action sur les autres feuilles du classeur.
    C'est comme si mon for each n'était pas pris en compte à compter du moment où j'ai ajouté l'étape de la suppression de ligne...

    Cordialement,
    Camzo

  3. #3
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonsoir,

    tu persistes avec les boucles , mais bon faut bien apprendre

    pose toi ces questions :
    que représente ton fl ?
    comment pointes tu sur une plage précise sur une feuille déterminée ?
    manque t-il pas qq ch dans ta boucle ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  4. #4
    Membre régulier Avatar de camzo
    Homme Profil pro
    ingénieur en documentation
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur en documentation
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Points : 101
    Points
    101
    Par défaut
    Zut, je commence à me faire une réputation... et pas des meilleures !!!
    J'ai effectivement comme qui dirait du mal à lâcher les boucles. Un collègue insiste aussi là-dessus, je vais finir par lâcher...

    Je pense néanmoins me rapprocher du but!

    Déjà je suis passé en ActiveWorkbook et ActiveSheet (au lieu de nommer notamment ma sheet "feuille1" directement). Je pense que cela aide, mais un peu tard pour contre-vérifier... ce sera pour demain si j'ai le temps!

    Et ensuite j'ai intégré un With / End With. Cela semble coller. Mais je n'y mettrai pas ma main à couper.


    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
    Dim fl As Worksheet
    Sheets("Sheet1").Select
     
    For Each fl In ActiveWorkbook.Worksheets
     
    fl.Activate
     
    With ActiveSheet.Range("A:A")
        For i = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
            With .Cells(i, 1)
                If IsEmpty(.Value) = True Then ...
            End With
        Next i
    End With
    Next fl
    End Sub
    Je regarde demain matin plus en détail afin de décortiquer le tout avec (je l'espère) un collègue qui s'y connait bien mieux que moi.

    Cordialement,
    Camille

  5. #5
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    haaa erfff quel horreur un activate

    le pointage schématiquement se fait comme ceci :
    Classeur.feuille.plage

    même t as dernière ligne n'est pas inclus dans la boucle - correction rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
     
    Dim i As long, LastRow As Long, fl As Worksheet
     
    For Each fl In ThisWorkbook.Worksheets
        LastRow = fl.Range("A65536").End(xlUp).Row 
        For i = LastRow To 2 Step -1
            If fl.Cells(i, 1) = "" Then fl.Rows(i).Delete
        Next
    Next
    End Sub
    j'ai pas vérifié je l'ai fait vite fait à la volée, si il y a une erreur, précise là

    Voilà un démo quasi automatique rien qu'avec des formules
    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
    27
    28
    Sub Demo()
    Dim ws As Worksheet
    'Demo fait sur 4 feuilles tout automatiser
        For Each ws In Worksheets
            With ws
                With .UsedRange
                    DL& = Split(.Address, "$")(4): Col& = .Columns.Count + 1
                End With
     
                entete = Array(3, 1, 2, 5)(.Index - 1) ' on démare de la ligne 4 puis 1, 3 et 5 (dans l'odre des feuilles)
                'Cela permet de définir différents en-têtes afin que ceci ne soit pas toucher => ex : en feuil1 l'en-tête vaut 4 -1 = 3
                If entete - 1 > 0 Then .Cells(Col).Resize(entete - 1).Value = 0
            'Application.ScreenUpdating = False
                With .Range(.Cells(entete, Col), .Cells(DL, Col))
                    .Formula = "= A" & entete & "=""""" 'Ici on change la formule selon ce que l'on veut (là on a : Ax = "") x représentant la ligne par "entete"
                    .Value = .Value
                End With
     
                .UsedRange.Sort .Cells(Col), xlAscending, Header:=xlNo
                V = Evaluate("=MATCH(TRUE," & ws.Name & "!" & .Columns(Col).Address & ",0)")
                If Not IsError(V) Then
                    .Rows(V & ":" & DL).EntireRow.Clear
                End If
                .Columns(Col).Clear
            'Application.ScreenUpdating = True
            End With
        Next
    End Sub
    Edit : j'ai apporté une correction à mon code, je l'ai fait afin que tu puisses l'analyser

    Pour Analyser le code il faut :
    - Ouvrir la fenêtre des variables locales pour vérifier ce qu'il s'y passe lorsque l'on fait du pas à pas dans le code
    - pour faire du pas à pas dans dans le code, utiliser la touche F8
    - on peut vérifier certaines parties du code (ce que l'on souhaite) avec un Debug.Print (soit dans le code soit via des tests avec la fenêtre d'exécution) - pour Debug.Print cf l'aide vba

    PS : Dans la boucle for Each fl prends la valeur de chaque feuille l'une après l'autre à chaque passage dans la boucle
    si tu as 3 feuilles : Feuil1, Feuil2 et Feuil3, alors fl sera égal à Feuil1 puis Feuil2 puis Feuil3
    on aura alors fl.Cells(i, 1) ou en clair Feuil1.Cells(i, 1), etc …

    Edit : Petites corrections de texte
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    Bonjour,

    Si jamais tu veux le faire sans boucle (ce qui est plus rapide) je te conseille d'aller voir ici: https://www.developpez.net/forums/d1...on-lignes-vba/
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

Discussions similaires

  1. Macro pour masquer des lignes vides sur plusieurs feuillés.
    Par baloote69 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 03/11/2015, 11h38
  2. [XL-2007] Sélectionner la première cellule vide sur une ligne.
    Par Rémy A. dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/07/2013, 14h22
  3. [XL-2003] Supprimer ligne si cellule vide ou
    Par guigui69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/05/2011, 09h32
  4. [XL-2000] Supprimer ligne si cellule d'une colonne = 0, sur une plage de cellules
    Par audesara dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/05/2011, 16h16
  5. [VBA-E] cellules vide sur une ligne
    Par bricereyem dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 12/06/2006, 21h20

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