Cet article met en lumière l’efficacité de Microsoft Excel lorsqu'il est bien utilisé. Pour ceux qui souhaitent approfondir leurs compétences, des experts Excel, comme ceux de https://trefle-applications.groupetr...experts-excel/, offrent des conseils précieux pour optimiser l’utilisation de cet outil. La gestion de l'impression ou de l'exportation de plusieurs feuilles au format PDF peut devenir complexe, surtout lorsqu'il faut respecter un ordre précis. L’utilisation du langage VBA et de la fonction CopySheets pour automatiser ce processus est une solution idéale.
Envoyé par curt Bonsoir Philippe, content de lire un nouveau billet ou plus exactement la mise à jour d'un précédent.... Tu ne lâches rien. Bravo et merci Curt Bonjour Curt, Merci pour ton message
Bonsoir Philippe, content de lire un nouveau billet ou plus exactement la mise à jour d'un précédent.... Tu ne lâches rien. Bravo et merci Curt
Envoyé par laurent_ott Bonjour, Une autre approche est de déplacer les feuilles désirées, masquer les autres, imprimer ou exporter en PDF, puis restituer l'ordre d'origine des feuilles et leur visibilité. Exemple d'utilisation de la fonction ci-dessous pour exporter en PDF les feuilles "Menu", "TCD", "Graph", "Sources" en PDF puis ouvrir la visionneuse. Ou pour les imprimer : Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586'------------------------------------------------------------------------------------------------ Function ImprimerFeuilles(ByVal Feuilles As Variant, Fichier As String, Afficher As Boolean) As Boolean '------------------------------------------------------------------------------------------------ ' Imprime les feuilles (même masquées) passées dans l'argument Feuilles (dans l'ordre désiré d'impression) soit sur ' l'imprimante par défaut, soit en fichier PDF. '------------------------------------------------------------------------------------------------ ' Feuille : la liste des feuilles concernées au format Array si plusieurs feuilles. ' Fichier : le fichier PDF à générer (ou vide pour une impression sur l'imprimante par défaut). ' Afficher : True pour voir le fichier PDF généré, ou l'aperçu avant impression. '------------------------------------------------------------------------------------------------ ' Renvoie : True si tout s'est bien passé, False dans le cas contraire. '------------------------------------------------------------------------------------------------ ' Exemple d'appels : ' Call ImprimerFeuilles(Array("Feuil1", "Feuil6"), "C:\Users\ott_l\Downloads\Classeur1.pdf", False) ' Call ImprimerFeuilles("Feuil1", "", True) '------------------------------------------------------------------------------------------------ Dim OrdreOrigine() Dim VisibleOrigine() Dim AncActive As String Dim i As Integer Dim Rep ' Initialisation des variables: ReDim OrdreOrigine(1 To Sheets.Count) ReDim VisibleOrigine(1 To Sheets.Count) AncActive = ActiveSheet.Name ' Gestion des erreurs: On Error GoTo Gest_Err Err.Clear ' Mémorise le nom des feuilles du classeur, leur ordre et leur état visible: For Each sh In Sheets i = i + 1 OrdreOrigine(i) = sh.Name VisibleOrigine(i) = sh.Visible Next sh ' Force le mode Array si une seule feuille est passée en argument: If IsArray(Feuilles) = False Then Feuilles = Array(Feuilles) ' Déplace les feuilles à imprimer dans l'ordre désiré: For i = UBound(Feuilles) To LBound(Feuilles) Step -1 Sheets(Feuilles(i)).Visible = True Sheets(Feuilles(i)).Move Before:=Sheets(1) Next i ' Si aucun fichier n'est indiqué alors imprime les feuilles désirées sinon les exporte en PDF: Select Case Fichier ' Sélectionne les feuilles désirées pour les imprimer: Case "" Sheets(Feuilles).Select ActiveWindow.SelectedSheets.PrintOut Preview:=Afficher ' Masque les autres feuilles du classeur pour ne pas les exporter en PDF: Case Else For i = 1 To Sheets.Count Rep = Filter(Feuilles, OrdreOrigine(i), True, vbTextCompare) If UBound(Rep) = -1 Then Sheets(OrdreOrigine(i)).Visible = False Next i ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fichier, OpenAfterPublish:=Afficher End Select ' Renvoie Vrai: ImprimerFeuilles = True ' Gestion des erreurs: Gest_Err: ' Restaure la situation d'origine: For i = 1 To Sheets.Count: Sheets(i).Visible = True: Next i For i = UBound(OrdreOrigine) To LBound(OrdreOrigine) Step -1 Sheets(OrdreOrigine(i)).Visible = VisibleOrigine(i) Sheets(OrdreOrigine(i)).Move Before:=Sheets(1) Next i Sheets(AncActive).Activate ' Affiche le message d'erreur: If Err.Number <> 0 Then MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description, vbExclamation, ThisWorkbook.Name Err.Clear End If End Function Cordialement. Bonjour Laurent, Désolé de répondre si tard à ton commentaire, je le découvre à l'instant. Je trouve cette approche trop lourde et risquée si pour une raison quelconque, il y avait une interruption de la procédure
'------------------------------------------------------------------------------------------------ Function ImprimerFeuilles(ByVal Feuilles As Variant, Fichier As String, Afficher As Boolean) As Boolean '------------------------------------------------------------------------------------------------ ' Imprime les feuilles (même masquées) passées dans l'argument Feuilles (dans l'ordre désiré d'impression) soit sur ' l'imprimante par défaut, soit en fichier PDF. '------------------------------------------------------------------------------------------------ ' Feuille : la liste des feuilles concernées au format Array si plusieurs feuilles. ' Fichier : le fichier PDF à générer (ou vide pour une impression sur l'imprimante par défaut). ' Afficher : True pour voir le fichier PDF généré, ou l'aperçu avant impression. '------------------------------------------------------------------------------------------------ ' Renvoie : True si tout s'est bien passé, False dans le cas contraire. '------------------------------------------------------------------------------------------------ ' Exemple d'appels : ' Call ImprimerFeuilles(Array("Feuil1", "Feuil6"), "C:\Users\ott_l\Downloads\Classeur1.pdf", False) ' Call ImprimerFeuilles("Feuil1", "", True) '------------------------------------------------------------------------------------------------ Dim OrdreOrigine() Dim VisibleOrigine() Dim AncActive As String Dim i As Integer Dim Rep ' Initialisation des variables: ReDim OrdreOrigine(1 To Sheets.Count) ReDim VisibleOrigine(1 To Sheets.Count) AncActive = ActiveSheet.Name ' Gestion des erreurs: On Error GoTo Gest_Err Err.Clear ' Mémorise le nom des feuilles du classeur, leur ordre et leur état visible: For Each sh In Sheets i = i + 1 OrdreOrigine(i) = sh.Name VisibleOrigine(i) = sh.Visible Next sh ' Force le mode Array si une seule feuille est passée en argument: If IsArray(Feuilles) = False Then Feuilles = Array(Feuilles) ' Déplace les feuilles à imprimer dans l'ordre désiré: For i = UBound(Feuilles) To LBound(Feuilles) Step -1 Sheets(Feuilles(i)).Visible = True Sheets(Feuilles(i)).Move Before:=Sheets(1) Next i ' Si aucun fichier n'est indiqué alors imprime les feuilles désirées sinon les exporte en PDF: Select Case Fichier ' Sélectionne les feuilles désirées pour les imprimer: Case "" Sheets(Feuilles).Select ActiveWindow.SelectedSheets.PrintOut Preview:=Afficher ' Masque les autres feuilles du classeur pour ne pas les exporter en PDF: Case Else For i = 1 To Sheets.Count Rep = Filter(Feuilles, OrdreOrigine(i), True, vbTextCompare) If UBound(Rep) = -1 Then Sheets(OrdreOrigine(i)).Visible = False Next i ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fichier, OpenAfterPublish:=Afficher End Select ' Renvoie Vrai: ImprimerFeuilles = True ' Gestion des erreurs: Gest_Err: ' Restaure la situation d'origine: For i = 1 To Sheets.Count: Sheets(i).Visible = True: Next i For i = UBound(OrdreOrigine) To LBound(OrdreOrigine) Step -1 Sheets(OrdreOrigine(i)).Visible = VisibleOrigine(i) Sheets(OrdreOrigine(i)).Move Before:=Sheets(1) Next i Sheets(AncActive).Activate ' Affiche le message d'erreur: If Err.Number <> 0 Then MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description, vbExclamation, ThisWorkbook.Name Err.Clear End If End Function
Envoyé par laurent_ott Bonjour, Cela convient peut-être à vos besoins, mais précisez tout de même pour information que la fonction IsFileExist(FullName) présentée ici va renvoyer False sur un fichier avec attribut : fichier en lecture seule, masqué, système. Bonjour Laurent, Désolé de répondre si tard, je viens seulement de découvrir ton commentaire, et merci pour cette précision. C'est un fait que si le fichier est caché la fonction renverra False mais j'utilise cette fonction dans le cadre des applications que je livre et il n'y a pas de fichier caché et je vois mal un employé cacher un fichier, ce serait une faute grave mais je suis d'accord que pour compléter mon article, il est important de le préciser. C'est chose faite
Envoyé par Sibithen Merci beaucoup pour cette fonction ! Merci pour votre message, cela fait toujours plaisir de savoir que cela sert à quelques choses de publier.
Merci beaucoup pour cette fonction !
Bonsoir Philippe, Je vous remercie pour votre tuto même si je n'ai pas réussi à le mettre en œuvre.
Bonjour à vous, Merci pour ce tuto bien pratique. Maintenant que l'on sait comment ajouter celui-ci, est-il possible de le supprimer de la liste ? Cordialement PLH81
Merci pour la précision à propos : l'option Complément automatique des instruction (Outils/Options... [Editeur]) Je ne connaissais pas cette incidence. Sûrement l'une des raisons pour lesquels elle ne fonctionnait pas parfois pour moi. 😊
Bonjour, Cela convient peut-être à vos besoins, mais précisez tout de même pour information que la fonction IsFileExist(FullName) présentée ici va renvoyer False sur un fichier avec attribut : fichier en lecture seule, masqué, système.
Bonjour, Une autre approche est de déplacer les feuilles désirées, masquer les autres, imprimer ou exporter en PDF, puis restituer l'ordre d'origine des feuilles et leur visibilité. Exemple d'utilisation de la fonction ci-dessous pour exporter en PDF les feuilles "Menu", "TCD", "Graph", "Sources" en PDF puis ouvrir la visionneuse. Call ImprimerFeuilles(Array("Menu", "TCD", "Graph", "Sources"), "C:\Users\ott_l\Downloads\Classeur1.pdf", True) Ou pour les imprimer : Call ImprimerFeuilles(Array("Menu", "TCD", "Graph", "Sources"), "", False) Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586'------------------------------------------------------------------------------------------------ Function ImprimerFeuilles(ByVal Feuilles As Variant, Fichier As String, Afficher As Boolean) As Boolean '------------------------------------------------------------------------------------------------ ' Imprime les feuilles (même masquées) passées dans l'argument Feuilles (dans l'ordre désiré d'impression) soit sur ' l'imprimante par défaut, soit en fichier PDF. '------------------------------------------------------------------------------------------------ ' Feuille : la liste des feuilles concernées au format Array si plusieurs feuilles. ' Fichier : le fichier PDF à générer (ou vide pour une impression sur l'imprimante par défaut). ' Afficher : True pour voir le fichier PDF généré, ou l'aperçu avant impression. '------------------------------------------------------------------------------------------------ ' Renvoie : True si tout s'est bien passé, False dans le cas contraire. '------------------------------------------------------------------------------------------------ ' Exemple d'appels : ' Call ImprimerFeuilles(Array("Feuil1", "Feuil6"), "C:\Users\ott_l\Downloads\Classeur1.pdf", False) ' Call ImprimerFeuilles("Feuil1", "", True) '------------------------------------------------------------------------------------------------ Dim OrdreOrigine() Dim VisibleOrigine() Dim AncActive As String Dim i As Integer Dim Rep ' Initialisation des variables: ReDim OrdreOrigine(1 To Sheets.Count) ReDim VisibleOrigine(1 To Sheets.Count) AncActive = ActiveSheet.Name ' Gestion des erreurs: On Error GoTo Gest_Err Err.Clear ' Mémorise le nom des feuilles du classeur, leur ordre et leur état visible: For Each sh In Sheets i = i + 1 OrdreOrigine(i) = sh.Name VisibleOrigine(i) = sh.Visible Next sh ' Force le mode Array si une seule feuille est passée en argument: If IsArray(Feuilles) = False Then Feuilles = Array(Feuilles) ' Déplace les feuilles à imprimer dans l'ordre désiré: For i = UBound(Feuilles) To LBound(Feuilles) Step -1 Sheets(Feuilles(i)).Visible = True Sheets(Feuilles(i)).Move Before:=Sheets(1) Next i ' Si aucun fichier n'est indiqué alors imprime les feuilles désirées sinon les exporte en PDF: Select Case Fichier ' Sélectionne les feuilles désirées pour les imprimer: Case "" Sheets(Feuilles).Select ActiveWindow.SelectedSheets.PrintOut Preview:=Afficher ' Masque les autres feuilles du classeur pour ne pas les exporter en PDF: Case Else For i = 1 To Sheets.Count Rep = Filter(Feuilles, OrdreOrigine(i), True, vbTextCompare) If UBound(Rep) = -1 Then Sheets(OrdreOrigine(i)).Visible = False Next i ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fichier, OpenAfterPublish:=Afficher End Select ' Renvoie Vrai: ImprimerFeuilles = True ' Gestion des erreurs: Gest_Err: ' Restaure la situation d'origine: For i = 1 To Sheets.Count: Sheets(i).Visible = True: Next i For i = UBound(OrdreOrigine) To LBound(OrdreOrigine) Step -1 Sheets(OrdreOrigine(i)).Visible = VisibleOrigine(i) Sheets(OrdreOrigine(i)).Move Before:=Sheets(1) Next i Sheets(AncActive).Activate ' Affiche le message d'erreur: If Err.Number <> 0 Then MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description, vbExclamation, ThisWorkbook.Name Err.Clear End If End Function Cordialement.
Bonjour Curt, Merci pour ton message congratulant. Philippe Envoyé par curt Bonjour Philippe, un billet (précieux) de plus à mettre dans la collection .... merci
Bonjour Philippe, un billet (précieux) de plus à mettre dans la collection .... merci
Bonjour, Merci pour votre réaction. Il est exact qu'il y a mieux et surtout plus complet que la fonction Dir mais tout dépend de ce que l'on attend comme information. J'utilise cette fonction depuis plus de 20 ans et elle répond à mes besoins ainsi qu'aux demandes de mes clients. Le jour où j'aurai un cas plus complexe, je passerai par le FSO que je connais très bien. J'ai eu un NOKIA pendant très longtemps alors que des collègues avaient déjà des smartphone mais pour mes besoins de l'époque qui étaient de téléphoner et de communiquer pas SMS cela me suffisait amplement.
Bonjour, Merci pour votre message. Pour l'impression certes, en revanche, créer un document pdf qui tient en un seul document, je ne crois pas. J'ai dû effectuer un travail de ce type là pour un client, il y a quelques années et il me semble que je n'avais pas pu le faire et c'est cette option que j'avais choisie. Pour répondre avec certitude, je referai un test prochainement.
Bonjour, Quelque chose m'échappe dans votre procédure. Pourquoi copier des feuilles dans un nouveau classeur suivant un ordre fourni par un tableau ? Personnellement j'aurais juste fait une boucle d'impression directement sur les éléments du tableau non ? Mais peut-être n'ai-je pas perçu l'astuce sous-jacente...
Bonjour, Je pense qu'il y a une manière quand même plus moderne que les vieilles commandes natives de VBA comme DIR pour gérer le système de fichiers. Référencer la très complète bibliothèque Microsoft Scripting Runtime Dim fso as Scripting.FileSystemObject Set fso =New Scripting.FileSystemObject Et pour tester l'existence d'un fichier : If fso.FileExists(nom complet du fichier) Then
Bonjour Curt, Merci pour ton message congratulant qui me va droit au cœur. Cela encourage à continuer l'écriture de ces billets Philippe Envoyé par curt Bonsoir Philippe, tes trois derniers billets ne font qu'alimenter une mine d'or déjà très prolifique. Imprimer des feuilles Excel en pdf m'a souvent posé des problèmes dans l'ordre des feuilles sans que j'y voit une "logique"..... merci pour ce superbe travail
Bonsoir Philippe, tes trois derniers billets ne font qu'alimenter une mine d'or déjà très prolifique. Imprimer des feuilles Excel en pdf m'a souvent posé des problèmes dans l'ordre des feuilles sans que j'y voit une "logique"..... merci pour ce superbe travail