VBA - Impression PDF de plusieurs feuilles
Bonjour à tous,
Je sollicite votre aide pour réaliser un code VBA permettant d'imprimer plusieurs feuilles d'un classeur Excel sous un même PDF (ce que j'ai réussi à faire avec le code ci-dessous) mais j'aimerais que lors de l' "enregistrement sous", le nom du fichier soit pré-rempli avec certaines informations présentes dans plusieurs cellules situées dans une feuille qui n'est pas à imprimer (feuille d'encodage de données).
Si c'est possible, j'aimerais pousser le vice jusqu'à n'imprimer que les feuilles où des informations sont remplies.
Pour comprendre, j'ai réalisé une feuille d'encodage générale à partir de laquelle les informations renseignées sont directement remplies pour une feuille spécifique. Seulement il est possible qu'il n'y ait pas besoin de l'ensemble des feuilles lors de l'impression, serait-il possible de renseigner un choix lors de l'impression, "imprimer de la pagex à la page y", sans avoir à devoir supprimer par la suite des feuilles dans le PDF généré ?
Voici le code fonctionnel qui me permet d'imprimer en PDF l'ensemble des feuilles mais sans un nom de fichier pré-rempli :
Sheets(Array("Élève 1", "Élève 2", "Élève 3", "Élève 4", "Élève 5", "Élève 6", _
"Élève 7", "Élève 8", "Élève 9", "Élève 10", "Élève 11", "Élève 12", "Élève 13", _
"Élève 14", "Élève 15", "Élève 16", "Élève 17", "Élève 18", "Élève 19", "Élève 20", _
"Élève 21", "Élève 22", "Élève 23", "Élève 24", "Élève 25", "Élève 26", "Élève 27", "Élève 28", "Élève 29", "Élève 30")).Select _
Replace:=False
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=FalseD'avance merci !
Edit modo : ajouté balises de code. pensez à cliquez sur l'icone </> et coller le code dans la fenêtre lorsque vous mettez un code dans votre message
Bonjour,
Quelle cellule sur une feuille permettrait de détecter que la feuille est à imprimer. (exemple la cellule A1 contient une valeur). Sur base de cette information on pourrait concevoir une macro qui teste la présence de cette info et sélectionne l'onglet pour impression PDF.
En cas de remplissage de la cellule D2, la feuille serait effectivement à imprimer et si elle reste vierge, pas besoin de celle-ci lors de l'impression.
bonjour,
une proposition
Sub aargh()
Dim n&, ws As Worksheet
ReDim ar(1 To Worksheets.Count)
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "Élève*" Then 'sélectionne les feuilles dont le nom commence par Élève
If ws.Range("D2").Value <> "" Then 'sélectionne celles qui ont une valeur en D2
n = n + 1
ar(n) = ws.Name
End If
End If
Next ws
ReDim Preserve ar(1 To n)
Sheets(ar).PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
End SubLe code fonctionne comme le mien d'origine, c'est à dire qu'il continue à imprimer l'ensemble des feuilles comprenant "Élève" dans son intitulé.
Le contenu de la cellule D2 de chaque feuille "Élève" sera en fait le nom et prénom de celui-ci, et est renvoyé à partir de la feuille "DONNÉES".
Aurais-tu des idées de piste d'amélioration ?
Et des idées concernant l'automatisation du nom du fichier PDF selon certaines cellules de la feuille "DONNÉES" ?
J'aimerais que le fichier ait pour nom : Bulletin_Nomécole_Classe_Annéescolairexxxx
Le nom de l'école est renseigné dans la cellule C1 de la feuille "DONNÉES"
La classe est renseignée dans la cellule C2 de la feuille "DONNÉES"
L'année scolaire est renseignée dans la cellule I2 de la feuille "DONNÉES"
bonjour,
Le code fonctionne comme le mien d'origine, c'est à dire qu'il continue à imprimer l'ensemble des feuilles comprenant "Élève" dans son intitulé.
Le code est prévu pour exclure les feuilles qui ont une cellule D2 vide. Si ces feuilles sont malgré tout imprimées, c'est que cette cellule n'est pas vide.( un espace est un caractère <> vide).
Pour le reste, merci de mettre un fichier exemple anonymisé représentatif de ton classeur.
Voici le fichier comme demandé !
Pour en revenir à la cellule D2, est-ce que celle-ci est considérée vide si une référence y est faire "=DONNÉES!B9" par exemple ? Voilà peut être l'origine du problème ..
rebonjour,
une version adaptée
Sub aargh()
Dim n&, ws As Worksheet, repertoire$, nf$
ReDim ar(1 To Worksheets.Count)
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "Élève*" Then 'sélectionne les feuilles dont le nom commence par Élève
If Len(ws.Range("D2").Text) <> 0 Then 'sélectionne celles qui ont une valeur en D2
n = n + 1
ar(n) = ws.Name
End If
End If
Next ws
With Sheets("données")
repertoire = "d:\downloads\" '<- à adapter
nf = repertoire & "Bulletin-" & .Range("C1") & "-" & .Range("C2") & "-Année scolaire" & .Range("i2") & ".pdf"
End With
ReDim Preserve ar(1 To n)
Sheets(ar).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=nf, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End SubBonjour,
Une "erreur d'exécution '9' : L'indice n'appartient pas à la sélection" apparait lors du lancement de la macro.
Le débogage met en avant cette ligne en particulier :
ReDim Preserve ar(1 To n)Edit : le code fonctionne pour le fichier anonyme mais n'enregistre pas le pdf généré et ne l'affiche pas, j'ai donc accepté l'ouverture après publication et constate que seules les pages remplies sont imprimées.
Cependant en insérant le code fourni et adapté dans mon fichier "officiel", j'obtiens l'erreur mise en avant ci-dessus.
bonjour,
Une "erreur d'exécution '9' : L'indice n'appartient pas à la sélection" apparait lors du lancement de la macro.
la macro fait l'hypothèse qu'il y a au moins une feuille à imprimer. Tu reçois ce message car il n'y a pas de feuille sélectionnée. Vérifie que D2 contient bien quelque chose, vérifie que le nom des feuilles commence bien par "Élève"
adaptation du code pour gérer le cas où il n'y aurait pas de feuille sélectionnée.
Sub aargh()
Dim n&, ws As Worksheet, repertoire$, nf$
ReDim ar(1 To Worksheets.Count)
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "Élève*" Then 'sélectionne les feuilles dont le nom commence par Élève
If Len(ws.Range("D2").Text) <> 0 Then 'sélectionne celles qui ont une valeur en D2
n = n + 1
ar(n) = ws.Name
End If
End If
Next ws
With Sheets("données")
repertoire = "d:\downloads\" '<- à adapter
nf = repertoire & "Bulletin-" & .Range("C1") & "-" & .Range("C2") & "-Année scolaire" & .Range("i2") & ".pdf"
End With
if n=0 then msgbox "pas de feuille à imprimer": exit sub
ReDim Preserve ar(1 To n)
Sheets(ar).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=nf, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False 'remplacer false par true pour visualisation à l'écran
End Suble code fonctionne pour le fichier anonyme mais n'enregistre pas le pdf généré et ne l'affiche pas,
le fichier se trouve dans le répertoire que tu as indiqué ici :
repertoire = "d:\downloads\" '<- à adapterUn très grand merci, cela fonctionne magnifiquement bien !
Je vous suis très reconnaissant !