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 :

Identifier style et suppression des 2 ou 3 paragraphes qui suivent s'ils sont vides


Sujet :

VBA Word

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Identifier style et suppression des 2 ou 3 paragraphes qui suivent s'ils sont vides
    Bonjour,

    Je travaille avec un logiciel commercial de gestion qui permet de créer des doc word depuis un modèle XLM qui intègre des champs de fusion (nom, adresse, etc.).
    La difficulté est que si certains champs ne comportent aucune donnée, ils laissent un paragraphe vide et occupent inutilement de la place dans la mise en page du doc.

    Je souhaiterais dès lors créer une macro susceptible d'identifier le style ("Nom") affecté au premier champ de fusion (ce dernier est toujours complété et donc existant) et de supprimer automatiquement les 2 ou 3 paragraphes qui suivent s'ils sont vides.

    Je sais lancé une macro mais je n'ai aucune connaissance pour sa programmation.

    Auriez-vous une piste pour identifier un paragraphe affecté d'un style et ensuite les 3 paragraphes qui suivent s'ils sont vides en vue de les supprimer ?

    D'avance, 1000 mercis de votre aide !
    Images attachées Images attachées  

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gregdf Voir le message
    Je souhaiterais dès lors créer une macro susceptible d'identifier le style ("Nom") affecté au premier champ de fusion (ce dernier est toujours complété et donc existant) et de supprimer automatiquement les 2 ou 3 paragraphes qui suivent s'ils sont vides.
    Bonjour,

    Auriez-vous un exemple représentant votre cas à mettre en ligne ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour votre réaction.

    Dans la pièce-jointe que j'avais communiquée, on a aperçoit les champs de fusion.

    Si je n'ai aucune donnée pour les champs de fusion NOM2 (§1er), CTITRES & co (§2) ou QUALITES (§3), j'obtiens néanmoins des paragraphes (voir nouvelle pièce-jointe) qui sont vides.

    L'idée serait donc de pouvoir les identifier et de les supprimer, tout en précisant que le premier paragraphe contenant les champs TITRE, PRENOM et NOM dispose du style "Nom" qui lui est seul affecté et sera toujours rempli.
    Images attachées Images attachées  

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gregdf Voir le message
    J'avais bien compris le problème. Ce que je souhaitais, c'était un fichier sans données confidentielles représentant votre cas pour éviter d'en modéliser un.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Voici le fichier XML pour le modèle avec les champs de fusion et un fichier word avec le résultat.
    Fichiers attachés Fichiers attachés

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gregdf Voir le message
    J'ai créé le signet de position "SignetNomPrenom" juste avant Monsieur Nom Prénom. Nb : Ce signet n'englobe pas le champ.


    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
     
    Sub SuppressionLignesVides()
     
    Dim DocEnCours As Document
    Dim SignetNom As Bookmark
    Dim I As Integer, NumeroParagraphe  As Integer
     
        Set DocEnCours = ActiveDocument
        With DocEnCours
     
                If .Bookmarks.Exists("SignetNomPrenom") Then
                   .Bookmarks("SignetNomPrenom").Range.Select
                   Selection.HomeKey unit:=wdStory, Extend:=wdExtend
                   NumeroParagraphe = Selection.Paragraphs.Count
                   .Paragraphs(NumeroParagraphe).Range.Select
                  ' Debug.Print "Paragagraphe : " & NumeroParagraphe & ", " & Selection.Range.Text
     
                   For I = NumeroParagraphe + 3 To NumeroParagraphe + 1 Step -1
                       .Paragraphs(I).Range.Select
                       If I = NumeroParagraphe + 3 And Len(Selection.Range.Text) = 4 Then
                          ' Debug.Print "Paragagraphe : " & I & ", " & Len(Selection.Range.Text)
                          Selection.Delete
                       End If
     
                       If I = NumeroParagraphe + 2 And Len(Selection.Range.Text) = 5 Then
                          'Debug.Print "Paragagraphe : " & I & ", " & Len(Selection.Range.Text)
                          Selection.Delete
                       End If
     
                       If I = NumeroParagraphe + 1 And Len(Selection.Range.Text) = 4 Then
                          'Debug.Print "Paragagraphe : " & I & ", " & Len(Selection.Range.Text)
                          Selection.Delete
                       End If
                   Next I
     
                End If
     
        End With
        Set DocEnCours = Nothing
     
    End Sub
    Le bouton rouge dans la barre d'accès rapide, lance la macro.
    Pièce jointe 577740

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Un tout tout grand merci ! Cela fonctionne parfaitement.
    Seul hic qui est de ma faute... j'ai sans doute oublié de préciser que les champs sont également contenus dans une boucle $DEBUT$ - $FIN$ qui permet de les multiplier s'il y a plusieurs destinataires.
    Conséquence : en affectant le signet aux champs $TITRE$ $PRENOM$ $NOM$, la marcro ne semble fonctionner que pour le dernier destinataire même si le signet est effectivement affecté à chacun d'eux.
    En annexe, le résultat qui est donné.
    Est-il possible d'effectuer la même opération pour chaque signet ?
    PS : la marco est-telle susceptible de s'exécuter automatiquement à la création du document ?
    Merci et belle soirée
    Fichiers attachés Fichiers attachés

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gregdf Voir le message
    Quel est votre code, (là où il y a la boucle) ?

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je n’ai aucune mainmise sur le code des champs de fusion implémenté par notre logiciel de gestion.
    Dans le doc xml communiqué ci avant, la boucle dans laquelle ils se situent est déterminée par $debut$ et $fin$...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gregdf Voir le message
    Sauf erreur de ma part, votre document ne contient pas de ContentControl qui aurait permis de déclencher la macro via un événement. En revanche, il est possible de déclencher la macro à la fermeture du fichier (à l'ouverture, les paragraphes en question ne sont pas encore vides), mais je suppose que cela ne peut pas fonctionner comme cela.

    Au final, chaque courrier est-il sauvegardé individuellement au format Word ?

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2020
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Sauf erreur de ma part, votre document ne contient pas de ContentControl qui aurait permis de déclencher la macro via un événement. En revanche, il est possible de déclencher la macro à la fermeture du fichier (à l'ouverture, les paragraphes en question ne sont pas encore vides), mais je suppose que cela ne peut pas fonctionner comme cela.

    Au final, chaque courrier est-il sauvegardé individuellement au format Word ?
    En pièce-jointe,

    - Modèle XML
    - Capture 1 : sélection des destinataires à intégrer dans le courrier ;
    - Capture 2 : sélection du modèle XML intégrant les champs de fusion et la boucle permettant d'intégrer plusieurs destinataire dans le même courrier ;
    - Capture 3 : un seul document word est produit avec l'ensemble des destinataires sélectionnés.
    - Un seul fichier word produit

    Lorsque le modèle est sélectionné et validé (Capture 2), le doc qui est produit et qui s'affiche est automatiquement et déjà enregistré.

    Effectivement, s'il n'est pas possible de déclencher la macro à ce moment-là, il n'y a plus vraiment d'intérêt.

    Au-delà de cette question, la macro ne peut-elle pas parcourir chaque signet et s'exécuter si la condition est remplie afin de fonctionner dans le cadre d'une boucle ?

    Merci déjà pour le temps précieux que vous y avez déjà consacré.

    Bonne journée.
    Images attachées Images attachées    
    Fichiers attachés Fichiers attachés

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gregdf Voir le message
    - Un seul fichier word produit
    Lorsque vous avez plusieurs destinataires, l'ensemble des courriers sont présents sur le même document document, OK.
    Mais je n'ai pas vu ce cas dans votre document joint. La question est donc de savoir ce que devient le signet pour chaque destinataire.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Gregdf Voir le message
    Je n'avais pas pigé, la façon dont s'organisait la liste des destinataires. En ouvrant le fichier une fois traité, vous pourriez balayer les adresses en vous référant aux cases à cocher (fields) qui sont toujours par multiples de 3. Le code, ci-dessous, balaye les 4 lignes pour chaque destinataire :
    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
     
     
    Sub TrouverLesChampsFields()
     
    Dim DocEnCours As Document
    Dim I As Integer, J As Integer, ParagrapheEnCours As Integer
     
        Set DocEnCours = ActiveDocument
     
        With DocEnCours
     
          For I = .Fields.Count To 1 Step -3
              With .Fields(I)
                   .Select
                   Selection.HomeKey unit:=wdStory, Extend:=wdExtend
                   ParagrapheEnCours = Selection.Paragraphs.Count
                   For J = 9 To 6 Step -1
                       MsgBox DocEnCours.Paragraphs(ParagrapheEnCours - J).Range.Text
                   Next J
              End With
          Next I
        End With
     
        Set DocEnCours = Nothing
     
    End Sub
    Ce code ne peut pas être présent dans le fichier docx, il faudrait donc que le traitement se réalise après coup et éventuellement en masse par rapport à un répertoire depuis un fichier .docm, voire .xlsm.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/04/2018, 11h08
  2. Réponses: 3
    Dernier message: 30/10/2013, 17h58
  3. [WD-2003] Suppression de la marque de paragraphe qui suit le tableau WORD
    Par bolide7 dans le forum Word
    Réponses: 3
    Dernier message: 17/09/2011, 20h47
  4. Suppression des styles sur Excel
    Par laurentsen dans le forum Excel
    Réponses: 1
    Dernier message: 05/11/2007, 19h01
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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