XL 2016 Macro imprimer des feuilles en PDF

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

  • Classeur1.xlsm
    20.3 KB · Affichages: 5
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

Hasco

XLDnaute Barbatruc
Repose en paix
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

  • Classeur1.xlsm
    21.8 KB · Affichages: 10

Cedr25870

XLDnaute Nouveau
Impeccable!

Merci pour votre réponse rapide.


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
 

Hasco

XLDnaute Barbatruc
Repose en paix
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
 

Hasco

XLDnaute Barbatruc
Repose en paix
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
 

Cedr25870

XLDnaute Nouveau
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
 

Cedr25870

XLDnaute Nouveau
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
 

Discussions similaires

Statistiques des forums

Discussions
315 094
Messages
2 116 157
Membres
112 672
dernier inscrit
djudju