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 :

Macro pour supprimer les lignes entre les titres


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut Macro pour supprimer les lignes entre les titres
    Bonjour,

    Dans un document Word j’ai plusieurs niveaux de titre. Je cherche a écrire une macro qui va supprimer les interlignes mais uniquement entre les titres de même niveau.

    Pour supprimer les lignes vides, je pensais à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub SupprLignesVides()
    Selection.Find.ClearFormatting
    With Selection.Find
        .Execute FindText:="^p^p", Replace:=wdReplaceAll, ReplaceWith:="^p"
     
    End With
    End Sub
    Mais d’une part ca ne marche pas (pourquoi ? une ligne vide c’est bien 2 retour à la ligne ?), d’autre part je ne sais pas comment lui dire de le faire seulement si les titres sont de même niveau.

    Vous sauriez comment faire ?
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Je pense que la fonction Find ne te sera pas d'une grande aide.

    Tu dois faire une boucles sur les paragraphes pour déterminer leur niveau.
    si tu rencontre un niveau, vérifier les deux paragraphes suivants.
    Le suivant est-il vide et le second est-il du même niveau.
    Si c'est le cas, on supprime le vide et on continue.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    J'ai essayé le code suivant, mais j'ai un problème avec ma variable previouStyle :

    -je ne sais pas vraiment si ma déclaration est la bonne (est ce le bon type)
    -et surtout (le compilateur me dit qu'il y a une erreur) "previousStyle = Heading 11" ne lui plait pas du tout (j'ai mis 11 au hasard, pour être sur de ne pas tomber sur une valeur que j'ai)... mais je ne sais pas comment initialiser ma valeur


    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
    Sub aLignesVides()
     
    Dim previousStyle As HeadingStyle
    Dim i As Integer
    previousStyle := Heading 11
    For i = 1 To ActiveDocument.Paragraphs.Count
     
        If ActiveDocument.Paragraphs(i).Style = previousStyle Then
            Selection.MoveUp Unit:=wdLine, Count:=1
            Selection.Delete Unit:=wdCharacter, Count:=1
        End If
     
    Next i
     
    End Sub

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Tu dois travailler avec le nom du style et pas avec son niveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveDocument.Paragraphs(1).Style

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    je ne comprends pas bien ce que vous voulez dire : si je met paragraphs(1) je vais effectuer ma recherche que sur le 1er paragraphe, non ?
    Pour effectuer une recherchée sur l'ensemble du doc, ne faut il pas faire une boucle sur tous ses paragraphes ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Correct, Paragraphs(1) correspond au premier paragraphe.

    Je l'ai utilisé comme exemple, c'est .Style qui est important.
    Normalement les niveaux sont accroché au style et comparer le nom des styles entre eux suffit.

    Pour faire une boucle sur les paragraphes, il n'est pas nécessaire de les compter.
    Les paragraphes faisant partie d'une collection, on peut parcourir tous ses membres dans une boucle.
    En plus, le fait de les compter et d'en supprimer va poser problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim oPara As Paragraph
     
    For Each oPara In ActiveDocument.Paragraphs
    ...
    ...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    OK merci je comprends.

    Le code serait quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub aLignesVides()
     
    Dim oPara As Paragraph
    previousStyle := Heading 11
    For Each oPara In ActiveDocument.Paragraphs
     
        If oPara.Style = previousStyle Then
            Selection.MoveUp Unit:=wdLine, Count:=1
            Selection.Delete Unit:=wdCharacter, Count:=1
            previousStyle = oPara.Style
        End If
    Next i
     
    End Sub

    Et pour initialiser la variable previousStyle, comment je peux faire ? (si je ne l'initialise pas je pense que ca va planter puisque je l'utilise avant de l'affecter... mais je ne sais pas avec quoi l'initialiser et avec quel type de données... visiblement celui que je lui ai donné ne lui convient pas trop)

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Au lieu d'utiliser une variable spéciale, utilises une simple variable texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim PrevSty As String
    ...
    ...
    PrevSty = oPara.Style
    Et fait ta comparaison sur ce string et il est même possible de faire un test sur ce nom pour savoir si c'est un titre ou pas.

    En fait, je passerais de cette manière.

    Pour chaque para, recupérer le nom du style
    si le para suivant est vide, le sélectionner
    faire un test de comparaison sur le para suivant et si le test est vrai on supprime la sélection.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    En suivant ce que vous m’avez dit, j’ai le code suivant, qui compile mais ne fait absolument rien à l’exécution. Vous sauriez pourquoi ? Qu’est ce que j’ai oublié ?

    N’y a t’il pas aussi un effet de bord : je n’initialise jamais ma variable : qd je l’utilise la 1ère fois, qu’est ce qu’il y a dedans ?




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim i As Integer
    Dim previousStyle As String
    For i = 1 To ActiveDocument.Paragraphs.Count
     
        If ActiveDocument.Paragraphs(i).Style = previousStyle Then
            If Selection.Characters.Count = 0 Then
                Selection.Delete Unit:=wdCharacter, Count:=1
            End If
        End If
     
        previousStyle = ActiveDocument.Paragraphs(i).Style
    Next i

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    un petit up

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Vous n'avez aucune idée ?

  12. #12
    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 : 61
    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
    [code]Salut NouvelInscrit,

    <<<@!1!@>>>

    Si, si, elle va même résoudre ton problème mais si tu l'utilises comme tu le proposes en effet Heureux-Oli a raison et elle ne peut pas te servir.
    Voilà le truc pour un titre de nbiveau 2

    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
     
        Selection.Find.ClearFormatting
        Selection.Find.Style = ActiveDocument.Styles("Titre 2")
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "^p^p"
            .Replacement.Text = "^p"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    Après tu peux faire une boucle sur les niveaux que tu veux de 1 à 9 par exemple.

    @+

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Apparemment la macro ne marche pas non plus ???
    Mais c'est bizarre, qd je crée une document avec des espaces, si je fais la fonction rechercher, il ne trouve aucun "^p^p" ???

  14. #14
    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 : 61
    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 NouvelInscrit,

    En effet ce n'est pas normal. Peux-tu mettre ton document, s'il ne contient rien de confidentiel sur le forum, pour que l'on puisse t'aider de façon plus efficace ?

    @+

  15. #15
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 252
    Points : 74
    Points
    74
    Par défaut
    bonjour,

    Je prolonge un peu le sujet.
    J'aimerais supprimer les lignes vides à l'intérieur d'une section.


    Merci

  16. #16
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Citation Envoyé par nouvelinscrit Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim i As Integer
    Dim previousStyle As String
    For i = 1 To ActiveDocument.Paragraphs.Count
     
        If ActiveDocument.Paragraphs(i).Style = previousStyle Then
            If Selection.Characters.Count = 0 Then
                Selection.Delete Unit:=wdCharacter, Count:=1
            End If
        End If
     
        previousStyle = ActiveDocument.Paragraphs(i).Style
    Next i
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Selection.Characters.Count = 0 Then
    Il faut tester le nombre de caractères du paragraphe comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ActiveDocument.Paragraphs(i).Range.Characters.Count=1 then
    Si le paragraphe est une ligne vide => 1 seul caractère

  17. #17
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    Pour les sections, tu peux utiliser un test de ce type à adapter
    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
     
    Dim index as long, indexprec as long
    Dim s As Section, sprec as Section
    ....
     
    For Each s In ActiveDocument.Paragraphs(i).Range.Sections
    index = s.Index
    Next s 
    If i>1 then 
    For Each sprec In ActiveDocument.Paragraphs(i-1).Range.Sections
    indexprec = sprec.Index
    Next sprec 
    else 
    indexprec=0
    endif
     
    If index=indexprec Then 
    'Même section
    Else 
    'Sections différentes
    end if

  18. #18
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/11/2012, 14h24
  2. Une macro pour supprimer des lignes dans un message
    Par blade2a dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/06/2012, 01h26
  3. [XL-2010] Macro pour inserer des ligne avec les formules de la ligne au dessus
    Par Argonan dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/02/2012, 12h58
  4. [XL-2007] Macro pour supprimer des lignes sous conditions de valeur de cellule
    Par frisco75 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/09/2011, 14h33
  5. [Toutes versions] Création Macro pour supprimer des lignes après tests conditionnels
    Par PeaceMaker dans le forum Macros et VBA Excel
    Réponses: 26
    Dernier message: 14/01/2011, 16h00

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