Compteur de ligne conditionnel à aff/masquer

la crotte de charles -  
lermite222 Messages postés 9042 Statut Contributeur -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. la crotte de charles
     
    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
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  4. la crotte de charles
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  8. la crotte de charles
     
    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
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  11. la crotte de charles
     
    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
  12. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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