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 :

Conserver la hauteur de lignes variables lors d'un tri [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut Conserver la hauteur de lignes variables lors d'un tri
    Bonjour,

    je veux trier des lignes dont la hauteur est ajustée à la saisie par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim actRow As Integer
    actRow = Target.Row
     
    ActiveSheet.Rows(actRow).AutoFit
    ActiveSheet.Rows(actRow).RowHeight = 5 + ActiveSheet.Rows(actRow).RowHeight
     
    End Sub
    mon tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    With Cells(Rows.Count, "C").End(xlUp).MergeArea: derLigbook = .Cells(.Cells.Count).Row: End With
    Range("C3:J" & derLigbook).Sort key1:=Range("C3:C" & derLigbook), order1:=xlAscending, Header:=xlNo
    à la sortie du tri, j'ai perdu les hauteurs de lignes ajustées.

    Surement un paramètre à ajouter mais lequel ?

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Si personne ne sort du chapeau une méthode que j'ignore, tu as toujours la ressource d'ajouter avant le tri une colonne (que tu peux masquer) contenant la hauteur de chacune des lignes, puis de te servir de ces valeurs pour redimensionner en boucle tes lignes.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Oui merci, c'est une bonne idée par défaut

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonsoir,

    Exemple de tri qui conserve les hauteurs de ligne et la mise en forme


    Boisgontier
    Fichiers attachés Fichiers attachés

  5. #5
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Post #2

    comme j'ai après le tri une boucle de traitement ton post m'a donné l'idée pour chaque ligne de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A" & i) = Range("A" & i)
    cela déclenche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim actRow As Integer
    actRow = Target.Row
     
    ActiveSheet.Rows(actRow).AutoFit
    ActiveSheet.Rows(actRow).RowHeight = 5 + ActiveSheet.Rows(actRow).RowHeight
     
    End Sub
    et ma hauteur de ligne est remise, mais c'est long... toutes les lignes y passent...

    Par contre seule la colonne "A" est susceptible d'avoir une hauteur de ligne ajustable.

    une astuce ?

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Par contre c'est long... toutes les lignes y passent...
    Une boucle sur toutes les lignes demeure dans ce cas indispensable
    Cf mon message antérieur :
    puis de te servir de ces valeurs pour redimensionner en boucle tes lignes.
    Je ne vois personnellement pas comment l'éviter

    EDIT : les choses ne pourraient revêtir un aspect différent que si (et il st peu vraisemblable que tel soit le cas), à la fois :
    - les lignes de hauteur différentes pouvaient être répétitives et identifiées (pour chaque "cas") par un "flag"
    - le nombre de ces "cas" différents (et donc des flags ddistincts) n'était pas pléthorique
    - tu assortissais, au moment de leur création, chacune de ces lignes du "flag" correspondant

    Un traitement par groupes de même "flag" serait alors envisageable. Le jeu en vaut-il vraiment la chandelle (je ne le crois pas. On ne trie pas tous les jours et la durée du traitement n'est donc pas si pénalisante qu'elle justifierait tout ce travail...) ?

    Je ne comprends pas cette phrase -->>
    Par contre seule la colonne "A" est susceptible d'avoir une hauteur de ligne ajustable.
    Une ligne étant une ligne, c'est toute la ligne, qui est impactée, et pas seulement les cellules de cette ligne en colonne A

    (j'espère que tu n'as pas fusionné des cellules...)

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Tri()
       Set debut = Range("A1")         '  à adapter
       debut.CurrentRegion.Sort Key1:=debut.Offset(1, 0), Order1:=xlAscending, Header:=xlYes
       debut.CurrentRegion.EntireRow.AutoFit
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  8. #8
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    #2

    j'ai peut être une idée mixte, peu de lignes en fait ont une hauteur a réajuster, aussi je peux comme tu le suggères stocker dans une colonne la hauteur de la ligne avant le tri et ne réajuster après le tri que les lignes dont la hauteur est > à la valeur normale initiale

    #7
    je vais regarder cette solution sans trop la comprendre, comment indique-t-on que le tri doit s’arrêter à la ligne L (tri de la ligne 2 à L)

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    comment indique-t-on que le tri doit s’arrêter à la ligne L (tri de la ligne 2 à L)
    Ben -->> en n'appliquant le tri qu'à la plage concernée ...

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour boisgontierjacques

    Autofit adaptera la taille de la police de caractères -->> risque d'être très petite et presque illisible si texte long

    On pourrait penser au retour à la ligne automatique, mais on ne sait pas comment les textes sont construits -->> risques de pataquès de présentation si paragraphes, etc ...

    Si peu de lignes sont concernées, il suffit :
    - d'ajouter une colonne (au besoin masquée)
    - d'y mettre la hauteur voulue pour ces seules lignes à hauteur spéciale
    - de donner à toutes les lignes la hauteur des lignes "normales"
    - de ne traiter ensuite (restitution de la hauteur "spéciale") que les lignes contenant une valeur dans cette colonne --->> lignes d'un objet range obtenu par specialcells(xlCellTypeConstants) sur la colonne ajoutée

    Cela me parait à priori la solution la plus simple dans ce cas.


    EDIT : il est au besoin facile de faire une petite moulinette pour compléter, uniquement là où nécessaire (lignes "spéciales") les cellules de la colonne ajoutée. Uniquement pour "rattraper" les saisies déjà présentes sans ces flags, les nouvelles saisies étant à compléter soit manuellement, soit par un tout petit bout de code au worksheet_change
    Il suffit :
    - de déclarer une constante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const toto as single = ###  ' où ### est à remplacer par la hauteur "normale"
    - d'une boucle des lignes --->> ne remplir en colonne ajoutée que si la hauteur est différente de toto

  11. #11
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    #7

    je veux trier de B3 à J & derLigbook sur la colonne C en ajustant la hauteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    debut as variant
    With Cells(Rows.Count, "C").End(xlUp).MergeArea: derLigbook = .Cells(.Cells.Count).Row: End With
       Set debut = Range("B3") 
       debut.CurrentRegion.Sort Key1:=debut.Offset(1, 0), Order1:=xlAscending, Header:=xlNo
       debut.CurrentRegion.EntireRow.AutoFit
    End Sub
    je ne saisi pas :
    1) comment limiter à J & derLigbook (inutile ?)
    2) ce que signifie debut.Offset(1, 0) --> la position de la clé par rapport à la colonne B ? 2 dans mon cas

    mon fichier est cassé à la sortie du tri

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Relis ma remarque plus haut au sujet de Autofit

    Pour ce qui est du code à appliquer pour le tri -->> sers-toi donc de l'enregistreur de macros ... -->> tu n'auras plus qu'à :
    - nettoyer au besoin du superflu le code obtenu
    - modifier selection par la plage concernée
    Cela est vraiment simple.

  13. #13
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Le post #4 reprend la hauteur actuelle des lignes:

    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 Tri2()
     Set debut = Range("A1")            '  à adapter
     n = debut.CurrentRegion.Rows.Count
     nf = ActiveSheet.Name
     Sheets(nf).Copy After:=Sheets(1)   ' copie dans une feuille temporaire
     nf2 = ActiveSheet.Name
     Sheets(nf).Select
     nbcol = debut.CurrentRegion.Columns.Count
     debut.Offset(0, nbcol).EntireColumn.Insert Shift:=xlToRight
     debut.Offset(1, nbcol) = 1
     debut.Offset(1, nbcol).DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
            Step:=1, Stop:=n - 1, Trend:=False
     debut.Resize(n, nbcol + 1).Sort Key1:=debut.Offset(1, 0), Order1:=xlAscending, Header:=xlGuess
     For i = 1 To n - 1
       NoLigne = debut.Offset(i, nbcol) + 1
       Rows(i + 1).RowHeight = Sheets(nf2).Rows(NoLigne).RowHeight
     Next i
     debut.Offset(0, nbcol).EntireColumn.Delete
     Application.DisplayAlerts = False
     Sheets(nf2).Delete
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  14. #14
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    #7

    voilà le meilleur résultat après de multiples essais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub tri()
    Dim derLigbook As Long, debut As Variant
     
       Set debut = Range("B3")
       debut.CurrentRegion.Sort Key1:=debut.Offset(2, 1), Order1:=xlAscending, Header:=xlNo
       debut.CurrentRegion.EntireRow.AutoFit
     
     
    End Sub
    le tri se fait bien sur la colonne C en conservant la hauteur des lignes mais mes 2 lignes d'en-tête sont triés aussi, je n'arrive pas à les "oublier" dans le tri

    il me semble d'après ce que je comprends de la doc Offset que
    debut.Offset(2, 1),
    décale de 2 lignes et d'une colonne par rapport à la cellule A1 de la feuille donc je devrai ne pas prendre les lignes 1 et 2 dans le tri

    Que n'ai-je pas saisi?

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Poster un échantillon du fichier.
    -Un entête de BD, ça fait une ligne
    -Il me semble que j'avais mis Header:=XlYes

    Boisgontier

  16. #16
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonjour

    Citation Envoyé par retraite83 Voir le message
    #7
    Que n'ai-je pas saisi?
    Header := xlNo à remplacer par Header := xlYes ‘pour tenir compte des entêtes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub tri()
       Dim debut As Range
       Set debut = Range("B3")
       debut.CurrentRegion.Sort debut(2, 2), , Header:=1 '1 pour xlYes
       debut.CurrentRegion.EntireRow.AutoFit
    End Sub

  17. #17
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    #15

    oui avec XlYes c'est bon, mais du coup je ne comprends plus la fonction d'Offset, mais ça je vais regarder de près

    je voudrai en profiter pour faire aussi l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Rows(actRow).RowHeight = 5 + ActiveSheet.Rows(actRow).RowHeigh
    mais pour la CurrentRegion en une seule fois sans boucler sur toutes les lignes

  18. #18
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    On peut mettre toutes les lignes à la même hauteur sans boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       debut.CurrentRegion.EntireRow.RowHeight = 20
    Boisgontier

  19. #19
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    non, pas à la même hauteur, à la hauteur ajustée + 5 pour la clarté

  20. #20
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    AutoFit +5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Tri()
       Set debut = Range("A1")         '  à adapter
       debut.CurrentRegion.Sort Key1:=debut.Offset(1, 0), Order1:=xlAscending, Header:=xlYes
       debut.CurrentRegion.EntireRow.AutoFit
       Application.ScreenUpdating = False
       For ligne = 2 To debut.CurrentRegion.Rows.Count
         Rows(ligne).RowHeight = Rows(ligne).RowHeight + 5
       Next ligne
    Boisgontier
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Lazarus] DBGrid : hauteur de ligne variable
    Par Benzouye dans le forum Lazarus
    Réponses: 3
    Dernier message: 27/05/2016, 16h46
  2. [AC-2003] Hauteur de ligne variable dans un état
    Par dvdbly dans le forum IHM
    Réponses: 1
    Dernier message: 26/08/2013, 12h20
  3. Réponses: 2
    Dernier message: 04/02/2009, 20h50
  4. [FPDF] [phpToPDF] Tableau avec \n et hauteur de ligne variable
    Par doudoustephane dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 08/01/2009, 12h25
  5. TStringGrid : ignorer les lignes vides lors d'un tri
    Par ddubois dans le forum Composants VCL
    Réponses: 8
    Dernier message: 14/05/2008, 13h56

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