Macro excel masquer des lignes

Bonjour,
Je voudrais masquer les lignes consécutives de la cellule sélectionnée, tant que la cellule au-dessous(de celle sélectionnée), est vide.
J'essaie comme suit, ça ne marche pas, merci de voler à mon secours

Sub masquerlignes()
l = ActiveCell.Row
c = ActiveCell.Column
While Cells(l + i, c) = ""
Cells(l + i, c).Select
Selection.EntireRow.Hidden = True
Wend
End Sub
Sub masquerlignes2()
l = ActiveCell.Row
c = ActiveCell.Column
For i = 1 To 50
If Cells(l + i, c) = "" Then
Cells(l + i, c).Select
Selection.EntireRow.Hidden = True
End If
Next i
End Sub.
Configuration: Windows XP Internet Explorer 6.0

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    bonjour

    incrémente i avant wend
    i=i+1
    wend


    mais ca peut se faire sans boucle...

    lig = ActiveCell.Row
    col = ActiveCell.Column
    lig_fin = Columns(col).Find("*", Cells(lig, col), xlValues).Row
    If lig_fin > lig + 1 Then
    Rows(lig + 1 & ":" & lig_fin - 1).Delete
    End If
    1. Merci, en incrémentant, évidemment ça marche.
      J'essaie la 2e solution, ça ne masque pas, ça efface les lignes. Je suppose qu'il me faut remplacer Delete par un autre mot, mais lequel...?
      Autre chose, je ne comprends pas les lignes 3 et 5. J'ai cherché Find dans fonctions, sans succès. Merci de m'éclairer si c'est possible.
  2. Contributeur
    Bonjour,
    Oui excuses moi
    Rows(lig + 1 & ":" & lig_fin - 1).hidden=true

    Pour Find, il faut que tu cherches dans l'aide de VBA (pour aller dans VBA:Alt+F11) et non d'XL. Pour piger, étudies bien l'exemple fourni par MS

    Lig_fin est le numéro de la première cellule non vide ("*") sous la cellule sélectionnée (...cells(lig,col)...)
    xlvalues demande à prendre la valeur dans la cellule( au cas où les cellules comporterait une formule avec comme résultat: "")
    on cache depuis la ligne du dessous: lig+1
    jusqu'à la ligne au dessus de lig_fin: lig_fin-1
    1. Bonjour et merci,
      J'ai encore 2 questions...
      D'abord, je ne comprends pas "l'exemple fourni par MS"

      Ensuite, pourquoi la macro5 foctionne, et pas la 7?

      Sub Macro5()
      Rows(4 & ":" & 14).Hidden = True
      End Sub

      Sub Macro7()
      Columns(4 & ":" & 14).Hidden = True
      End Sub
  3. Contributeur
    Bonjour

    Macro7 ne fonctionne: c'est vrai, big surprise d'autant plus que je suis en référence L1C1 et que
    Columns("E" & ":" & "H").Hidden = True

    fonctionne... donc, mystère et boule de gomme

    l'exemple de la fonction Find de l'aide Microsoft (MS) est celui-ci
    With Worksheets(1).Range("a1:a500")
        Set c = .Find(2, lookin:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Value = 5
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With


    question à 1 euro: pourquoi cette variable firstaddress ?
    piger cela te sera utile dans tes macros comme ca l'a été, non sans mal, pour moi :-)

    1. Bonsoir Michel,

      J'aimerais comprendre pourquoi la macro suivante, que tu m'as indiquée, ne fonctionne pas.

      Sub Macro1()
      With Worksheets(1).Range("a1:a50")
      Set c = .Find(2, LookIn:=xlValues)
      If Not c Is Nothing Then
      firstAddress = c.Address
      Do
      c.Value = 5
      Set c = .FindNext(c)
      Loop While Not c Is Nothing And c.Address <> firstAddress
      End If
      End With
      End sub

      Le débogueur me répond erreur d'exécution 91... Variable objet ou variable de bloc with non définie.
      Merci de ton aide.
    2. Contributeur
      @CORNEMUSEBonjour,

      Curieux, c'est pourtant un copier-coller de l'aide microsoft et je l'avais déjà étudié pour apprendre mais peut-^tre pas jusqu'au bout !!!...

      ce qui se passe: lorsque tous les 2 ont été remplacés par des 5, c.address ="rien"(nothing) et donc n'existe pas d'où erreur
      Enfin, tel que je crois comprendre

      voici ce que j'ai fait pour éviter le plantage
      Sub cherche()
      With Worksheets(1).Range("a1:a50")
          Set c = .Find(2, LookIn:=xlValues)
          If Not c Is Nothing Then
              firstAddress = c.Address
              Do
                  c.Value = 5
                  Set c = .FindNext(c)
                  If c Is Nothing Then: Exit Do
              Loop While c.Address <> firstAddress
          End If
      End With
      
      End Sub


      Mais si quelqu'un sur le forum connait le pourquoi du comment, je suis preneur!

      Bonne soirée
    3. Contributeur
      @michel_mSalut michel et cornemuse,

      Je suis presque d'accord avec toi michel, plus précisément je dirais que si c=nothing alors c.address ne veut plus rien dire.
      D'ailleurs à quoi sert ce test c.Address <> firstAddress ?
      A rien j'ai l'impression, puisque s'il ne trouve plus rien on aura .FindNext(c)=nothing et c'est justement la première condition de sortie de boucle.
      J'ai testé :
      Sub Macro1()
          With Worksheets(1).Range("a1:a50")
              Set c = .Find(2, LookIn:=xlValues)
              If Not c Is Nothing Then
                  firstAddress = c.Address
                  Do
                      c.Value = 5
                      Set c = .FindNext(c)
                  Loop While Not c Is Nothing
              End If
          End With
      End Sub

      comme simplification et ça a l'air de bien tourner...

      eric
    4. Contributeur
      @eriiicBonjour Eric,

      j'arrivais à la formulation que toi en prenant ma douche (si,si, ca m'arrive)

      bizarre quand même pour un exemple donné par MS et qu'on retrouve souvent dans des codes...
  4. Contributeur
    Bonsoir tout le monde,

    En un peu plus court si j'ai bien compris la demande :
        If ActiveCell.Offset(1, 0) = "" Then
            Range(ActiveCell.Offset(1, 0), ActiveCell.End(xlDown).Offset(-1, 0)).EntireRow.Hidden = True
        End If


    eric
    1. Bonsoir Eric,
      J'ai essayé la macro:

      If ActiveCell.Offset(1, 0) = "" Then
      Range(ActiveCell.Offset(1, 0), ActiveCell.End(xlDown).Offset(-1, 0)).EntireRow.Hidden = True
      End If

      Elle ne correspond pas tout à fait à ce queje souhaite: elle affiche toutes les lignes de la feuille au-dessous de la cellule active, si ces lignes ont leur cellule de la même colonne que la cellule active, vide.
      Or la feuille contient plusieurs plages correspondant à ces critères, et je souhaite que la 1ère plage seulement soit concernée.
      Merci de ton aide.
  5. Contributeur
    Bonjour Eriiic,

    As tu une explication pour le coup de la macro7 ?
    j'y perd mon peu de patois VBA...
    donc, si tu connaissais le pourquoi du comment ?
    1. Contributeur
      Salut michel,

      Pour excel "1:4" ne peut représenter qu'une plage de lignes (malgré que l'ambiguïté pourrait être levée par l'utilisation de columns)
      On peut supposer que pour faciliter la saisie (4 & ":" & 14) soit converti en ("4:14") (conversion des nombres en strings), ce qui donne une syntaxe correcte pour rows mais pas pour columns.
      J'ai beau réfléchir, je ne vois pas comment désigner directement une plage de colonnes par leur numéro...
      Laissons mûrir, ça viendra peut-être :-)

      Bonne journée
      eric
      1. Salut à vous,
        Je n'ai pas eu le temps de travailler les dernières réponses(mes activtés de retraité, et la préparation des fêtes familiales, ça occupe), mais j'ai une autre question.
        Je bricole depuis une quinzaine d'années sur les macros d'Excel. Autodidacte, j'ai quand même rencontré des gens qui m'ont mis ou remis sur des rails (sinon je planterais des choux), mais je ne suis pas ouvert au(x) langage(s) qu'utilisent les habitués de l'informatique. Ce n'est pas pour raconter ma vie, mais pour situer...
        Les macros que je crée et utilise, sont écrites sur des modules Virtual Basic. Et j'ai découvert qu'il existe des macos écrites sur des feuilles excel, dans un langage qui m'est inconnu. Exemple:
        TRIER LES DONNEES
        =SELECTIONNER("L11C1:L199C20")
        =TRIER(1;"L11C1";1)
        =SELECTIONNER("L5C1")
        =RETOUR()
        Si quelqu'un peut m'aider, me traduire par exemple ce qui précède, me dire où m'adreser...
        Merci
    2. Salut,

      Sub Macro7()
      Columns(4 & ":" & 14).Hidden = True
      End Sub


      Essai

      Range(Columns(4),Columns(14)).Hidden = True
      1. Contributeur
        Bonsoir,

        Ce sont les premières macro (excel 4). Visual basic n'existait pas et les macros étaient saisies dans des feuilles.
        https://www.google.fr/search?hl=fr&client=firefox-a&rls=org.mozilla:fr:official&hs=SOu&ei=W5IyS8qcA8Pb4gasluiqCA&sa=X&oi=spell&resnum=0&ct=result&cd=1&ved=0CAYQBSgA&q=macro+excel+4&spell=1&gws_rd=ssl

        eric
        1. Salut Eric,
          C'est vrai qu'avec Excel 4, les macros étaient écrites sur des feuilles, en français, ce qui me facilitait la tâche, mais le langage était le même qu'aujourd'hui. C'est pourquoiu je ne comprends pas avec les L1C1...
      2. Contributeur
        Bonjour Eric,

        Merci du renseignement; je vais aller fouiner là dedans!
        coirdialement,
        Michel
        1. Contributeur
          Re,

          Il y avait et il y a encore 2 styles de références dans excel : A1 (que tu connais) et L1C1.
          Dans le style L1C1 tu désignes ligne et colonne de ta référence.
          Ex :
          =L5C1 : référence absolue ligne-colonne équivalente à =$A$5 ( (ligne 5 colonne 1)
          =L(-2)C(-1) : référence relative ligne-colonne, 2 lignes au dessus et 1 colonne à gauche. Si tu es en B6 équivalent à =A4

          Tu peux tester en allant dans les options, onglet 'général', cocher 'Style de référence L1C1'

          eric
          1. Contributeur
            Re,

            je répond ici au post 16 car ça devient le bazar ce fil ;-)

            J'ai essayé la macro:
            If ActiveCell.Offset(1, 0) = "" Then
            Range(ActiveCell.Offset(1, 0), ActiveCell.End(xlDown).Offset(-1, 0)).EntireRow.Hidden = True
            End If
            Elle ne correspond pas tout à fait à ce queje souhaite: elle affiche
            (je suppose qu'il faut lire 'masque') toutes les lignes de la feuille au-dessous de la cellule active, si ces lignes ont leur cellule de la même colonne que la cellule active, vide.
            C'est quoi la différence avec ta demande du post 1 ? qui est :
            Je voudrais masquer les lignes consécutives de la cellule sélectionnée, tant que la cellule au-dessous(de celle sélectionnée), est vide.

            Or la feuille contient plusieurs plages correspondant à ces critères, et je souhaite que la 1ère plage seulement soit concernée.
            Ben ça s'arrete à la 1ère cellule non vide..

            Qcq chose m'échappe mais quoi ? :-s
            1. Bonjour, je précise, et te présente mes excuses pour l'erreur suivante,

              J'ai effectivement remplacé True par False, pensant que ça serait sans conséquences...
              En fait, avec True, ça marche, mais pas avec False.

              Mon exemple, avec False:

              cellule B1 occupée
              B2 à B10, vides
              B11 et B12 occupées
              B13 à B17, vides
              B18, B19, B20, occupées
              B21 à B28, vides
              B29 et B30, occupées

              cellule active: B1. Je lance la macro, toutes les lignes sont affichées, alors que je ne souhaitais voir que les lignes 2 à 10.
              De même, je voudrais lancer à partir de B12 ou B20 et découvrir les lignes 13 à 17 ou de 21 à 28.

              Encore mes excuses et merci.