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 :

[Aide]Comment trouver une ligne entièrement vide


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 60
    Points
    60
    Par défaut [Aide]Comment trouver une ligne entièrement vide
    Bonjour

    En ce lendemain de jour ferié, me re-voici au travail sur mon projet VBA. Le problème du jour s'intitule "comment trouver une ligne entièrement vide"

    j'explique : j'ai plusieurs tableaux en colonne, ce sont de vrais gruyères. Certaines cellules, au lieu de comporter un 0 ne comportent rien et sont donc vides. Je n'y peux rien, les cellules sont remplies par un logiciel tiers.

    Pour déterminer la fin d'un tableau, je ne peux donc pas chercher la prochaine cellule vide d'une colonne, puisque parfois la cellule A1 sera vide, B1 et C1 remplies, puis de nouveau D1 vide.

    Donc ma question, après plusieurs heures de recherches sur le net, et d'essais infructueux, est : comment déterminer la prochaine ligne totalement vide ?

    J'attend vos réponses avec impatience

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu peux jeter un oeil ici, tu as un grand nombre d'exemple et les explications avec.
    Regarde aussi CurrentRegion dans l'aide.
    Une précision utile : La première ligne vide est la dernière ligne renseignée + 1

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Merci, j'étais déjà tombé sur cette page durant mes recherches... Mais je n'ai pas réussi à appliquer une seule de ces formules à mon cas.



    Voici à quoi ressemblent mes tableaux. Je dois tester si les valeurs de LHV et Sg sont vides. Si elles le sont, le tableau ne doit pas apparaître sur la feuille (pour l'instant les 3 tableaux sont remplis. Mais selon les cas, il peut n'y avoir qu'un ou deux gaz utilisés et le / les autres ne devraient pas apparaître).

    Ma solution était, une fois qu'on connait le statut (vide ou rempli) de ces deux cellules, de "masquer" le tableau correspondant, d'où le besoin de connaître la prochaine ligne entièrement vide, soit la fin du tableau. Le tout, encapsulé par une boucle qui permet de traiter chaque tableau un par un (celle ci fonctionne). C'est un peu "bricolé".

    Donc si tu vois une meilleure solution que celle que j'ai appliqué, je t'en prie

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ok. avant de te proposer quelque chose, une question : Quand tes tableaux son vides, est-ce que ta colonne A est toujours renseignée.
    Si oui, un début de solution consiste à vérifier que ta ligne est vide à partir de la colonne B.
    Une autre question : Tes tableaux ont-ils toujours le même nombre de ligne ?
    Si oui, ça va être facile.

    je suppose que ta colonne A est toujours renseignée. Auquel cas, pour savoir si la ligne est vide, tu testes la dernière colonne renseignée de la ligne et si c'est 1, ton tableau est vide. Pour ça tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        DerniereColonne = Range("IV" & NoLigne).End(xlToLeft).Column
    Si DerniereColonne = 1, tu n'as que le libellé de la ligne.
    Pour ce qui est des tableaux vides, le mieux c'est de masquer les lignes. Mais si tu as un pb, tu dis
    A+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    En faite, lorsque les valeurs de LHV et Sg sont vides, les libellés restent effectivement affichés.

    Mais comme tu peux le constater, il y a toujours au moins une cellule vide par colonne, qui ne correspond pas à la fin du tableau. Exemple pour le 1er tableau : B2 (si LHV est vide), A6, D7 E7 et F7. Du coup, pas évident de tester par colonne seule !

    [EDIT]

    Après avoir posé la question à Monsieur le Chef, les tableaux devraient tous avoir le même nombre de lignes... Je peux donc, pour masquer un tableau, sélectionner la plage de cellules en comptant les lignes avant et après... Ca me parraît un peu léger, mais ca peut marcher non ?

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Avant de te proposer ce qui me vient à l'esprit, c'est bien tout le tableau que tu testes ? Si une ligne est renseignée dans un tableau mais pas les autres lignes du même tableau, tu gardes bien tout le tableau ?
    Comme c'est ce qui me paraît logique, je te propose quelque chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim DerniereLigne as long, NoLigne as long, LigneVide as byte, i as long
        DerniereLigne = range("A65535").end(xlUp).row
        For i = 1 to DerniereLigne step 10 'Toutes les 10 lignes tu as un tableau
              For NoLigne = i to i + 7 step 1 'On vérifie toutes les lignes...
                    '... mais on ne tient pas compte de la cellule vide de la colonne A
                    if Range("IV" & NoLigne).End(xlToLeft).Column = 1 and Range("A" & NoLigne).value <> "" then
                         LigneVide = LigneVide + 1 'on compte le nombre de lignes vides
                    endif
              Next NoLigne
              'Si le nombre de lignes vides = 7 (8 moins la cellule vide du tableau) on masque
              If LigneVide = 7 then_
                     range("A" & i & ":A" & NoLigne + 7).entireRow.hidden = True
              LigneVide =0
        Next i ' et on passe au tableau suivant
    Tu dis
    A+

  7. #7
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 317
    Points
    317
    Par défaut
    sinon, pour vérifier qu'une ligne i est vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Application.CountA(Rows(i)) = 0 Then
        MsgBox("Ligne " & i & " vide.")
    Else
        MsgBox("Ligne " & i & " non vide.")
    End If

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Hello mordrhim, juste une petite correction : Pour utiliser CountA, qui est une fonction Excel et non VBA, tu dois mettre (*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then
    Ceci dit, si tu relis la question, tu verras que c'est un peu plus compliqué que ça

    (*) Sous réserve qu'une version ultérieure à 2003 ne permette pas de shunter WorksheetFunction

  9. #9
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 317
    Points
    317
    Par défaut
    /!\**Avis de débutant **/!\
    Citation Envoyé par mickdu90
    Donc ma question, après plusieurs heures de recherches sur le net, et d'essais infructueux, est : comment déterminer la prochaine ligne totalement vide ?
    ben moi je lui réponds comment trouver une ligne completement vide euh T_T

    ce qui ferait que je changerais ton programme (Ouskel'n'or) comme suit :
    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 DerniereLigne as long, NoLigne as long, LigneVide as byte, i as long
        DerniereLigne = range("A65535").end(xlUp).Row
        while Application.WorksheetFunction.CountA(Rows(DerniereLigne+1)) <> 0
            DerniereLigne = DerniereLigne +1
        Wend
        For i = 1 to DerniereLigne step 10
              For NoLigne = i to i + 7 step 1 
                    if Application.WorksheetFunction.CountA(Rows(i)) = 0 then
                         LigneVide = LigneVide + 1 'on compte le nombre de lignes vides
                    End If
              Next NoLigne
              'Si le nombre de lignes vides = 7 (8 moins la cellule vide du tableau) on masque
              If LigneVide = 7 then _
                     range("A" & i & ":A" & NoLigne + 7).entireRow.hidden = True
              LigneVide =0
        Next i '

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    mordrhim ?
    Citation Envoyé par mickdu90
    En fait, lorsque les valeurs de LHV et Sg sont vides, les libellés restent effectivement affichés.

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ceci dit, je corrige mon code.
    Chaque tableau comporte 8 lignes mais est séparé du précédent et du suivant par 2 ligne vide. Il faut donc masquer 10 lignes et non 8 dans cette ligne de mon code précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              If LigneVide = 7 then_
                     range("A" & i & ":A" & NoLigne + 9).entireRow.hidden = True
    A+

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Bonjour et merci de votre intérêt pour mon problème.

    Ouskel'n'or, je viens de reprendre mon projet ce matin, j'ai pas beaucoup dormi et j'ai un peu de mal à m'y remettre ce matin

    Déjà, à quoi correspond le IV dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Range("IV" & NoLigne)
    Ensuite, si j'ai bien compris, tu masques le tableau, si 7 lignes vides ont été comptabilisées ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if Range("IV" & NoLigne).End(xlToLeft).Column = 1 and Range("A" & NoLigne).value <> "" then
                         LigneVide = LigneVide + 1 'on compte le nombre de lignes vides
                    endif
              Next NoLigne
              'Si le nombre de lignes vides = 7 (8 moins la cellule vide du tableau) on masque
              If LigneVide = 7 then_
                     range("A" & i & ":A" & NoLigne + 7).entireRow.hidden = True
              LigneVide =0
    Dire que je ne suis que saisonnier dans cette boîte, et que je met tout en oeuvre pour leur trouver des solutions si tous les saisonniers mettaient autant de coeur à leur travail, le monde serait meilleur

  13. #13
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 317
    Points
    317
    Par défaut
    le "IV" correspond à la toute derniere colonne possible de excel, comme la ligne 65535 correspond à la toute derniere ligne.
    Excel peut avoir un tableau de 65535 lignes et 256 colonnes .

    ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If LigneVide = 7 then_
                     range("A" & i & ":A" & NoLigne + 9).entireRow.hidden = True
    comme l'avait corrigé ouskel'n'or. (7 lignes de tableau et 2 lignes de séparation)

    par contre une précision, tu dois masquer ton tableau si et seulement si les valeurs de LHV et Sg sont vides ?

    @Ouskel'n'or
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("IV" & NoLigne).End(xlToLeft).Column = 1 and Range("A" & NoLigne).value <> "" then
    te donnera true si la ligne est totalement vide non ?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Oui le tableau est masqué si est seulement si LHV et Sg sont vides... Mais lorsque LHV et Sg sont vides, le reste du tableau ne l'est pas, les formules des autres cellules sont censées afficher le chiffre "0" si LHV et Sg sont vides...

    C'est pour ca que je comprend pas le Si NbLignesVides = 7...

    [EDIT]

    Bref, j'ai repris un peu de vos idées, mon script à l'air de fonctionner pour ce qui est du masquage des lignes...

    Mais j'ai eu une petite précision, c'est que si un tableau est vide, alors tous les tableaux qui le suivent le sont aussi. Ainsi, plus la peine de contrôler chaque tableau. Au premier tableau vide trouvé, il suffira de masquer tous les tableaux suivants. Donc, de masquer de la 1e ligne tu premier tableau vide, jusqu'à la dernière ligne de la colonne. Ca simplifie le travail, non ?

    Encore une idée qui vient de me venir : chaque tableau commence par GAS X (où X est le numéro du gaz, par ordre croissant)... Pour chercher la fin du tableau, je peut tout autant déterminer la ligne de la prochaine chaine "GAS", et masquer le tableau jusqu'à cette cellule - 1 ?

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    C'est pour ca que je comprend pas le Si NbLignesVides = 7...
    Explication : Dans ton tableau, tu as une ligne qui peut être totalement vide (pas de libellé) alors que les autres auront un libellé. Je l'exclus donc du compte des lignes vides pour savoir si ton tableau est vide.
    Mais c'est peut-être une erreur si tu peux avoir des données seulement sur cette ligne mais pas sur les autres lignes du même tableau (possibilité que j'ai écartée)
    Comme je l'exclus, je ne la compte pas
    Au premier tableau vide trouvé, il suffira de masquer tous les tableaux suivants. Donc, de masquer de la 1e ligne tu premier tableau vide, jusqu'à la dernière ligne de la colonne. Ca simplifie le travail, non ?
    En effet, quoique nous, pour ce qui est du travail, si la macro le fait à notre place...
    Dans ce cas là, tu peux modifier ton code en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
              If LigneVide = 7 then 'tu supprimes l'underscore et tu corriges la suite
                     range("A" & i & ":A" & DerniereLigne ).entireRow.hidden = True
                     exit for
              Endif
    A+

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    C'est plus facile comme ca je trouve... Et ca simplifie aussi le programme, qui aurait vérifié les tableaux un à un pour rien...

    Sinon, que pensez vous de ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Activate()
    Rows("22:29").Select
        If Cells(23, 2) = "" Then
            Selection.EntireRow.Hidden = True
        Else
            Selection.EntireRow.Hidden = False
        End If
     
    '[.......]
    'Répéter l'opération pour chaque tableau
    Il y avait ce petit bout de code inscris dans le code de la feuille qui contient les tableaux, sans doute commencé par mon prédécésseur... C'est tellement plus simple que tout ce que j'ai imaginé !

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ah ! Alors oui, forcément... c'est plus simple
    Nous on savait pas que si la colonne B est vide ça veut dire que les colonnes suivantes le sont forcément... alors forcément...
    D'où l'intérêt de donner le maximum de précision dans ses questions
    Bonne chance pour la suite, je ne répondrai plus à tes questions

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Non non, si la colonne B est vide, les autres colonnes ne le sont pas ! Justement, non ce script là vérifie en faite que si la valeur du LHV est vide (en 23:2 = B23), alors les lignes de B22 à B29 sont masquées...

    C'est un peu l'équivalent de mon Range(B23 - 1:B23 + 7) sauf que j'utilisais un While...

    Enfin bref, merci pour votre aide quand même Ce fut très enrichissant

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

Discussions similaires

  1. Aide comment Masquer une ligne automatiquement
    Par patatelea dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/01/2010, 22h32
  2. trouver une ligne totalement vide , gestion d'erreur
    Par n'anneso dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/02/2008, 22h32
  3. Réponses: 1
    Dernier message: 21/11/2007, 16h23
  4. [VBA-E]Comment mettre une ligne entière d'un fichier excel en gras ?
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/05/2006, 09h23
  5. Réponses: 3
    Dernier message: 21/01/2004, 09h47

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