Redimensionnement automatique colonnes/lignes pour msflexgrid

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 169 fois - Téléchargée 30 fois

Contenu du snippet

Un simple module qui permet en un seul appel de redimensionner les colonnes et/ou les lignes d'un MsFlexGrid

Aucun autre controle n'est necessaire.

Copier ce code dans un module.

Pour redimensionner toutes les colonnes (TailleAuto MSFlexGrid1, True, False)

Pour redimensionner toutes les lignes (TailleAuto MSFlexGrid1, False,True)

Pour redimensionner toutes les colonnes et les lignes (TailleAuto MSFlexGrid1, True, True)

Bonus (VideFlex MSFlexGrid1) vide le MsFlexGrid.

Source / Exemple :


Option Explicit
' Taille automatique les largeurs des colonnes  et hauteur de lignes d'un MsFlexGrid
Public Sub TailleAuto(Msflex As MSFlexGrid, PourColonne As Boolean, PourLigne As Boolean)
    Dim Colonne As Long 'N° de colonne
    Dim Ligne As Long 'N de Ligne
    Dim EnteteColonne() As String 'Tableau de stockage des entetes de colonne
    Dim ColonneAlign() As String 'Tableau de stockage du type d'alignement des colonne
    Dim LongTexte() As String 'Tableau de stockage des ligne les plus longue
    Dim TexteFormat As String 'Chaine du FormatString
    Dim Texte As String 'Texte de la cellule en cours
    Dim TexteMultiLigne() As String 'Tableau de stockage des ligne les plus longue en cas de cellule multi-ligne
    Dim NbLigne 'Nombre de ligne dans une cellule multi-ligne
    Dim PosCar As Integer 'Position d'un caractere dans une chaine
    Dim i As Integer 'Juste pour les boucles
    Dim Rafraichissement As Boolean 'Stock le type de rafraichissement
    
    With Msflex 'pour le MsflexGrid
        Rafraichissement = .Redraw
        .Redraw = False
        If PourColonne Then 'si traitement des colonnes
            ReDim EnteteColonne(.Cols) '\
            ReDim ColonneAlign(.Cols)  ' - Redimensionnement des tableaux
            ReDim LongTexte(.Cols)     '/
            
            'Recupere les entetes des colonnes ainsi que leur alignements
            If Msflex.FixedRows <> 0 Then 'Si la premiere ligne est fixe
                For Colonne = 0 To .Cols - 1 'Pour toutes les colonnes
                    ColonneAlign(Colonne) = ""
                    Select Case .ColAlignment(Colonne) 'Analyse de l'alignement
                        Case flexAlignCenterBottom, flexAlignCenterCenter, flexAlignCenterTop
                            ColonneAlign(Colonne) = "^" 'Alignement Centre
                        Case flexAlignLeftBottom, flexAlignLeftCenter, flexAlignLeftTop
                            ColonneAlign(Colonne) = "<" 'Alignement a Gauche
                        Case flexAlignRightBottom, flexAlignRightCenter, flexAlignRightTop
                            ColonneAlign(Colonne) = ">" ''Alignement a Droite
                    End Select
                    EnteteColonne(Colonne) = .TextMatrix(0, Colonne) 'Stock l'entete de colonne
                Next Colonne
            End If
            
            For Colonne = 0 To .Cols - 1 'Pour toutes les colonnes
                LongTexte(Colonne) = ""
                For Ligne = 0 To .Rows - 1 'Pour toutes les lignes
                    Texte = .TextMatrix(Ligne, Colonne) 'recuperation du texte de la cellule en cours
                    If InStr(1, Texte, vbCrLf) <> 0 Then 'detection des texte multi-ligne
                        NbLigne = 1
                        PosCar = 1 'position d'un saut de ligne
                        While InStr(PosCar, Texte, vbCrLf) <> 0 'pour tout les saut de ligne
                            If InStr(PosCar, Texte, vbCrLf) <> 0 Then
                                NbLigne = NbLigne + 1 'incrementation du nombre de ligne
                                PosCar = InStr(PosCar, Texte, vbCrLf) + 1 'saut de ligne suivant
                            End If
                        Wend
                        ReDim TexteMultiLigne(NbLigne) 'Redimensionnement et vidage du tableau
                        TexteMultiLigne() = Split(Texte, vbCrLf) 'stockage des lignes dans le tableau
                        Texte = TexteMultiLigne(0) 'texte le plus long en dans le tableau a l'index 0
                        For i = 1 To NbLigne - 1 'pour tout le tableau
                            If Len(Texte) < Len(TexteMultiLigne(i)) Then Texte = TexteMultiLigne(i) 'si le texte de l'index du tableau et plus long
                        Next i
                    End If
                    If Len(Texte) > Len(LongTexte(Colonne)) Then LongTexte(Colonne) = Texte 'stockage du texte dans le tableau des texte les plus long
                Next Ligne
            Next Colonne
            
            
            'Création de la chaine FormatString
            TexteFormat = ""
            For Colonne = 0 To .Cols - 2
                TexteFormat = TexteFormat & ColonneAlign(Colonne) & LongTexte(Colonne) & "|"
            Next Colonne
            TexteFormat = TexteFormat & ColonneAlign(.Cols - 1) & LongTexte(.Cols - 1)
            
            
            .FormatString = TexteFormat 'Toutes les colonne se redimensionne en fonction du texte le plus long
            
            'Replace les entete des colonnes
            If Msflex.FixedRows <> 0 Then 'Si la premiere ligne est fixe
                For Colonne = 0 To .Cols - 1 'Pour toutes les colonnes
                    .TextMatrix(0, Colonne) = EnteteColonne(Colonne) 'Replace les entete des colonnes
                Next Colonne
            End If
        End If
        If PourLigne Then 'Traitement des lignes
            For Ligne = 0 To .Rows - 1 'Pour toutes les lignes
                For Colonne = 0 To .Cols - 1 'Pour toutes les colonnes
                    Texte = .TextMatrix(Ligne, Colonne) 'recuperation du texte de la cellule en cours
                    NbLigne = 1
                    PosCar = 1 'position d'un saut de ligne
                    While InStr(PosCar, Texte, vbCrLf) <> 0 'pour tout les saut de ligne
                        If InStr(PosCar, Texte, vbCrLf) <> 0 Then
                            NbLigne = NbLigne + 1 'incrementation du nombre de ligne
                            PosCar = InStr(PosCar, Texte, vbCrLf) + 1 'saut de ligne suivant
                        End If
                    Wend
                    If NbLigne > 1 Then 'Si plusieurs lignes
                        If (.RowHeight(Ligne) * NbLigne) > .RowHeight(Ligne) Then .RowHeight(Ligne) = .RowHeight(Ligne) * NbLigne
                    End If
                Next Colonne
            Next Ligne
        End If
        .Redraw = Rafraichissement
    End With
End Sub
' Vider un MsFlexGrid
Public Sub VideFlex(Msflex As MSFlexGrid)
    Msflex.Rows = 2
    Msflex.Clear
End Sub

Conclusion :


Merci pour les critiques ou les félicitations,
meme si elles ne font pas plaisir,
elle sont toujour constructive.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
1
merci et bravo
10/10
Messages postés
4
Date d'inscription
vendredi 23 juillet 2010
Statut
Membre
Dernière intervention
30 juillet 2010

Bonjour, aider moi dans ce cas vu ke vous avez reussi a executer ce code.
moi j'arrive pas a adapté ce code au mien ...
jai 10 cols dans mon tableau...
Nom de la grille : MSFlexgrid
Merci de m'aider....
Messages postés
140
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
8 décembre 2008

Je trouve que c'est bizard de noter ce code 9/10 alors qu'il merite simplement 10/10


bravo steph62 et bon courage
ton code m'a beaucoup aidé.
Messages postés
5
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 octobre 2007

Très bon source, c'est exactement ce dont j'avais besoin. Cependant je pense avoir trouvé un petit bug lors du redimensionnement de la hauteur d'une ligne. Celui-ci est fait pour chaque colonne parcourue, ce qui engendre un redimensionnement dès qu'une cellule du datagrid àa plus d'une ligne.

Un exemple :

hauteur de la ligne au départ : 200
1ère cellule : 1 ligne -> hauteur = 200
2ème cellule : 2 lignes -> hauteur 200 *2 400
3ème cellule : 1 ligne -> hauteur = 400
4ème cellule : 2 lignes -> hauteur 400 *2 800

Au final on se retrouve avec une hauteur correspondant à 4 lignes alors que le nombre de lignes maxi est de 2.
Je pense qu'il faut donc gérer une variable correspondant au nombre maxi de lignes dans les cellules et faire le redimensionnement quand tu as parcouru toutes les colonnes.

J'espère que j'ai été clair... En tout cas je te mets 9/10 pour ton source.
Messages postés
2
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
24 octobre 2006

Encore plus simple et logique au lieu de parcourrir les lignes, il suffit de faire une requete avec un recordset où l'ont cherche le max du nombre de caractère max(len(CHAMPS)) et hop ! le tour est joué vous avez le nombre de caractère max sur chaque colonne et plus qu'une ligne à tester.
Afficher les 27 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.