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

VBA Access Discussion :

Comment sélectionner la première ligne d'un champ texte long ? [AC-2016]


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Comment sélectionner la première ligne d'un champ texte long ?
    Bonjour à tous,
    Tout est dit dans l'intitulé
    J'aimerais pouvoir sélectionner la première ligne puis dans un deuxième temps le reste du texte d'un champ texte long afin de le mettre en forme
    Exemple :
    Première ligne en gras, taille 11
    Deuxième ligne en italique, taille 9

    Je sais mettre en forme en HTML mais je n'arrive pas à trouver comment sélectionner seulement une partie de ce texte
    Merci pour vos idées

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Salut,

    à priori, je partirai sur une logique de détection du caractère de retour ( parmi vbCr / vbLf / vbCrLf), avec un split pour découper par ligne, et appliquer ensuite...
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bonjour Jean-Philippe,
    Merci de ta réponse, en effet VbCr ou VbCrLf ou vbLf fonctionne avec quelque différences toutefois. (que j'ai du mal à cerner d'ailleurs - cf. ci-dessous)
    Du coup un autre problème se pose :
    Un bout de code vaut mieux qu'un long discourt :

    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
    22
    23
    24
    25
    26
    27
    Private Sub TxtArticleDesignationLongue_LostFocus()
     
        Dim LcStrDesignLong As String, LcStrPremLigne As String, LcStrSuivLigne As String
        Dim LcStrTableauCaract() As String, LcStrTableauLigne() As String
        Dim LcIntI01 As Integer, LcIntNbrCaract As Integer
        Dim LcIntPosRetour As Integer, LcIntPremPosTexte As Integer, LcIntDernPosTexte As Integer
     
        LcStrDesignLong = TxtArticleDesignationLongue   'Selectionne la totalité du contenu du champs TxtArticleDesignationLongue avec les balises HTML (S'il y en a ...)
        LcIntPosRetour = InStr(LcStrDesignLong, vbCrLf)   'Donne la position du premier retour chariot
     
        'Debug.Print LcStrDesignLong (VbCr ou VbCrLf ou vbLf)
     
        If LcIntPosRetour = 0 Then 'S'il n'y a pas de retour chariot (donc qu'il n'y a qu'une ligne)
            ReDim LcStrTableauLigne(1)
            LcStrTableauLigne(0) = LcStrDesignLong
        Else
            LcStrTableauLigne = Split(LcStrDesignLong, vbCrLf)
            For LcIntI01 = 0 To UBound(LcStrTableauLigne)
                Debug.Print LcIntI01 & " " & LcStrTableauLigne(LcIntI01)
            Next LcIntI01
            Debug.Print "Fin"
            Debug.Print " "
            Debug.Print LcStrTableauLigne(0) & LcStrTableauLigne(1)
            Debug.Print "Fin"
        End If
        '...
        End Sub
    Pourquoi je me retrouve avec un tableau de 5 lignes alors que mon champ ne comporte que 3 lignes
    (les lignes impaires sont "apparemment" vides)
    Par exemple, si j'ai dans mon champ :
    Ligne01
    Ligne02
    Ligne03
    Le bout de mon code ci-dessus me sortira :

    0 Ligne01
    1
    2 Ligne02
    3
    4 Ligne03
    Fin
    Du coup, ces lignes sont créées avec quelles données ? Surtout que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Debug.Print LcStrTableauLigne(0) & LcStrTableauLigne(1) 
    Debug.Print "Fin"
    me donne :

    Ligne01
    Fin
    Mis à part que mon tableau est presque 2x plus gros qu'il ne devrait, ce n'est pas réellement un problème (il me suffit de re-remplir mon tableau en re-décalant les lignes et redimensionner ce dernier, et hop le tour est joué, (sauf s'il y a une méthode plus simple)), mais j'aime bien comprendre !!...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Selectionner des lignes dans un champ texte long enrichi et les mettre en forme
    Je pose ci-dessous le code final à toutes fins utiles, si cela peut rendre service (faut bien renvoyer l’ascenseur, vu le nombre de fois que vous m'avez aidé ces dernières années (et les prochaines aussi )

    Le but de cette procédure est de :
    Supprimer toute ligne vide (au milieu et à la fin du champ)
    Mettre en gras et taille police 11 la première ligne du champ
    Mettre en italique et taille police 10 les lignes suivantes

    Peut importe si le contenu est déjà mis en forme ou pas (précision : ce champ était à la base un champ texte long / texte brut, donc certains enregistrements ne contiennent pas de balise HTML

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    Private Sub TxtArticleDesignationLongue_LostFocus()
     
        Dim LcStrDesignLong As String, LcStrPremLigne As String, LcStrSuivLigne As String
        Dim LcStrTableauCaract() As String, LcStrTableauProv() As String, LcStrTableauLigne() As String
        Dim LcIntI01 As Integer, LcIntI02 As Integer, LcIntNbrLigneNonVide As Integer, LcIntNbrCaract As Integer
        Dim LcIntPosRetour As Integer, LcIntPremPosTexte As Integer, LcIntDernPosTexte As Integer
     
     
     
        '(1)Mise en forme du texte
        '-------------------------
        LcStrDesignLong = TxtArticleDesignationLongue               'Selectionne la totalité du contenu du champs TxtArticleDesignationLongue avec les balises HTML
        LcIntPosRetour = InStr(LcStrDesignLong, vbCrLf)             'Donne la position du premier retour chariot
     
    'Debug.Print "Contenu du champ :"
    'Debug.Print LcStrDesignLong
     
        If LcIntPosRetour = 0 Then                                  'S'il n'y a pas de retour chariot (donc qu'il n'y a qu'une ligne)
            ReDim LcStrTableauLigne(0)
            LcStrTableauLigne(0) = LcStrDesignLong
        Else                                                        'Sinon
            LcStrTableauProv = Split(LcStrDesignLong, vbCrLf)       'Crée un tableau provisoire avec chaque portion comprise entre les retours chariot
            For LcIntI01 = 0 To UBound(LcStrTableauProv)
                If LcStrTableauProv(LcIntI01) = "" And LcIntI01 = 0 Then
                    MsgBox ("Veuillez remplir la désignation longue !")
                ElseIf LcStrTableauProv(LcIntI01) <> "" And InStr(LcStrTableauProv(LcIntI01), "*") = 0 Then
                    LcIntNbrLigneNonVide = LcIntNbrLigneNonVide + 1
                End If
            Next LcIntI01
     
            ReDim LcStrTableauLigne(LcIntNbrLigneNonVide - 1)        'Crée un tableau définif nettoyé de ses lignes vides et des sauts de ligne dans le champ
            LcIntI02 = 0
            For LcIntI01 = 0 To UBound(LcStrTableauProv)
                If LcStrTableauProv(LcIntI01) <> "" And InStr(LcStrTableauProv(LcIntI01), "*") = 0 Then
                    LcStrTableauLigne(LcIntI02) = LcStrTableauProv(LcIntI01)
                    LcIntI02 = LcIntI02 + 1
                End If
            Next LcIntI01
            ReDim LcStrTableauProv(0)
        End If
     
    'Debug.Print "provisoire"
    'For LcIntI01 = 0 To UBound(LcStrTableauProv)
            'Debug.Print LcIntI01 & " " & LcStrTableauProv(LcIntI01)
    'Next LcIntI01
    'Debug.Print "Contenu du tableau ligne :"
    'For LcIntI01 = 0 To UBound(LcStrTableauLigne)
            'Debug.Print LcIntI01 & " " & LcStrTableauLigne(LcIntI01)
    'Next LcIntI01
     
            'Traitement de la premiere ligne
            LcIntNbrCaract = Len(LcStrTableauLigne(0))                                                          'Compte le nombre de caractere de la ligne
            ReDim LcStrTableauCaract(LcIntNbrCaract - 1)                                                        'Defini la taille du tableau des caracteres
     
    'Debug.Print "Ligne 01 :"
            For LcIntI01 = 0 To UBound(LcStrTableauCaract)                                                      'Rempli le tableau des caracteres
                LcStrTableauCaract(LcIntI01) = Mid(LcStrTableauLigne(0), LcIntI01 + 1, 1)
    'Debug.Print LcIntI01 & " : " & LcStrTableauCaract(LcIntI01)
                If LcIntI01 > 0 Then
                    If LcStrTableauCaract(LcIntI01 - 1) = ">" And LcStrTableauCaract(LcIntI01) <> "<" Then      'Donne la position du premier caractere du texte apres les balises ouvrantes
                        If LcIntPremPosTexte = 0 Then
                            LcIntPremPosTexte = LcIntI01
                        End If
                    End If
                    If LcStrTableauCaract(LcIntI01 - 1) = "<" And LcStrTableauCaract(LcIntI01) = "/" Then       'Donne la position du dernier caractere du texte avant les balises fermantes
                        If LcIntDernPosTexte = 0 Then
                            LcIntDernPosTexte = LcIntI01 - 2
                        End If
                    End If
                End If
            Next LcIntI01
    'Debug.Print "Position début : " & LcIntPremPosTexte
    'Debug.Print "Position fin : " & LcIntDernPosTexte
     
            If LcIntPremPosTexte = 0 And LcIntDernPosTexte = 0 Then                                             'S'il n'y a pas de balise de mise en forme
                LcStrTableauLigne(0) = "<div><font size:11pt><strong>" & LcStrTableauLigne(0) & "</strong></font></div>"
            Else
                LcStrTableauLigne(0) = ""
                For LcIntI01 = LcIntPremPosTexte To LcIntDernPosTexte                                           'Compile les valeurs de la ligne pour reformer le texte sans les balises de mise en forme
                    LcStrTableauLigne(0) = LcStrTableauLigne(0) & LcStrTableauCaract(LcIntI01)
                Next LcIntI01
                LcStrTableauLigne(0) = "<div><font size:11pt><strong>" & LcStrTableauLigne(0) & "</strong></font></div>"
            End If
    'Debug.Print "TableauLigne(0) remise en forme :"
    'Debug.Print LcStrTableauLigne(0)
     
            'Traitement des lignes suivantes (s'il y en a ...)
            If UBound(LcStrTableauLigne) > 0 Then
                For LcIntI02 = 1 To UBound(LcStrTableauLigne)
    'Debug.Print "Ligne 0" & LcIntI02 + 1
                    LcIntPremPosTexte = 0
                    LcIntDernPosTexte = 0
                    LcIntNbrCaract = Len(LcStrTableauLigne(LcIntI02))                                                   'Compte le nombre de caractere de la ligne
                    ReDim LcStrTableauCaract(LcIntNbrCaract - 1)                                                        'Defini la taille du tableau des caracteres
     
                    For LcIntI01 = 0 To UBound(LcStrTableauCaract)                                                      'Rempli le tableau des caracteres
                        LcStrTableauCaract(LcIntI01) = Mid(LcStrTableauLigne(LcIntI02), LcIntI01 + 1, 1)
    'Debug.Print LcIntI01 & " : " & LcStrTableauCaract(LcIntI01)
                        If LcIntI01 > 0 Then
                            If LcStrTableauCaract(LcIntI01 - 1) = ">" And LcStrTableauCaract(LcIntI01) <> "<" Then      'Donne la position du premier caractere du texte apres les balises ouvrantes
                                If LcIntPremPosTexte = 0 Then
                                    LcIntPremPosTexte = LcIntI01
                                End If
                            End If
                            If LcStrTableauCaract(LcIntI01 - 1) = "<" And LcStrTableauCaract(LcIntI01) = "/" Then       'Donne la position du dernier caractere du texte avant les balises fermantes
                                If LcIntDernPosTexte = 0 Then
                                    LcIntDernPosTexte = LcIntI01 - 2
                                End If
                            End If
                        End If
                    Next LcIntI01
    'Debug.Print "Position début : " & LcIntPremPosTexte
    'Debug.Print "Position fin : " & LcIntDernPosTexte
     
                    If LcIntPremPosTexte = 0 And LcIntDernPosTexte = 0 Then                                             'S'il n'y a pas de balise de mise en forme
                        LcStrTableauLigne(LcIntI02) = "<div><font size=2><em>" & LcStrTableauLigne(LcIntI02) & "</em></font></div>"
                    Else
                        LcStrTableauLigne(LcIntI02) = ""
                        For LcIntI01 = LcIntPremPosTexte To LcIntDernPosTexte                                           'Compile les valeurs de la ligne pour reformer le texte sans les balises de mise en forme
                            LcStrTableauLigne(LcIntI02) = LcStrTableauLigne(LcIntI02) & LcStrTableauCaract(LcIntI01)
                        Next LcIntI01
                        LcStrTableauLigne(LcIntI02) = "<div><font size=2><em>" & LcStrTableauLigne(LcIntI02) & "</em></font></div>"
                    End If
    'Debug.Print "TableauLigne(" & LcIntI02 & ") remise en forme :"
    'Debug.Print LcStrTableauLigne(LcIntI02)
                Next LcIntI02
            End If
     
            'Remplissage du champ avec la nouvelle mise en forme
            If UBound(LcStrTableauLigne) = 0 Then
                TxtArticleDesignationLongue = LcStrTableauLigne(0)
            Else
                TxtArticleDesignationLongue = ""
                For LcIntI02 = 0 To UBound(LcStrTableauLigne) - 1
                    TxtArticleDesignationLongue = TxtArticleDesignationLongue & LcStrTableauLigne(LcIntI02) & Chr(13) & Chr(10)
                Next LcIntI02
                TxtArticleDesignationLongue = TxtArticleDesignationLongue & LcStrTableauLigne(UBound(LcStrTableauLigne))
            End If
        '(1)Fin
     
    End Sub
    Par contre, si un petit malin s'amuse à mettre en forme simplement une partie de texte dans une ligne .... là, c'est le drame !!... (si quelqu'un veut s'y mettre ... )

    Si (juste pour mon information personnelle) quelqu'un m'expliquer :
    1-Pourquoi ce champ me sort un TableauLigne avec une ligne sur deux vide avant traitement VBA, et aucune ligne vide si le champ a déjà été mis en forme par VBA, je suis preneur
    2-Pourquoi pour avoir la premiere ligne en police 11, j'ai du coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LcStrTableauLigne(0) = "<div><font size:11pt><strong>" & LcStrTableauLigne(0) & "</strong></font></div>"
    alors que pour les lignes suivantes, j'ai du coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LcStrTableauLigne(LcIntI02) = "<div><font size=2><em>" & LcStrTableauLigne(LcIntI02) & "</em></font></div>"
    Car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LcStrTableauLigne(LcIntI02) = "<div><font size:10pt><em>" & LcStrTableauLigne(LcIntI02) & "</em></font></div>"
    Me sort une police en italique mais en taille 11
    Bonne fin de journée à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment sélectionner que les lignes doublons
    Par Inconnu_du_69 dans le forum Langage SQL
    Réponses: 20
    Dernier message: 12/02/2009, 16h18
  2. Comment descendre d'une ligne dans un champ avec filtre automatique
    Par frolland46 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2008, 20h15
  3. [XML] msxml Comment mettre les premières lignes ?
    Par eponette dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 06/12/2007, 17h09
  4. Réponses: 6
    Dernier message: 11/09/2006, 11h44
  5. Comment sélectionner la première ligne ?
    Par MartinH dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/04/2004, 11h56

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