Créer des plages nommées dynamiques format A4

Anthonymctm

XLDnaute Occasionnel
Bon à tous,

Question toute simple qui me permettrait peut-être d'avancer sur mon problème https://www.excel-downloads.com/threads/mise-en-page-export-excel-sur-word.20033832/

Comment définir des plages nommées en fonction des sauts de page de l'onglet ?

OU

Comment définir des plages nommées/zones d'impression d'un format d'une page A4 ?

Mon but étant ensuite d'utiliser ces plages dans une macro pour en faire un export sur Word.

Je vous ai mis un fichier proche du fichier sur lequel je dois réaliser ça, vous verrez que le nombre de lignes peut varier, c'est pour ça que j'ai besoin de rendre les plages nommées dynamiques.
 

Pièces jointes

  • Test XL-WD.xlsm
    479.7 KB · Affichages: 8

Anthonymctm

XLDnaute Occasionnel
Exacte ! Et ça fait deux semaines que je cherche à trouver une solution sans succès o_O

Après les réponses concernent surtout mon problème de base en essayant de me convaincre qu'utiliser Word c'est pas bien..

Là ma question c'est juste pour ajuster une plage nommée :confused:
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

un essai :
VB:
Sub nommerPages()
    Dim HPB As HPageBreak, numP As Long, nom As String
    Dim pl As Range, lig As Long, col1 As Long, nbCol As Long, derlig As Long
    ActiveWindow.View = xlPageBreakPreview
    With ActiveSheet
        Set pl = Range(.PageSetup.PrintArea)
        col1 = pl.Column: nbCol = pl.Columns.Count: derlig = pl.Row + pl.Rows.Count - 1
        lig = pl.Row
        For Each HPB In .HPageBreaks
            numP = numP + 1
            Set pl = .Cells(lig, col1).Resize(HPB.Location.Row - lig, nbCol)
            nom = "page_" & Format(numP, "00")
            pl.Name = nom
            lig = HPB.Location.Row
        Next HPB
        If lig < derlig Then
            numP = numP + 1
            Set pl = .Cells(lig, col1).Resize(derlig - lig + 1, nbCol)
            pl.Select
            nom = "page_" & Format(numP, "00")
            pl.Name = nom
        End If
    End With
End Sub
J'ai été au plus simple, en considérant qu'il n'y avait pas de saut de page verticaux comme sur ton fichier.
Sans garantie car je sais que la gestion des sauts de page présente des bugs impossibles à passer selon les versions.
Sur 2010 c'est passé...
eric
 

Anthonymctm

XLDnaute Occasionnel
J'ai été au plus simple
:eek: Salut Eric,

Super, continu d'aller au plus simple ! Ca marche du feu de dieux !

Est-ce qu'on peut rajouter une purge des plages déjà crées ?

Les plages existantes déjà crées sont bien modifiées, mais les plages crées qui concernent des pages supprimées par la suite ne sont pas supprimées.
(un peu galère à expliquer :oops:)

Est-il possible de répéter l'opération sur les autres onglets ? Et du coup de ne pas perdre les plages de l'onglet précédent

Merci beaucoup !
 

eriiic

XLDnaute Barbatruc
Bonjour,

Avec des noms de portée feuille.
J'ai préféré séparer la suppression de la création. Tu peux faire le ménage quand tu veux.
Ajouté aussi un contrôle si zone d'impression crée. Aucun nom créé si absente :
VB:
Sub test()
    suppNomsPage "En_tête"
    nommerPages "En_tête"
End Sub

Sub nommerPages(nomF As String)
    Dim HPB As HPageBreak, numP As Long, nom As String
    Dim pl As Range, lig As Long, col1 As Long, nbCol As Long, derlig As Long
    ActiveWindow.View = xlPageBreakPreview
    With Sheets(nomF)
        On Error GoTo fin
        Set pl = Range(.PageSetup.PrintArea)
        On Error GoTo 0
        col1 = pl.Column: nbCol = pl.Columns.Count: derlig = pl.Row + pl.Rows.Count - 1
        lig = pl.Row
        For Each HPB In .HPageBreaks
            numP = numP + 1
            Set pl = .Cells(lig, col1).Resize(HPB.Location.Row - lig, nbCol)
            nom = nomF & "!page_" & Format(numP, "00")
            pl.Name = nom
            lig = HPB.Location.Row
        Next HPB
        If lig < derlig Then
            numP = numP + 1
            Set pl = .Cells(lig, col1).Resize(derlig - lig + 1, nbCol)
            nom = nomF & "!page_" & Format(numP, "00")
            pl.Name = nom
        End If
    End With
fin:
End Sub

Sub suppNomsPage(nomF As String)
    Dim nom As Name
    For Each nom In ActiveWorkbook.Names
        If Left(nom.Name, Len(nomF) + 6) = nomF & "!page_" Then nom.Delete
    Next nom
End Sub
attention que maintenant tu vas avoir plusieurs fois le même nom.
Toujours spécifier le nom de la feuille dans le nom utilisé.
Ex :
VB:
Debug.Print [Descriptif!page_02].Address
Debug.Print Sheets("Descriptif").[page_02].Address
eric

PS : à mettre dans un module standard !
PS2 : j'ai mis ActiveWorkbook, tu peux préférer ThisWorkbook...
 
Dernière édition:

Anthonymctm

XLDnaute Occasionnel
J'ai rajouté
VB:
Sub test()
    suppNomsPage "En_tête"
    nommerPages "En_tête"
     suppNomsPage "Descriptif"
    nommerPages "Descriptif"
     suppNomsPage "Carac_tech"
    nommerPages "Carac_tech"
End Sub

C'était de ça dont tu parlais ? La les plages se font sur tous les onglets en effet, et les plages porte le même nom. Je commence à comprendre.

attention que maintenant tu vas avoir plusieurs fois le même nom.
Toujours spécifier le nom de la feuille dans le nom utilisé.
Ex :
VB:
Debug.Print [Descriptif!page_02].Address
Debug.Print Sheets("Descriptif").[page_02].Address

Ca par contre je ne comprend pas.
En fait c'est un exemple d'utilisation ? Si je veux utiliser le nom page_02, il faut bien que je précise Sheets("Descriptif").
C'est ça ?

Merci encore, ça va me permettre d'avancer ! ;)
 

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 184
Membres
112 678
dernier inscrit
arno12345678