Microsoft 365 Sélectionner un ou plusieurs onglets à exporter au format PDF

  • Initiateur de la discussion Initiateur de la discussion pat66
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pat66

XLDnaute Impliqué
Bonjour le forum,

J'utilise cette macro pour exporter au format PDF, le problème c'est que je dois préciser les feuilles à exporter dans la macro

Est t'il possible de pouvoir choisir la ou les feuilles à exporter avant l'exécution de la macro ?

merci beaucoup
 

Pièces jointes

Bonjour, une idée peut-être

VB:
Public NoPrint As Boolean

Private Sub Print_PDF()

    NoPrint = True
    Application.ScreenUpdating = False

    ' Vérification nom patient
    If Sheets("Etude").Range("D22") = "Nom(s)  et  Prénom(s)" Then
        MsgBox "Vous devez préciser le nom du patient!", vbCritical, "Analyses"
        Exit Sub
    End If

    ' ===============================
    'Choix des feuilles à exporter
    ' ===============================
    Dim Choix As String
    Dim TabFeuilles() As String
    Dim i As Integer
    Dim Sh As Worksheet

    Choix = InputBox("Entrez les noms des feuilles à exporter (séparés par des virgules) :" & vbCrLf & _
                     "Exemple : Feuil1,Feuil2,Feuil3")

    If Choix = "" Then Exit Sub

    TabFeuilles = Split(Choix, ",")

    ' Nettoyage des noms
    For i = LBound(TabFeuilles) To UBound(TabFeuilles)
        TabFeuilles(i) = Trim(TabFeuilles(i))
    Next i

    ' Vérification existence feuilles
    On Error GoTo ErreurFeuille
    Sheets(TabFeuilles).Select
    On Error GoTo 0

    ' ===============================
    'Paramétrage impression
    ' ===============================
    For Each Sh In ActiveWindow.SelectedSheets

        With Sh.PageSetup
            .Zoom = False
            .FitToPagesWide = 1
            .FitToPagesTall = 1

            .LeftMargin = Application.InchesToPoints(0.1)
            .RightMargin = Application.InchesToPoints(0.1)
            .TopMargin = Application.InchesToPoints(1)
            .BottomMargin = Application.InchesToPoints(0.1)

            .Orientation = xlLandscape
        End With

    Next Sh

    ' ===============================
    'Nom du fichier
    ' ===============================
    Dim NFichier As String
    NFichier = Sheets(TabFeuilles(0)).Range("D20") & "-" & _
               Sheets(TabFeuilles(0)).Range("D22") & "-" & _
               Format(Date, "dd-mm-yyyy")

    ' ===============================
    'Export PDF
    ' ===============================
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & NFichier, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=True

    ' Retour sur première feuille
    Sheets(TabFeuilles(0)).Select

    MsgBox "Le PDF a été enregistré !" & vbCrLf & vbCrLf & _
           "Ici ==> " & ThisWorkbook.Path & vbCrLf & vbCrLf & _
           "Sous le nom : " & NFichier & ".pdf", 64, "Analyses"

    Application.ScreenUpdating = True
    NoPrint = False
    Exit Sub

' ===============================
' Gestion erreur
' ===============================
ErreurFeuille:
    MsgBox "Une ou plusieurs feuilles n'existent pas !" & vbCrLf & _
           "Vérifiez les noms saisis.", vbCritical
    Application.ScreenUpdating = True
    NoPrint = False

End Sub

Nicolas
 
Bonjour

et merci pour votre aide

J'ai suivi vos instructions, mais la macro bloque sur :
On Error GoTo ErreurFeuille
Sheets(TabFeuilles).Select
On Error GoTo 0

et pourtant j'ai bien saisi dans l'inputbox : Feuil1

merci encore
 
Excel cherche une feuille qui s’appelle exactement “Feuil1” (nom d’onglet)

A tester par ce code:

VB:
Dim ListeFeuilles As Collection
Set ListeFeuilles = New Collection

Dim NomF As String
Dim Trouve As Boolean

For i = LBound(TabFeuilles) To UBound(TabFeuilles)

    NomF = TabFeuilles(i)
    Trouve = False

    ' Recherche par nom d'onglet
    For Each Sh In ThisWorkbook.Worksheets
        If LCase(Sh.Name) = LCase(NomF) Then
            ListeFeuilles.Add Sh.Name
            Trouve = True
            Exit For
        End If
    Next Sh

    ' Recherche par CodeName
    If Not Trouve Then
        For Each Sh In ThisWorkbook.Worksheets
            If LCase(Sh.CodeName) = LCase(NomF) Then
                ListeFeuilles.Add Sh.Name
                Trouve = True
                Exit For
            End If
        Next Sh
    End If

    If Not Trouve Then
        MsgBox "Feuille introuvable : " & NomF, vbCritical
        Exit Sub
    End If

Next i

' Conversion collection → tableau
Dim TabSelect() As String
ReDim TabSelect(0 To ListeFeuilles.Count - 1)

For i = 1 To ListeFeuilles.Count
    TabSelect(i - 1) = ListeFeuilles(i)
Next i

Sheets(TabSelect).Select
 
Hi,

Est-il possible de pouvoir choisir la ou les feuilles à exporter avant l'exécution de la macro ?
VB:
Private Sub Worksheet_Activate()
    ActiveSheet.ListBox1.Clear
    For Each Feuille In ThisWorkbook.Sheets
        If Feuille.PageSetup.PrintArea <> "" Then ActiveSheet.ListBox1.AddItem Feuille.Name
    Next
End Sub

cf PJ.
 

Pièces jointes

Dernière édition:
Excel cherche une feuille qui s’appelle exactement “Feuil1” (nom d’onglet)

A tester par ce code:

VB:
Dim ListeFeuilles As Collection
Set ListeFeuilles = New Collection

Dim NomF As String
Dim Trouve As Boolean

For i = LBound(TabFeuilles) To UBound(TabFeuilles)

    NomF = TabFeuilles(i)
    Trouve = False

    ' Recherche par nom d'onglet
    For Each Sh In ThisWorkbook.Worksheets
        If LCase(Sh.Name) = LCase(NomF) Then
            ListeFeuilles.Add Sh.Name
            Trouve = True
            Exit For
        End If
    Next Sh

    ' Recherche par CodeName
    If Not Trouve Then
        For Each Sh In ThisWorkbook.Worksheets
            If LCase(Sh.CodeName) = LCase(NomF) Then
                ListeFeuilles.Add Sh.Name
                Trouve = True
                Exit For
            End If
        Next Sh
    End If

    If Not Trouve Then
        MsgBox "Feuille introuvable : " & NomF, vbCritical
        Exit Sub
    End If

Next i

' Conversion collection → tableau
Dim TabSelect() As String
ReDim TabSelect(0 To ListeFeuilles.Count - 1)

For i = 1 To ListeFeuilles.Count
    TabSelect(i - 1) = ListeFeuilles(i)
Next i

Sheets(TabSelect).Select
REe,
effectivement il fallait que je précise le ou les noms d'onglets
Bonjour, une idée peut-être

VB:
Public NoPrint As Boolean

Private Sub Print_PDF()

    NoPrint = True
    Application.ScreenUpdating = False

    ' Vérification nom patient
    If Sheets("Etude").Range("D22") = "Nom(s)  et  Prénom(s)" Then
        MsgBox "Vous devez préciser le nom du patient!", vbCritical, "Analyses"
        Exit Sub
    End If

    ' ===============================
    'Choix des feuilles à exporter
    ' ===============================
    Dim Choix As String
    Dim TabFeuilles() As String
    Dim i As Integer
    Dim Sh As Worksheet

    Choix = InputBox("Entrez les noms des feuilles à exporter (séparés par des virgules) :" & vbCrLf & _
                     "Exemple : Feuil1,Feuil2,Feuil3")

    If Choix = "" Then Exit Sub

    TabFeuilles = Split(Choix, ",")

    ' Nettoyage des noms
    For i = LBound(TabFeuilles) To UBound(TabFeuilles)
        TabFeuilles(i) = Trim(TabFeuilles(i))
    Next i

    ' Vérification existence feuilles
    On Error GoTo ErreurFeuille
    Sheets(TabFeuilles).Select
    On Error GoTo 0

    ' ===============================
    'Paramétrage impression
    ' ===============================
    For Each Sh In ActiveWindow.SelectedSheets

        With Sh.PageSetup
            .Zoom = False
            .FitToPagesWide = 1
            .FitToPagesTall = 1

            .LeftMargin = Application.InchesToPoints(0.1)
            .RightMargin = Application.InchesToPoints(0.1)
            .TopMargin = Application.InchesToPoints(1)
            .BottomMargin = Application.InchesToPoints(0.1)

            .Orientation = xlLandscape
        End With

    Next Sh

    ' ===============================
    'Nom du fichier
    ' ===============================
    Dim NFichier As String
    NFichier = Sheets(TabFeuilles(0)).Range("D20") & "-" & _
               Sheets(TabFeuilles(0)).Range("D22") & "-" & _
               Format(Date, "dd-mm-yyyy")

    ' ===============================
    'Export PDF
    ' ===============================
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & NFichier, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=True

    ' Retour sur première feuille
    Sheets(TabFeuilles(0)).Select

    MsgBox "Le PDF a été enregistré !" & vbCrLf & vbCrLf & _
           "Ici ==> " & ThisWorkbook.Path & vbCrLf & vbCrLf & _
           "Sous le nom : " & NFichier & ".pdf", 64, "Analyses"

    Application.ScreenUpdating = True
    NoPrint = False
    Exit Sub

' ===============================
' Gestion erreur
' ===============================
ErreurFeuille:
    MsgBox "Une ou plusieurs feuilles n'existent pas !" & vbCrLf & _
           "Vérifiez les noms saisis.", vbCritical
    Application.ScreenUpdating = True
    NoPrint = False

End Sub

Nicolas
Re,

effectivement je n'avais pas saisit le nom de l'onglet, maintenant la macro fonctionne parfaitement et je vous en remercie
Maintenant je vais essayer de l'adapter à celle de mon classeur post# 1 avec notamment la prise en compte des zones à imprimer car
elles sont différentes

Concernant le post "#4, je ne sais comment l'utiliser, mais merci quand même

merci beaucoup
 
Dernière édition:
Si cela peut aider :
 
Bonjour le forum,
Bonjour le fil,

et merci de m'aider à résoudre mon problème, j'ai testé toutes vos propositions et vous répond en détail

Toofatboy, votre solution exporte bien en PDF, mais j'ai beau cocher la ou les pages à imprimer, les 3 pages sont systématiquement imprimées, je dois faire une erreur quelque part ?

J'ai aussi testé la solution de fanch55 qui fonctionne très bien, mais comme celle de Nicolas post #2, les macros ne tiennent pas compte des plages à imprimer car comme indiqué dans le classeur ci-joint (idem post#1), elles sont différentes pour chaque onglets, c'est important pour le cadrage au format PDF, j'ai bien essayé de définir la zone à imprimer, mais cela ne sert à rien

Je trouve l'idée de l' Inputbox pour choisir la ou les feuilles à imprimer, très facile à utiliser, mais je ne sais ni écrire ni adapter ma macro
Pourriez vous m'aider à insérer dans mon code cette possibilité ?

Merci d'avance
 

Pièces jointes

Toofatboy, votre solution exporte bien en PDF, mais j'ai beau cocher la ou les pages à imprimer, les 3 pages sont systématiquement imprimées, je dois faire une erreur quelque part ?
Ce que j'ai proposé n'exporte rien du tout. Ça se contente de faire ce qui est demandé en #1, c'est-à-dire permettre de sélectionner les feuilles désirées.
Ensuite tu lances ta macro d'impression en PDF pour chacune des feuilles sélectionnées.

En résumé : ça t'affiche la liste (à sélection multiple) des feuilles dont la zone d'impression est définie, et il faut ensuite que tu crées un bouton pour lancer une macro qui va "scanner" la liste pour n'appeler ta macro d'exportation en PDF que pour les feuilles sélectionnées.
 
Dernière édition:
J'ai aussi testé la solution de fanch55 qui fonctionne très bien, mais comme celle de Nicolas post #2, les macros ne tiennent pas compte des plages à imprimer car comme indiqué dans le classeur ci-joint (idem post#1), elles sont différentes pour chaque onglets, c'est important pour le cadrage au format PDF, j'ai bien essayé de définir la zone à imprimer, mais cela ne sert à rien
Le code ci-dessous tient compte des zones d'impression :
VB:
Option Explicit
Private Sub CommandButton2_Click()
Dim PrintDlg        As DialogSheet
Dim CurrentSheet    As Worksheet
Dim Sh              As Worksheet
Dim Cb              As CheckBox
Dim Sel_Sheets      As String
Dim FileName        As Variant
Dim TopPos          As Integer

Application.ScreenUpdating = False

    ' Check for protected workbook
    If ActiveWorkbook.ProtectStructure Then
        MsgBox "Le classeur est protégé.", vbCritical
        Exit Sub
    End If

    ' Add a temporary dialog sheet
    Set CurrentSheet = ActiveSheet
    Set PrintDlg = ActiveWorkbook.DialogSheets.Add

    ' Add the checkboxes
    TopPos = PrintDlg.Buttons(1).Top
    For Each Sh In ActiveWorkbook.Worksheets
        ' Skip hidden sheets
        If Sh.Visible Then
           PrintDlg.CheckBoxes.Add(78, TopPos, 100, 16.5).Text = Sh.Name
           TopPos = TopPos + 13
        End If
    Next
    
    ' Move the OK and Cancel buttons
    PrintDlg.Buttons.Left = PrintDlg.CheckBoxes(1).Left + PrintDlg.CheckBoxes(1).Width
    
    ' Set dialog height, width, and caption
    With PrintDlg.DialogFrame
        .Height = Application.Max(68, PrintDlg.DialogFrame.Top + TopPos - 34)
        .Width = PrintDlg.Buttons(1).Left ' <-- bizarre mais fonctionne
        .Caption = "Cochez les feuilles à publier"
    End With
    
    ' Set focus on Cancel
    PrintDlg.Buttons(1).BringToFront
    
    ' Display the dialog box
    CurrentSheet.Activate
    Application.ScreenUpdating = True
        If PrintDlg.Show Then
            For Each Cb In PrintDlg.CheckBoxes
                If Cb.Value = xlOn Then Sel_Sheets = Trim(Sel_Sheets & " " & Cb.Caption)
            Next Cb
            If Sel_Sheets <> vbNullString Then
               ' Display the dialog box to obtain filename
                FileName = Application.GetSaveAsFilename( _
                    FileFilter:="Publication (*.pdf),*.pdf", _
                    InitialFileName:=ThisWorkbook.Path)
                If Not FileName = False Then
                    ' Select sheets to export
                    Sheets(Split(Sel_Sheets)).Select
                    ' Publication
                    ActiveSheet.ExportAsFixedFormat _
                        Type:=xlTypePDF, OpenAfterPublish:=True, _
                        IgnorePrintAreas:=False, _
                        FileName:=FileName
                End If
            End If
        End If

    ' Delete temporary dialog sheet (without a warning)
    Application.DisplayAlerts = False
    PrintDlg.Delete

' Reactivate original sheet
CurrentSheet.Activate
Set CurrentSheet = Nothing
Set PrintDlg = Nothing

End Sub
 
Ce que j'ai proposé n'exporte rien du tout. Ça se contente de faire ce qui est demandé en #1, c'est-à-dire permettre de sélectionner les feuilles désirées.
Ensuite tu lances ta macro d'impression en PDF pour chacune des feuilles sélectionnées.

En résumé : ça t'affiche la liste (à sélection multiple) des feuilles dont la zone d'impression est définie, et il faut ensuite que tu crées un bouton pour lancer une macro qui va "scanner" la liste pour n'appeler ta macro d'exportation en PDF que pour les feuilles sélectionnées.
Comme tu t'en es rendu compte mes connaissances sont très limitées et je viens enfin de comprendre grâce à tes précisions,

En fait tu as conservé la macro en #1 et tu as ajouté la possibilité, à l'aide d'une listbox, de choisir la ou les feuilles à imprimer après avoir défini la zone d'impression, c'est génial !!!! c'est exactement ce dont je souhaitais, je n'ai plus personnaliser l'apparence de la Lisbox et le tour est joué !

Mille merci pour ton aide !
 
Bonsoir le fil,

Je vous remercie pour votre aide car toutes vos solutions fonctionnent et je suis sur que cela va aider d'autres personnes, mais pour résoudre ce problème, je vais opter pour la solution de TooFatBoy qui me permet de conserver ma macro avec la possibilité de sélectionner la ou les feuilles que je souhaite imprimer comme évoqué en post #1

Bonne soirée à tous

Cdt
 
pourriez me dire ou placer la fonction ".Orientation = xlLandscape"
Definissez l'orientation au préalable pour chaque feuille comme vous définissez les zones d'impressions
1774026407018.png
 
Comme tu t'en es rendu compte mes connaissances sont très limitées et je viens enfin de comprendre grâce à tes précisions,
Oui, je viens de le comprendre.


En fait tu as conservé la macro en #1 et tu as ajouté la possibilité, à l'aide d'une listbox, de choisir la ou les feuilles à imprimer après avoir défini la zone d'impression, c'est génial !!!! c'est exactement ce dont je souhaitais,
Pour être précis, j'ai seulement ajouté une feuille "Imprimer" contenant la liste des feuilles du classeur qui ont une zone d'impression déjà définie..
Ladite liste se met à jour quand on sélectionne la feuille "Imprimer".

Ensuite, si tu veux exporter les feuilles sélectionnées, il faut créer une macro qui va scanner la liste et appeler, pour chaque feuille sélectionnée, la macro d'exportation.

Je ne suis pas très doué en VBA, mais si tu n'arrives pas à terminer le travail, je peux tout de même tenter de te pondre un bout de code VBA pour ça.

je n'ai plus personnaliser l'apparence de la Lisbox et le tour est joué !
Oui, il faut personnaliser le look de la ListBox, parce que j'avais mis des couleurs un peu pourries... 😅
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour