Supprimer page blanche dans WORD avec en-tête et pied de page dans une même sect

Résolu
JackleKija Messages postés 8 Date d'inscription lundi 22 août 2011 Statut Membre Dernière intervention 29 septembre 2011 - 13 sept. 2011 à 16:51
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 30 sept. 2011 à 10:59
Bonjour à tous,

Je suis actuellement à la recherche d'un code efficace WORD VBA qui me permettrait de supprimer les pages blanches d'un document.

Toutefois, ces pages ont des en-têtes et des pieds de page mais leur contenu est vide. De plus elles sont comprises dans des sections où certaines pages ne sont quant à elles pas vierges.

Par exemple : Je suis à la section 14 où se trouve la page 22 avec du texte, en-tête et pied de page mais aussi la page 23 qui est vide mais avec en-tête et pied de page.

Est-ce réalisable?

En espérant avoir été le plus clair possible

Merci d'avance.

7 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
14 sept. 2011 à 11:23
Salut

Petite démo de récupération de texte sous Word.
Tu pourras facilement traiter les infos pour déterminer si une page est vide, sachant que 'vide' peut avoir plusieurs signification, à toi de voir.
    Dim oPages  As Pages
    Dim NoPage  As Long
    Dim oRects  As Rectangles
    Dim NoRect  As Long
    Dim oLines  As Lines
    Dim NoLine  As Long
    
    With ActiveDocument.ActiveWindow.Panes(1)
        Set oPages = .Pages
        With oPages
            For NoPage = 1 To .Count
                Debug.Print "Page " & NoPage & " : ";
                With .Item(NoPage)
                    Set oRects = .Rectangles
                    With oRects
                        For NoRect = 1 To .Count
                            Debug.Print , "Rectangle " & NoRect & " : ";
                            With .Item(NoRect)
                                Select Case .RectangleType
                                    Case WdRectangleType.wdLineBetweenColumnRectangle
                                        Debug.Print "ligne qui sépare des colonnes"
                                    Case WdRectangleType.wdMarkupRectangle
                                        Debug.Print "bulle de commentaires"
                                    Case WdRectangleType.wdMarkupRectangleButton
                                        Debug.Print "indicateur (...) dans bulle de commentaires quand existe texte supplémentaire dans commentaire"
                                    Case WdRectangleType.wdPageBorderRectangle
                                        Debug.Print "bordure de page"
                                    Case WdRectangleType.wdSelection
                                        Debug.Print "espace occupé par un outil de sélection"
                                    Case WdRectangleType.wdShapeRectangle
                                        Debug.Print "espace occupé par une forme"
                                    Case WdRectangleType.wdSystem
                                        Debug.Print "(système) réservé"
                                    Case WdRectangleType.wdTextRectangle
                                        Set oLines = .Lines
                                        With oLines
                                            Debug.Print "espace occupé par du texte : " & .Count & " lignes :"
                                            For NoLine = 1 To .Count
                                                Debug.Print , , "Ligne " & NoLine & " : " & Len(.Item(NoLine).Range.Text) & " caractère(s)"
                                            Next NoLine
                                        End With
                                End Select
                            End With
                        Next NoRect
                    End With
                End With
            Next NoPage
        End With
    End With

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
1
JackleKija Messages postés 8 Date d'inscription lundi 22 août 2011 Statut Membre Dernière intervention 29 septembre 2011 1
27 sept. 2011 à 17:52
Bonjour,

Désolé de répondre aussi tard.

J'ai essayé de recollé les morceaux pour vous donner un code a peu près simple et propre.
Public Function BlankPageSelection()

    For Each C In Selection.Characters
        If (C <> vbCr And C <> vbTab And C <> vbFormFeed And C <> " ") Then
            BlankPageSelection = False
            Exit Function
        End If
    Next
    BlankPageSelection = True
End Function

Public Sub DeleteBlankPage()
    NbPages = ActiveDocument.ActiveWindow.Panes(1).Pages.Count

    For i = 1 To NbPages
        Selection.GoTo wdGoToPage, wdGoToNext, , i
        Selection.GoTo What:=wdGoToBookmark, Name:="\page"
        If BlankPageSelection Then
            Selection.Delete
            i = i - 1
            NbPages = NbPages - 1
        End If
    Next
End Sub
1
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
30 sept. 2011 à 10:59
Attention : Un For-Next n'évalue les limites qu'une seul fois, au premier passage. Si tu modifies NbPages à l'intérieur du For-Next, il n'en tiendra pas compte.
Passe plutôt par un Do-Loop avec un incrément manuel, genre
Do While i <= NbPages
    ...
    i = i + 1
Loop
1
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
14 sept. 2011 à 11:36
Pour te repérer plus facilement, tu peux compléter la ligne :
Debug.Print , , "Ligne " & NoLine & " : " & Len(.Item(NoLine).Range.Text) & " caractère(s) : " & .Item(NoLine).Range.Text
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
16 sept. 2011 à 13:48
Y-a pas de quoi
0
JackleKija Messages postés 8 Date d'inscription lundi 22 août 2011 Statut Membre Dernière intervention 29 septembre 2011 1
16 sept. 2011 à 14:06
Salut,

J'ai trouvé entre temps un code qui me permettait de réaliser ce que je souhaitait mais je vais aussi prendre ton code car il est bien utile et me servira pour la suite de mon développement

Merci beaucoup de ton aide.

A bientot.
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
17 sept. 2011 à 12:58
Ok, merci de ces précisions

Si tu as le temps et comme on est sur un forum où les membres viennent chercher des solutions, pourrais-tu montrer, si ce n'est pas trop long, la solution que tu as adoptée ?
Elle est peut-être moins 'complexe' que celle proposée ici.
Merci d'avance.
0