Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

REDIMENSIONNEMENT AUTOMATIQUE COLONNES/LIGNES POUR MSFLEXGRID


Information sur la source

Catégorie :Control Niveau : Initié Date de création : 24/10/2003 Vu : 9 014

Note :
9,83 / 10 - par 6 personnes
9,83 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

Description

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

  • 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
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.
 

Commentaires et avis

signaler à un administrateur
Commentaire de JoePatent le 28/10/2003 21:00:11

Est-ce normal que j'obtienne un message d'erreur quand je tente de passer un msflexgrid ou un mshflexgrid en parametres ?

signaler à un administrateur
Commentaire de JoePatent le 28/10/2003 21:09:38

Oublie mon dernier commentaire.  Tout fonctionne tres bien !  Merci pour cette sources... tres tres utiles !

signaler à un administrateur
Commentaire de trabice le 26/11/2003 18:12:05

merci bcp pr ce petit code
fabrice
tres utile

signaler à un administrateur
Commentaire de Cobham le 12/01/2004 11:32:15

Merci pour ce code bien pratique et rapide d'exécution.

Grâce à toi, des africains (mes clients) pourront visionner les données
de manière optimale !!!

signaler à un administrateur
Commentaire de rodcobalt22 le 04/02/2004 10:19:12

je veux simplement dire une chose : " Géniaaaaaaalllllll" 9/10
Un truc qui pourrait être utile, est ce possible de redimensionner la fenêtre qui contient le msfgrid ????
Si tu sais le faire ou quelqu'un d'autre dailleur, ça serait intéressant de l'intégré dans le module.
sinon c'est une procédure fort utile. Bravo

signaler à un administrateur
Commentaire de rodcobalt22 le 06/02/2004 11:57:42

C'est re moi.
J'ai bien annalyser ton code, je veux t'avouer que j'ai pas tout compris.
Mais j'ai remarqué aussi quelque chose.
Cette procédure ne marche qu'une seule fois. en effet lorsque je renvoie un autre MSFlex ( diffèrent du premier ( MSF_Resultat))
La procédure ne le redimensionne pas ( MSF_Selection ).
de ce fait, j'ai fait "msflex.name" et c'est bien le bon controle qu'il a en paramètre.
Pourrais comprendre ce bug et y remédié.
ça serait cool.

signaler à un administrateur
Commentaire de maxdebide le 16/07/2004 16:14:30

Elle ne fait rien chez moi ,y a t-il qqchose à faire vis à vis du commentaire précédent ??

signaler à un administrateur
Commentaire de maxdebide le 16/07/2004 16:14:52

Elle ne fait rien chez moi ,y a t-il qqchose à faire vis à vis du commentaire précédent ??

signaler à un administrateur
Commentaire de rodcobalt22 le 19/07/2004 08:35:47

Est tu sur de passer un MSF ? La première, j'avais pas fait gaffe et je me servait d'un grid !
Après, ça dépend également des données que tu insère dans ton MSF : "Texte only ?!".
Sinon, peut être que ton appel n'est pas correct, vérifie l'état de ton paramètre. Normalement 1 seul controle fonctionne, le premier appelé par la procédure.
Conseil simple qui ne te seront peut être pas utile, mais bon ça peut toujors aider ! ;-)

signaler à un administrateur
Commentaire de ydx35 le 03/11/2004 14:21:46

Bnjr,

Interessant.....
Question (bete, peut-etre, mais, n'est-ce pas ?) :
  y-a-t-il dan sle meme genre un moyen de pré-formater
  la saisie et le format numérique (saisie par un KeyPressed...)

@+

signaler à un administrateur
Commentaire de 2clo le 23/05/2005 12:32:57

Tres bon ctl. je gere plusieurs listes et tous va bien.
Juste une remarque, on recupére la taille de la chaine la plus longue mais si la fonte n'est pas de taille fixe il y a souci.
Peux tu me dire comment recuperer la taille reelle (en pixel ...) d'une chaine de caratere et de sa fonte ce qui permettrai  de mettre la chaine la plus large et non pas la chaine la plus longue.
Merci pour ce code.

signaler à un administrateur
Commentaire de MrAlgo le 30/05/2005 17:19:05

Désolé de vous embeter avec mon problème masi moi je commence en vb, et j'avais ce problème pour redimensionner, ainsi comme l'inventeur de ce code la dit j'ai copié ce code dans un module mais cela ne fait rien..est ce que je dois rajouté un code dans le form_load du MsflexGrid??

Question stupide pour vous certes mais je ne connais pas trop encore ce qui est procédure et fonction..sorry

Merci pour vos réponses.

Amicalement Damien

signaler à un administrateur
Commentaire de pouda le 04/12/2005 00:54:18

tout simplement génial merci a toi...

signaler à un administrateur
Commentaire de foofur le 17/02/2006 15:53:05

Exactement ce dont j'avais besoin. Parfait. Merci

signaler à un administrateur
Commentaire de Huugooo le 14/03/2006 14:17:16

Cool ! C'est exactement ça que je cherchais, j'ai trouvé en 2mn

signaler à un administrateur
Commentaire de mophi le 18/04/2006 00:57:23

Pratique et efficace. Merci

signaler à un administrateur
Commentaire de Goldeneye007 le 07/05/2006 08:32:03

comment appeller ce module dans la datagrid car moi elle se redimensionne pas

signaler à un administrateur
Commentaire de thkiller le 15/06/2006 13:29:56

Bonjour comment je peut faire pour que ce code prenne en compte tout les case de de mon grid ?

signaler à un administrateur
Commentaire de Moumoud le 20/06/2006 00:00:02

Bonsoir Monsieur...
SVP comment utiliser ce module dans le code Form_load ???
j'attend votre réponse !!
merci

signaler à un administrateur
Commentaire de thkiller le 20/06/2006 00:23:38

Pour cela il te suffi de copier ce code dans ton source aprés le "Option explicit" mais pas dans le form_load
et ensuite dans ton form_load tu écrit le code suivant pour appeler la fonction que tu veint de définir en copiant dans ton source !!:

Call nom_de_la_fonction

Cela fonctionne avec n'importe quel fonction si je ne m'avance pas trops j'ais encore du mal avec les "Piblic" et les "Private" je me doute qu'il doit y avoir une autre methode mais bon....

Pour codé une focntion tu écrit : Public MaFonction -->return sans les "--".
Voila bon code..

signaler à un administrateur
Commentaire de whismeril le 23/06/2006 14:54:28

Juste un petit "bug" a signaler,
la fonction .FormatString interprete le ";" comme une commande d'entete de ligne.
Et forcément j'ai des données avec des ";" donc ça merdouille

pour y remedier j'ai remplacé la ligne 61
"If Len(Texte) > Len(LongTexte(Colonne)) Then LongTexte(Colonne) = Texte 'stockage du texte dans le tableau des texte les plus long "

Par
"If Len(Texte) > Len(LongTexte(Colonne)) Then
      TexteRemplacement = ""      
      For i = 1 to Len(Texte)
            TexteRemplcement =TexteRemplacement & "A"
      next
      LongTexte(Colonne) = TexteRemplacement
end if


Sinon merci ça m'a fait gagner beucoup de temps

signaler à un administrateur
Commentaire de Zylott le 06/07/2006 12:53:44

Bjr,

Pour info , il y a mieux :

Private Type Size
        cx As Long
        cy As Long
End Type

Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" _
                                              (ByVal hdc As Long, ByVal lpsz As String, _
                                              ByVal cbString As Long, lpSize As Size) As Long

Public Sub ResizeColumns(hdc As Long, flexgrid As MSFlexGrid)

    Dim idxRow As Long, idxCol As Long, lngMax As Long
    Dim texte As String, taille As Size

    With flexgrid
        'Parcoure les colonnes
        For idxCol = 0 To .Cols - 1
            lngMax = 0
            'Parcoure les lignes
            For idxRow = 0 To .Rows - 1
                texte = .TextMatrix(idxRow, idxCol)
                'met la taille du texte de la cellule en pixels dans taille
                GetTextExtentPoint32 hdc, texte, Len(texte), taille
                'lngMax est la longueur du texte le plus long dans cette colonne
                If taille.cx > lngMax Then lngMax = taille.cx
            Next
            'met lngMax en twips en ajoutant 10 pixels pour les marges
            If lngMax > 0 Then lngMax = (lngMax + 10) * Screen.TwipsPerPixelX
            'Applique la largeur de colonne si besoin
            If lngMax > .ColWidth(idxCol) Then .ColWidth(idxCol) = lngMax
        Next
    End With

End Sub


Voici comment appeler la procédure ResizeColumns :
vb
ResizeColumns Me.hdc, MSFlexGrid1



Trouver sur un autre site , je n'en suis pas l'auteur.

signaler à un administrateur
Commentaire de titibo le 24/10/2006 17:32:46

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.

signaler à un administrateur
Commentaire de grandmok le 15/03/2007 14:35:12

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.

signaler à un administrateur
Commentaire de adamo901 le 21/04/2007 17:24:02

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é.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.