Modifier la hauteur de ligne d'un msflexgrid au fur et à mesure de la saisie

Description

Pour pouvoir utiliser un MSFlexGrid comme une grille dans laquelle on saisie des données, il importe de pouvoir modifier la hauteur des lignes au fur et à mesure de la frappe surtout lorsqu'on souhaite taper plusieurs paragraphes dans une seule ligne ou lorsque la ligne dépasse la largeur de la colonne.

La propriété WordWrap de la grille doit être mise à True, ce qui permet le renvoie automatiquement à la ligne des mots dépassant la largeur de la colonne. Mais si l'on s'en tient à cela, la hauteur de la ligne n'est pas modifié et ces mots peuvent donc être masqués.

Source / Exemple :


Private Sub AjusterLigne()
    
    Dim LeTexte As String
    Dim LaPhrase As String
    Dim Ligne As Integer
    Dim Colonne As Integer
    Dim LargeurColonne As Integer
    Dim HauteurLigne As Integer
    Dim NouvelleHauteur As Integer
    Dim z() As String
    Dim nbreLignes As Integer
    Dim i As Integer
    Dim h As Long
    
    LeTexte = Me.MSFlexGrid1.Text               'Le texte de la cellule
    Ligne = Me.MSFlexGrid1.Row               'La ligne en cours
    Colonne = Me.MSFlexGrid1.Col               'La colonne en cours
    LargeurColonne = Me.MSFlexGrid1.ColWidth(Colonne)     'La largeur de la colonne en cours
    HauteurLigne = Me.MSFlexGrid1.RowHeight(Ligne)      'La hauteur de la ligne en cours
    
    'Si la cellule est vidé de son contenu
    If LeTexte = "" Then Me.MSFlexGrid1.RowHeight(Ligne) = Me.TextHeight("X") + 40: Exit Sub
    
    z = Split(LeTexte, Chr(10))    'Découpe la chaine de la cellule en morceaux
    nbreLignes = UBound(z)
    If nbreLignes = 0 Then              'S'il n'y a pas de retour chariot...
        nbreLignes = 1                  '...il n'y a qu'une ligne (vide ou non)
    Else
        nbreLignes = nbreLignes + 1     'Sachant que UBound donne l'index maximum et démarre à 0,
    End If
    
    'La hauteur de la ligne est donc de...
    NouvelleHauteur = (Me.TextHeight("X") * nbreLignes)
        
    'Passe en revue chacune des lignes afin de savoir si elles sont plus longues que la colonne
    For i = LBound(z) To UBound(z)
        'Si tel est le cas, augmente la hauteur de la ligne...
        If Me.TextWidth(z(i)) > LargeurColonne Then
            h = Me.TextWidth(z(i)) / LargeurColonne
            NouvelleHauteur = NouvelleHauteur + Me.TextHeight(String(h - 1, Chr(10)))
        End If
    Next
    
    'Dimensionne finalement la ligne
    If NouvelleHauteur > HauteurLigne Then Me.MSFlexGrid1.RowHeight(Ligne) = NouvelleHauteur + 40
    
End Sub

Conclusion :


PS: j'ai utilisé la proposition de Davyboy (source n°7314) pour effectuer la saisie dans le MSFlexGrid...

Codes Sources

A voir également

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.