Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Macro imprimer des feuilles en PDF

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 !

Cedr25870

XLDnaute Nouveau
Bonjour à tous,

Je suis en train de travailler sur un fichier qui comportera plusieurs feuilles.
Je veux donc pouvoir créer une macro pour sélectionner les feuilles que je veux imprimer au format PDF.

Actuellement j'ai un userform qui va me récupérer toutes les feuilles non masqué.
Dans cette liste, je peux sélectionner 1,2,3 etc feuilles en fonction de mon besoin.
Les noms des feuilles sélectionnées s'enregistrent sous une chaine de caractère dans la cellule C1 qui est transformé en C2 puis C3 pour le moment pour enlever certaines valeurs avant et après.

Jusque là tout fonctionne bien.
Ma macro bug au moment ou je veux utiliser cette chaine de caractère pour sélectionner les feuilles.

Merci de votre aide.

Cédric
 

Pièces jointes

Solution
Bonjour,

Voici une solution possible. Mettre les noms de feuilles sélectionnées dans un tableau.
VB:
Private Sub IMPRIM_PDF_Click()
    Dim I As Integer, cpt As Integer
    Dim FEUIL() As String ' Tableau pour les feuilles sélectionnées
    '

    Sheets("Feuil1").Range("C1").Select
    Selection.ClearContents
    With Me.ListBox1
        For I = 0 To .ListCount - 1
            If .Selected(I) = True Then
                cpt = cpt + 1
                ReDim Preserve FEUIL(1 To cpt)
                FEUIL(cpt) = .List(I)
            End If
        Next I
    End With

    If cpt > 0 Then
        MsgBox Join(FEUIL, ";")

        Worksheets(FEUIL).Select
    End If
    Unload Me
End Sub


Cordialement
Bonjour,

Voici une solution possible. Mettre les noms de feuilles sélectionnées dans un tableau.
VB:
Private Sub IMPRIM_PDF_Click()
    Dim I As Integer, cpt As Integer
    Dim FEUIL() As String ' Tableau pour les feuilles sélectionnées
    '

    Sheets("Feuil1").Range("C1").Select
    Selection.ClearContents
    With Me.ListBox1
        For I = 0 To .ListCount - 1
            If .Selected(I) = True Then
                cpt = cpt + 1
                ReDim Preserve FEUIL(1 To cpt)
                FEUIL(cpt) = .List(I)
            End If
        Next I
    End With

    If cpt > 0 Then
        MsgBox Join(FEUIL, ";")

        Worksheets(FEUIL).Select
    End If
    Unload Me
End Sub


Cordialement
 

Pièces jointes

Impeccable!

Merci pour votre réponse rapide.


 
Re,

Au passage, je me suis demandé pourquoi vous parcouriez 2 fois la collection des feuilles du classeur au moyen de deux variables différentes dans la procédure initialize de votre userform.

De plus tant qu'à déclarer une variable objet autant la déclarer avec son type particulier plutôt que le type générique 'object'.

En la déclarant avec son type particulier, vous aurez en plus accès à ces propriétés et méthodes en tapant le . après son nom lorsque vous écrirez votre code.

Cordialement
 
J'ai récupéré un bout de code et comme je ne suis pas vraiment un spécialiste, il a effectivement des choses qui me dépassent un peu voir beaucoup.
Si vous pouvez m'orienter sur cette simplification, je suis preneur.

Cordialement
 
re,

Donc voici ce que pourrait être votre procédure d'initialisation :
VB:
Private Sub UserForm_Initialize()    'à l'initialisation de l'UserForm
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        ws.Visible = True
        Me.ListBox1.AddItem ws.Name
    Next ws
End Sub

Cette procédure suppose que vous avez des feuilles cachées.
Vous n'êtes pas obligé de les rendre visible dès l'initialisation.
Par contre vous pouvez le faire au moment de leur sélection.

Ce qui donnerait pour vos deux procédures :
VB:
Private Sub IMPRIM_PDF_Click()
    Dim I As Integer
    Dim cpt As Integer 'variable de comptage des feuilles sélectionnées
    Dim FEUIL() As String ' Tableau pour les feuilles sélectionnées
    With Me.ListBox1
        For I = 0 To .ListCount - 1
            If .Selected(I) = True Then
                cpt = cpt + 1
                ReDim Preserve FEUIL(1 To cpt)
                FEUIL(cpt) = .List(I)
            End If
        Next I
    End With

    If cpt > 0 Then
        '
        ' Rendre visible les feuille à sélectionner
        For I = 1 To cpt
            ThisWorkbook.Sheets(FEUIL(I)).Visible = xlSheetVisible
        Next
        MsgBox Join(FEUIL, ";")
        Worksheets(FEUIL).Select
    End If
    Unload Me
End Sub

Private Sub UserForm_Initialize()    'à l'initialisation de l'UserForm
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        Me.ListBox1.AddItem ws.Name
    Next ws
End Sub

Cordialement
 
Avec votre solution, le macro va chercher les feuilles du fichier ou est la macro.
Dans mon cas, ma macro est intégré dans un fichier XLAM de mon bandeau personnalisé.
Du coup, la macro doit aller chercher les feuilles du fichier en cours.

Au final, j'ai supprimé la boucle des feuilles cachées qui ne sert a rien car je ne veux que les feuilles visibles du classeur en cours.

VB:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim O As Object 'déclare la variable O (Onglets)

For Each O In Sheets 'boucle sur tous les onglets du classeur
    If O.Visible = True Then Me.ListBox1.AddItem O.Name 'si l'onglet est visible, ajoute le nom de l'onglet à la ListBox1
Next O 'prochain onglet de la boucle
End Sub

Cordialement
 
Salut, à voir ici, si curieux.

Étant définitivement fâché avec le Belge et ses mignons de couchette de Developpez.com, j'ai supprimé l'ensemble des téléchargements ( 110 au bas mot ), d'où les liens internes de téléchargement caduques. Ces téléchargements sont toujours disponibles sur mon PC, si quelqu'un en fait la demande.
 
Bonjour
Sur le modèle de votre code celà donne ceci (Suppression de thisworsheets par worksheets et çà fonctionne.

Encore merci pour votre aide



VB:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
    Dim ws As Worksheet

    For Each ws In Worksheets
        ws.Visible = True
        Me.ListBox1.AddItem ws.Name
    Next ws

End Sub
 
- 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

Réponses
7
Affichages
3 K
Réponses
7
Affichages
2 K
Réponses
1
Affichages
1 K
Compte Supprimé 979
C
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…