Compteur de ligne conditionnel à aff/masquer

Bonjour,

Voila j'ai un chiffrier excel avec une macro effectuant un filtre élaborer maintenant je cherche à standardiser la hauteur de mes lignes
allons-y avec un exemple pour simplifier l'explication donc,
disons que de la ligne 2 a 8 je veux toujours que ce ''range'' soit de hauteur 200 mais parfois après l'exécution de ma macro filtre il se peut que certaines de ces lignes soit masquer donc si la ligne 4 et 5 sont masquer la hauteur de 200 doit se distribuer sur les cellules restantes (dans l'exemple cellules 2,3,6,7,8) etc. Mes pistes de solution sont élaborer une macro qui compte les lignes NON MASQUER dans le range (2:8) et qui stock la valeur dans une variable et de là diviser ma hauteur voulu par cette variable exemple il compte 3 ligne non masquer dans chaque ligne non masquer rowheight = 200/3 et ainsi de suite....

11 réponses

  1. Contributeur
    Bonjour,
    Sais pas si j'ai bien compris...
    Function NbVisible() As Long
    Dim Lig As Long
        For Lig = 1 To Range("A65335").End(xlUp).Row
            If Not Rows(Lig).Hidden Then NbVisible = NbVisible + 1
        Next Lig
    End Function

    Compte le nombre de ligne(s) visible(s).
    A+
    0
    1. oui, ca semble etre bon mais il manquerait une ligne de code pour faire en sorte que les lignes se dimensionne en hauteur par rapport a nbvisible

      de sorte que les lignes comprisent dans mon range prennent chancune une hauteur prédéterminé à l'aide de nbvisible

      ex:

      Function NbVisible() As Long
      Dim Lig As Long
      For Lig = 1 To Range("tableau").Row
      If Not Rows(Lig).Hidden Then NbVisible = NbVisible + 1

      Next Lig
      End Function

      voici j'ai modifier ton code pour range("tableau") et maintenant je veux que toute les lignes visibles du range tableau prenne la dimension 200/nbvisible

      je sais pas si je suis assez clair

      merci
      0
      1. Contributeur
        avec..
        Dim A, B  
            A = Range("tableau").Row  
            B = Range("tableau").Rows.Count  
            Rows(A & ":" & A + B - 1).RowHeight = 200 / NbVisible  

        A+
        L'expérience instruit plus sûrement que le conseil. (André Gide)
        Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
        0
        1. ca ne marche malheureusement pas je crois que le problème se situe au niveau de la ligne : Rows(A & ":" & A + B - 1).RowHeight = 200 / NbVisible
          car si je masque la ligne 1 (range tableau = ligne 1 à 4 ) il bug et si je masque une des autres ligne 2,3 ou 4 il fait reapparaitre les lignes et les dimensionnent ce que je veux c'est :
          si il n'y a pas de ligne masquer, chacune des lignes 1,2,3 et 4 seront de 50...
          si il y a une ligne de masquer, les trois autres seront de 66.67
          si il y a 2 ligne de masquer, les 2 restant seront de 100 chacun
          si il y a 3 lignes de masquer , la ligne restant sera de 200

          je crois que nous approchont de la solution

          merci de tes réponses si rapide...tu est plutot doué pas comme moi :(
          0
          1. Contributeur
            1°) Juste, ça réaffiche les lignes
            2°) mais ta ligne..
                For Lig = 1 To Range("tableau").Row 

            n'est pas bonne, faut faire...
                 For Lig = Range("tableau").Row to  Range("tableau").Row.count +Range("tableau").Row -1

            3°) Je prépare la suite

            L'expérience instruit plus sûrement que le conseil. (André Gide)
            Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
            0
            1. Contributeur
              Voila une fonction qui... fonctionne :-)
              Function NbVisible() As Long 
              Dim Lig As Long, LigDeb As Long, LigFin As Long, HT As Single 
                  LigDeb = Range("tableau").Row 
                  LigFin = Range("tableau").Row + Range("tableau").Rows.Count - 1 
                  For Lig = LigDeb To LigFin 
                      If Not Rows(Lig).Hidden Then NbVisible = NbVisible + 1 
                  Next Lig 
                  HT = 200 / NbVisible 
                  For Lig = LigDeb To LigFin 
                      If Not Rows(Lig).Hidden Then Rows(Lig).RowHeight = HT 
                  Next Lig 
              End Function

              A+
              L'expérience instruit plus sûrement que le conseil. (André Gide)
              Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
              0
              1. ouais ca marche disons que maintenant j'ai plusieur plages nommé
                tableau1
                tableau2
                tableau3
                est ce que je peut alligner ces lignes de code autant de fois que j'ai de plages nommées ?? et pour l'instant il est sous forme de fonction comment puis-je l'associé à un bouton le même que pour mon filtre ( il serait dans la meme macro après le filtre de manière a ce que les lignes s'ajuste avant de voir le résultat de la recherche. Ou p-t mettre se code dans une macro evenementielle qui au déclenchement de mon bouton "recherche" les lignes s'ajuste

                Dernier petit bug... si toute les lignes sont masquer il me sort une erreur car division par zéro comment contourné se problème...?

                pour le reste c'est nickel ! merci bcp !!
                0
                1. Contributeur
                  J'espère que c'est la dernière modif, j'en ai Ma.. de chaques fois recommencer.
                  Remplace la macro par...
                  Public Sub NbVisible(Table As Range) 
                  Dim Lig As Long, LigDeb As Long, LigFin As Long, HT As Single, VU As Integer 
                      LigDeb = Table.Row 
                      LigFin = Table.Row + Table.Rows.Count - 1 
                      For Lig = LigDeb To LigFin 
                          If Not Rows(Lig).Hidden Then VU = VU + 1 
                      Next Lig 
                      If VU > 0 Then 
                          HT = 200 / VU 
                          For Lig = LigDeb To LigFin 
                              If Not Rows(Lig).Hidden Then Rows(Lig).RowHeight = HT 
                          Next Lig 
                      End If 
                  End Sub

                  et dans le code du bouton..
                  Private Sub CommandButton1_Click() 
                      Application.ScreenUpdating = False
                      TaMacroFiltre
                      NbVisible Range("Tableau1")
                      NbVisible Range("Tableau2")
                      '......
                      Application.ScreenUpdating = True
                  End Sub

                  Vaut mieux laisser les macros séparées.
                  A+
                  L'expérience instruit plus sûrement que le conseil. (André Gide)
                  Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
                  0
                  1. Contributeur
                    Si tu a beaucoup de tableaux...
                    Remplace le code du bouton par..
                    Private Sub CommandButton1_Click()
                    Dim i As Integer
                        Application.ScreenUpdating = False
                        TaMacroFiltre
                        With ActiveWorkbook
                        For i = 1 To .Names.Count
                            If Left(.Names(i).Name, 5) = "Table" Then NbVisible Range(.Names(i).Name)
                        Next i
                        End With
                        Application.ScreenUpdating = True
                    End Sub

                    A+
                    0
                    1. voila merci beaucoup tous fonctionne il y a une dernière chose mais c'est parce que je suis trop perfectionniste ca va aller comme ca encore une fois merci de ta patience et de partager ton savoir en prog.
                      Par contre si tu dit que tu en a ta .... pk vient tu aidé les gens sur ce forum ?
                      Pour ma part je trouve ca admirable de donner son temps comme ca a des inconnus ...

                      Merci
                      Au Plaisir !!
                      0
                      1. Contributeur
                        Sic : Par contre si tu dit que tu en a ta .... pk vient tu aidé les gens sur ce forum ?
                        Je n'en ai pas marre d'aider les gens comme tu dis, ce qui est énervant c'est qu'à chaque fois tu change la situation ce qui oblige à refaire une autre macro et ce, toujours pour le même problème, mal expliquer au départ...
                        Voilà.
                        A+
                        0