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 :

Si cellule vide passer à la ligne suivante [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Août 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Août 2015
    Messages : 37
    Par défaut Si cellule vide passer à la ligne suivante
    Bonjour,
    J'ai dans une feuille excel plusieurs cellules sur une même colonne qui peuvent être vide ou contenir du texte.

    Sur une autre feuille du même fichier, je souhaite aller chercher le contenu de la première cellule de la ligne :
    - si cette cellule est vide, on va chercher celui de la suivante et si elle vide la suivante...
    - si elle est pleine, on reporte son contenu dans la cellule en question et on se décale d'une cellule (ligne suivante) pour faire la même chose.

    Ma première feuille est une extraction de certaine colonne d'un autre fichier. Dois-je faire une macro qui supprime les lignes lors de la copie des colonnes ?

    Existe il une fonction itérative qui permette de faire ça ?


    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Dans la colonne juste à droite de ta première cellule, tu tapes "1" et tu tapes "2" dans la cellule d'en dessous.
    Tu sélectionnes les deux cellules et tu tires vers le bas autant que tu as de ligne remplies dans ta colonne pour te faire une suite.
    Ensuite tu fais un tri de ces deux colonnes, en prenant ta colonne comme critère de tri, ça te permettra d'isoler les vides.
    Ensuite tu refais un tri mais en prenant la suite qu'on vient de créer comme critère, ce qui remettra tes données dans l'ordre initial.

    Autre méthode encore plus rapide avec un filtre.
    Tu sélectionnes ta colonne > Ruban données > Icone Filtrer
    Tu cliques sur la flèche en entête de colonne et dans la fenêtre, tu décoches la case "Vide" (qui est généralement la dernière).
    Tu sélectionnes toutes tes cellules qui restent > Ctrl + C
    Tu cliques ailleurs > Ctrl + V
    Tu recliques sur l'Icone Filtrer pour supprimer le filtre.

    Tout ça ne devrait te prendre que quelques secondes.
    Pour rentabiliser une macro qui obtienne le même résultat, il faudrait vraiment que tu ais à le faire souvent.

  3. #3
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Août 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Août 2015
    Messages : 37
    Par défaut
    Le problème c'est que j'ai plus de 300 ligne et le fichier est complété au fur et à mesure du temps(c'était qu'une illustration).
    j'ai essayé avec la formule =SI(A2<>"";MAX($G$1:G1)+1;"") dans la case G2 pour faire une liste de rang automatique quand il y a du texte, et si il y a rien j'ai pas de numéro. Et après je suis bloqué, j'aimerais dans la feuille analyse que si il y a un rang que ça recopie les bonnes données et s'il n'y a pas de rang ça passe à la ligne suivante.
    Pour éviter les macros si c'est possible.

    Sinon j'ai fait une macro pour supprimé les lignes si A est vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 500 To 2 Step -1
        If Range("A" & i).Value = "" Then Rows(i).Delete
    Next i
    Mais le problème c'est que la macro est lente et je ne sais pas combien de ligne je vais avoir.
    Merci d'avance.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Mais le problème c'est que la macro est lente et je ne sais pas combien de ligne je vais avoir.
    => C'est bien normal et je pense que nous sommes tous passés par là!

    Il est préférable de jouer sur les filtres et de récupérer le résultat pour la copie.

    Ebauche de code à valider (testé)
    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
    Sub TestValidData()
     
    Dim InpRng As Range, SelRng As Range
     
    ' Init
        Set InpRng = ThisWorkbook.Worksheets(1).UsedRange    'A adapter
        If InpRng.Worksheet.AutoFilterMode = True Then InpRng.Worksheet.AutoFilterMode = False
        Debug.Print InpRng.AddressLocal
     
    ' On filtre en enlevant les enregistrements vides de la colonne A
        With InpRng
            .AutoFilter
            .AutoFilter Field:=1, Criteria1:="<>"
        End With
     
        Set SelRng = InpRng.SpecialCells(xlCellTypeVisible)
        Debug.Print InpRng.AddressLocal, SelRng.AddressLocal
     
        SelRng.Copy Worksheets(3).Range("A1") 'A affiner
     
    End Sub

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    La seconde méthode que je t'ai donnée (avec le filtre) ne prend pas plus de temps (ou presque) qu'il y ait 10 lignes ou qu'il y en ait 10 000.

    Mais si tu tiens à perdre ton temps à passer par une macro, il y a une solution bien plus simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeConstants).Copy
    Range("B1").PasteSpecial (xlPasteValues)
    SpecialCells, c'est une méthode qui permet de faire beaucoup de choses très simplement.

  6. #6
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Août 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Août 2015
    Messages : 37
    Par défaut
    Citation Envoyé par Menhir Voir le message
    La seconde méthode que je t'ai donnée (avec le filtre) ne prend pas plus de temps (ou presque) qu'il y ait 10 lignes ou qu'il y en ait 10 000.
    Pour ce qui est du filtre je dois avoir un bug je ne peux pas sélectionner la case vide et quand cela fonctionne, les lignes vides ne sont pas toutes supprimé.
    Je vais essayer les macros que vous me proposer.
    Mais j'ai trouver une macro qui me supprime les lignes sans faire d'étape de tri auparavant sur un nombre indéterminé de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each c In Sheets("feuil1").Range("A2:A" & Range("A65356").End(xlUp).Row) 
    If c = "" Then c.EntireRow.Delete
    Next c
    Je sais que c'est pas encore parfait mais avec votre aide j'avance plutôt bien.
    Merci

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par FLoPigloo Voir le message
    quand cela fonctionne, les lignes vides ne sont pas toutes supprimé.
    Les cellules qui ne sont pas masquées ont sans doute quelque chose dedans, même si ce "quelque chose" n'est pas visible et que la cellule semble vide.

    Mais j'ai trouver une macro qui me supprime les lignes sans faire d'étape de tri auparavant sur un nombre indéterminé de ligne :
    La macro que je t'ai proposé n'utilise pas de filtre ni de tri et n'a aucune limite de ligne.
    Elle ne fait que deux lignes. Tu auras du mal à trouver plus court.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each c In Sheets("feuil1").Range("A2:A" & Range("A65356").End(xlUp).Row) 
    If c = "" Then c.EntireRow.Delete
    Next c
    Si tu indique la feuille de ton premier Range, il faut le faire aussi pour le second (ou utiliser un With). Sinon, soit ça ne marchera pas, soit le premier Sheet ne sert à rien.
    Au lieu d'écrire "A65356" dans le Range de ton End, écrit plutôt "A" & Rows.Count. Ta macro sera plus portable.
    Ta macro utilise une boucle qui scrute les lignes une par une et tu supprime les ligne avec un Delete ce qui est assez lent.
    Donc, si tu as beaucoup de lignes, ça sera lent.

    La mienne se contente de faire un seul copier/coller global. Difficile de faire plus rapide.

    Je te propose une solution toute cuite, ait au moins la décence de l'essayer.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 19/11/2010, 10h28
  2. recherche de la 1ère cellule vide dans une ligne
    Par ericberg dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/10/2010, 20h53
  3. Passer à la ligne suivante .txt
    Par the watcher dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 09/08/2010, 15h48
  4. Passer à la ligne suivante (ReadLine());
    Par Rusty2096 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 08/07/2009, 08h10
  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