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 Word Discussion :

Comment retirer les sauts de ligne dans champs STYLEREF ?


Sujet :

VBA Word

  1. #1
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut Comment retirer les sauts de ligne dans champs STYLEREF ?
    Bonjour,

    Mon document possède un titre avec des sauts de ligne (que l'on insère avec Shift+Enter).

    Je reprends ensuite le style de ce titre dans un champ d'entête (STYLEREF MonStyle) pour afficher le titre.

    Jusque là tout va bien ... MAIS le saut de ligne apparaît également dans mon entête, ce que je ne souhaite pas.

    Connaissez-vous une ruse pour empêcher cela ?

    Merci d'avance.

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  2. #2
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Non comme STYLEREF est fait pour ça, il est difficile de lui demander autre chose. idem pour REF qui utilise des renvois sur des éléments numérotés ou des titres. La seule solution (lourde hélas) que je vois et sans macro est de mettre un signet sur ta 1ère partie de ton titre (avant le saut de page), une sur la 2nde partie de ton titre (celle après) et de faire des renvois sur sur 2 parties.

    Voilà ce que ça peut donner.

    @+

  3. #3
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Whouaaa ! Je vois que tu jongles habilement avec les champs !

    Mais ta méthode "manuelle" (ou "humaine") ne me convient pas car mon traitement est effectué exclusivement par macro. C'est à dire que je ne sais pas à l'avance où se trouvera le saut de ligne dans le titre...

    Nom : SautALaLigneTitre.PNG
Affichages : 1022
Taille : 8,3 Ko Nom : SautALaLigneTitre2.PNG
Affichages : 1024
Taille : 5,0 Ko

    Je regrette particulièrement qu'il n'y ait pas un commutateur dans les champs texte (comme STYLEREF) qui permette de remplacer ces caractères par des espaces car les champs sont en général destinés à se trouver en en-tête ou pied de page et donc rappeler le texte sans formatage et de façon la plus basique possible...

    Merci quand même...
    Si quelqu'un d'autre à la méthode "miracle" utilisable de façon générique par code vba, n'hésitez pas.

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  4. #4
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Attends, il y a une possibilité mais je voulais voir si par hasard la version "manuelle" n'était pas suffisante.

    Ce qui est fait en manuel peut être entièrement automatisé avec une macro qui ferait:
    1. Détecter les sauts de ligne dans les Titres
    2. Poser un signet en auto juste avant le saut de ligne et un juste après
    3. Ajouter les 2 renvois sur tes titres dans chaque entête


    Mais pour avoir le même comportement que STYLEREF, tu dois ajouter un saut de section devant chaque paragraphe de Titre, ce qui peut être fait par macro aussi et avoir un entête différent par section mais c'este ce que tu as visuellement (STYLEREF change la valeur en fonction de la position dans la texte).

    Si ça t'intéresse, dis-moi que l'on puisse avancer dans cette voie.

    @+

  5. #5
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Merci Sepia,

    Ok ! Je suis partant pour l'aventure !

    Mais j'ai effectivement besoin de ton aide pour ne pas m'arracher les cheveux avec les positionnements dans les range et/ou les sélection

    Le contexte est le suivant: Mon traitement commence par supprimer l'en-tête, puis le recrée tout beau tout neuf. Il doit pouvoir passer n fois sur le même docx.

    Donc je pense qu'il faudrait rajouter l'étape 0 aux 3 étapes que tu as précisé:

    0. Détecter les titres et les nettoyer de tous les signets
    1. Détecter les sauts de ligne dans les Titres
    2. Poser un signet en auto juste avant le saut de ligne et un juste après
    3. Ajouter les 2 renvois sur tes titres dans chaque entête

    Je suppose qu'on commence par rechercher le titre par rapport à son style ? (tiens tiens ça me rappelle mon autre dicussion en cours ... tu n'aurais pas une idée d'ailleurs ???)

    @ bientôt

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  6. #6
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Ok on y va mais par étape, c'est plus efficace (pour apprendre)

    Pour supprimer tous nos signets auto, il suffit de leur donner un nom auto mais qui doit être unique du style. Donc le mieux est de prendre "SigTitreAutoAvt_n" et "SigTitreAutoApr_n" avec n qui correspond à la dernière valeur + 1 du dernier signet avec conversion sur 3 caractères.

    Pour les supprimer, il suffit de faire une boucle sur les signets et un test sur le nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub GenererMesTitresSansSautsDeLigne()
       '// Supprimer les anciens signets sur les titres
       aI = ActiveDocument.Bookmarks.Count
       While aI > 0
          If InStr(ActiveDocument.Bookmarks(aI).Name, "SigTitreAutoA") = 1 Then
             ActiveDocument.Bookmarks(aI).Delete
          End If
          aI = aI - 1
       Wend
    End Sub
    Un saut de ligne manuel dans la recherche de Word est "^l" avec le style qui va bien "Titre xxx" ici (regarde la PJ)

    @+

  7. #7
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Voici le code pour ajouter les signets (+ purge des précédents)
    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
    Sub GenererMesTitresSansSautsDeLigne2()
    '// Supprimer les anciens signets sur les titres
        aI = ActiveDocument.Bookmarks.Count
        While aI > 0
            If InStr(ActiveDocument.Bookmarks(aI).Name, "SigTitreAutoA") = 1 Then
                ActiveDocument.Bookmarks(aI).Delete
            End If
            aI = aI - 1
        Wend
     
        '// Ajouter les signets avant et après
        aI = 1
        Selection.HomeKey Unit:=wdStory
        Selection.Find.ClearFormatting
        Selection.Find.Style = ActiveDocument.Styles("Titre 1")
        With Selection.Find
            .Text = "^l"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute
        While Selection.Find.Found
            Selection.MoveLeft Unit:=wdCharacter, Count:=1
            Selection.MoveUp Unit:=wdParagraph, Extend:=wdExtend
            With ActiveDocument.Bookmarks
                .Add Range:=Selection.Range, Name:="SigTitreAutoAvt_" + Format(aI, "###000")
                .DefaultSorting = wdSortByName
                .ShowHidden = False
            End With
            Selection.MoveRight Unit:=wdCharacter, Count:=2
            Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
            Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            With ActiveDocument.Bookmarks
                .Add Range:=Selection.Range, Name:="SigTitreAutoAps_" + Format(aI, "###000")
                .DefaultSorting = wdSortByName
                .ShowHidden = False
            End With
            Selection.MoveRight Unit:=wdCharacter, Count:=1
     
            aI = aI + 1
            Selection.Find.Execute
        Wend
    End Sub
    @+

  8. #8
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Bonjour Sepia,

    Merci beaucoup pour cette première partie, ça marche impeccable.

    J'ai intégré ton code dans le mien... voilà ce que ça donne :

    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
        '// ====================================================================
        '// GESTION DES SIGNETS (suppression et ajout de signets dans les titres)
        '// ====================================================================
     
        '// Suppression les anciens signets sur les titres
        lngNbBookmarks = objDocument.Bookmarks.Count
        lngi = 0
        '// DEBUG
        Debug.Print "CreaEntetePdP - Nb de signets détectés =" & VBA.Conversion.CStr(lngNbBookmarks)
        While lngNbBookmarks > 0
            If VBA.Strings.InStr(objDocument.Bookmarks(lngNbBookmarks).Name, "SigTitreAutoA") = 1 Then
                objDocument.Bookmarks(lngNbBookmarks).Delete
                lngi = lngi + 1
            End If
            lngNbBookmarks = lngNbBookmarks - 1
        Wend
        '// DEBUG
        Debug.Print "CreaEntetePdP - Nb de signets supprimés =" & VBA.Conversion.CStr(lngi)
     
        '// Ajout des signets avant et après les sauts de lignes dans les titres
        lngNbBookmarks = 1
        Selection.HomeKey Unit:=wdStory
        Selection.Find.ClearFormatting
        '// Rem: voir comment paramétrer le nom du style concerné,
        '// pour l'instant par défaut le 1er niveau de titre CharteXLS.Style(1).strLocalName
        Selection.Find.Style = ActiveDocument.Styles(CharteXLS.Style(1).strLocalName)
        With Selection.Find
            .Text = "^l"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute
        While Selection.Find.Found
            '// Sélection du texte du paragraphe avant le saut de ligne et création du signet
            Selection.MoveLeft Unit:=wdCharacter, Count:=1
            Selection.MoveUp Unit:=wdParagraph, Extend:=wdExtend
            With ActiveDocument.Bookmarks
                .Add Range:=Selection.Range, Name:="SigTitreAutoAvt_" + Format(lngNbBookmarks, "###000")
                .DefaultSorting = wdSortByName
                .ShowHidden = False
            End With
            '// Sélection du texte du paragraphe après le saut de ligne et création du signet
            Selection.MoveRight Unit:=wdCharacter, Count:=2
            Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
            Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            With ActiveDocument.Bookmarks
                .Add Range:=Selection.Range, Name:="SigTitreAutoAps_" + Format(lngNbBookmarks, "###000")
                .DefaultSorting = wdSortByName
                .ShowHidden = False
            End With
            Selection.MoveRight Unit:=wdCharacter, Count:=1
     
            lngNbBookmarks = lngNbBookmarks + 1
            '// Recherche suivante
            Selection.Find.Execute
        Wend
        '// DEBUG
        Debug.Print "CreaEntetePdP - Nb de signets créés =" & VBA.Conversion.CStr((lngNbBookmarks - 1) * 2)
    Je suis impressionné par ta maitrise de la "Selection" !
    Tu vas peut-être m'aider pour certains soucis que j'ai... mais chaque chose en son temps bien sur

    @ bientôt

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  9. #9
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Merci beaucoup pour cette première partie, ça marche impeccable.
    De rien, c'est super

    Tu vas peut-être m'aider pour certains soucis que j'ai... mais chaque chose en son temps bien sur
    Tu connais l'adresse, on reste là.

    Par contre, n'oublie pas de cliquer sur :Resolu: pour aider les DVPnautes qui auraient les mêmes demandes/besoins que toi

    @+

  10. #10
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Peux-tu me donner le code que tu utiliserais pour l'étape 3 ?

    3. Ajouter les 2 renvois sur tes titres dans chaque entête

    Car d'une part, c'est la première fois que j'utilise des signets, et d'autre part mon code qui écrit en en-tête est très capricieux car je ne maitrise toujours ce satané objet Selection qui m'en fait voir de toutes les couleurs !

    Actuellement, j'utilise un Selection.Fields.Add pour un champ de type wdFieldEmpty (dont je renseigne ensuite le Text), et un Selection.TypeText pour écrire du texte après le champ... Pourrais-je avoir ta version ?

    Merci d'avance et @ bientôt

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  11. #11
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Etape 3: on ajoute les sauts de section pour avoir des entêtes et des pieds de page différents
    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
     
    Sub DVP_GenererMesTitresSansSautsDeLigne3()
    '// Supprimer les anciens signets sur les titres
        aI = ActiveDocument.Bookmarks.Count
        While aI > 0
            If InStr(ActiveDocument.Bookmarks(aI).Name, "SigTitreAutoA") = 1 Then
                ActiveDocument.Bookmarks(aI).Delete
            End If
            aI = aI - 1
        Wend
     
        '// Ajouter les signets avant et après
        aI = 1
        Selection.HomeKey Unit:=wdStory
        Selection.Find.ClearFormatting
        Selection.Find.Style = ActiveDocument.Styles("Titre 1")
        With Selection.Find
            .Text = "^l"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute
        While Selection.Find.Found
            Selection.MoveLeft Unit:=wdCharacter, Count:=1
            With ActiveDocument.Bookmarks
                .Add Range:=Selection.Range, Name:="SigTitreAutoAvt_" + Format(aI, "###000")
                .DefaultSorting = wdSortByName
                .ShowHidden = False
            End With
            Selection.MoveUp Unit:=wdParagraph, Count:=1
            If aI > 1 Then
                Selection.TypeParagraph
                Selection.MoveUp Unit:=wdParagraph, Extend:=wdExtend
                Selection.Style = ActiveDocument.Styles("Normal")
                Selection.InsertBreak Type:=wdSectionBreakNextPage
                Selection.Delete Unit:=wdCharacter, Count:=1
            End If
            ActiveDocument.Bookmarks("SigTitreAutoAvt_" + Format(aI, "###000")).Start = Selection.Start
     
            Selection.GoTo What:=wdGoToBookmark, Name:="SigTitreAutoAvt_" + Format(aI, "###000")
            Selection.MoveRight Unit:=wdCharacter, Count:=2
            Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
            Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            With ActiveDocument.Bookmarks
                .Add Range:=Selection.Range, Name:="SigTitreAutoAps_" + Format(aI, "###000")
                .DefaultSorting = wdSortByName
                .ShowHidden = False
            End With
            Selection.MoveRight Unit:=wdCharacter, Count:=1
     
            aI = aI + 1
            Selection.Find.Execute
        Wend
    End Sub

    Après je te laisse insérer les signets par section (je ne vais pas tout faire quand même). Utilise l'enregistreur de macros (pour t'aider voici les instructions pour ajouter un renvoi sur la 1ère partie du titre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Selection.InsertCrossReference ReferenceType:="Signet", ReferenceKind:=wdContentText, _
                ReferenceItem:="SigTitreAutoAvt_" + Format(aI, "###000"), InsertAsHyperlink:=False, _
                IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
    @+

Discussions similaires

  1. Comment supprimer les sauts de ligne dans un String ?
    Par pathfinder06 dans le forum Langage
    Réponses: 5
    Dernier message: 28/02/2008, 11h40
  2. Réponses: 6
    Dernier message: 11/09/2006, 11h44
  3. ETAT - Ignorer les sauts de ligne dans un champ mémo
    Par superseba888 dans le forum Access
    Réponses: 4
    Dernier message: 14/08/2006, 02h27
  4. Réponses: 2
    Dernier message: 13/06/2006, 15h45
  5. Comment faire un saut de ligne dans un IMG - Title ?
    Par jlbinfo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 19/10/2005, 18h28

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