Lorsque vous devez imprimer ou exporter plusieurs feuilles d'un classeur Excel au format PDF, vous avez probablement utilisé la méthode classique consistant à les sélectionner et à utiliser la commande appropriée. Cependant, vous avez peut-être rencontré le problème de l'ordre d'impression ou d'exportation, qui suit la disposition des feuilles de gauche à droite.
Pour imprimer ou exporter dans un ordre spécifique, vous avez deux options : soit déplacer manuellement les feuilles pour les réorganiser, soit les copier dans un autre classeur tout en les disposant dans le bon ordre.
Dans ce billet, nous allons explorer une solution efficace en utilisant le langage VBA. Grâce à cette procédure, vous pourrez automatiser ce processus fastidieux et gagner un temps précieux lors de l'impression ou de l'exportation de vos feuilles de calcul.
Comprendre le fonctionnement de la procédure
Maintenant que nous avons présenté le contexte, plongeons dans les détails
La fonction générique nommée CopySheets prévue à la base pour copier des feuilles d'un classeur actif vers un nouveau classeur destiné à n'être qu'éphémère peut parfaitement être utilisée pour copier les feuilles d'un classeur quelconque vers un autre à condition bien entendu qu'ils soient ouverts.
S'il nous ne l'utilisons que pour un usage tel que décrit dans l'introduction, il suffit d'envoyer la liste des feuilles à copier dans l'argument SheetsList dans une variable tableau pour qu'il copie ces feuilles du classeur actif vers une nouvelle feuille. En fin de copie s'il s'agit d'un nouveau classeur, la première feuille présente au moment de sa création sera supprimée afin de ne conserver que celles qui ont été copiées.
Code de la fonction générique
Cette fonction nommée CopySheets a donc trois arguments dont seul le premier est obligatoire. On peut lui passer soit une variable tableau ou un nom (String) s'il n'y a qu'une feuille à copier même si je ne vois pas trop l'intérêt d'utiliser cette fonction pour une seule feuille. L'utilisation de la méthode Copy de l'objet Sheetest largement suffisant.
Les deux arguments optionnels permettent de choisir le classeur "source" et/ou le classeur "cible"
Code vba : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Function CopySheets(SheetsList As Variant, _ Optional oTarget As Workbook, _ Optional oSource As Workbook) ' Copie une ou plusieurs feuilles d'un classeur vers un autre ' Philippe Tulliez (https://magicoffice.be) ' Arguments ' SheetsList ' Liste des feuilles à copier (Array) ' [oTarget] ' Classeur cible (Nouveau si Nothing) ' [oSource] ' Classeur source (Actif si Nothing) Dim e As Integer Dim f As Boolean If oSource Is Nothing Then Set oSource = ActiveWorkbook If oTarget Is Nothing Then Set oTarget = Workbooks.Add: f = True If TypeName(SheetsList) = "String" Then SheetsList = Split(SheetsList) With oTarget For e = LBound(SheetsList) To UBound(SheetsList) oSource.Sheets(SheetsList(e)).Copy After:=.Sheets(.Sheets.Count) Next Application.DisplayAlerts = False If f Then .Sheets(1).Delete Application.DisplayAlerts = True End With End Function |
Exemple d'une procédure qui l'invoque
Dans cet exemple, nous allons copier les feuilles nommées "Devis", "Electricité", "Plomberie" et "Conditions" du classeur actif vers un nouveau classeur nous imprimerons le classeur en modifiant au préalable le zoom de la première feuille et enfin on supprimera le classeur éphémère.
Code vba : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Sub TestCopySheets() Dim t As Variant t = Array("Devis", "Electricité", "Plomberie", "Conditions") Application.ScreenUpdating = False ' Copie les feuilles CopySheets SheetsList:=t, oSource:=ThisWorkbook ' Après copie With ActiveWorkbook .Sheets(1).PageSetup.Zoom = 85 ' Modifie le zoom de la première feuille .PrintOut ' Imprime le classeur .Close SaveChanges:=False ' Ferme le classeur sans le sauver End With Application.ScreenUpdating = True End Sub |
Ressources
Tutoriels pour en savoir plus sur les sujets abordés dans ce billet