IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Philippe Tulliez

[Actualité] VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF

Note : 2 votes pour une moyenne de 3,00.
par , 30/07/2023 à 11h55 (8720 Affichages)
Introduction
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 - Visualiser dans une fenêtre à part
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 - Visualiser dans une fenêtre à part
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

Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog Viadeo Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog Twitter Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog Google Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog Facebook Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog Digg Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog Delicious Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog MySpace Envoyer le billet « VBA Excel : Copiez et personnalisez l'ordre de vos feuilles pour Imprimer et Exporter en PDF » dans le blog Yahoo

Mis à jour 30/07/2023 à 21h12 par Malick (Ajout balises code)

Catégories
VBA Excel

Commentaires

  1. Avatar de curt
    • |
    • permalink
    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
  2. Avatar de Philippe Tulliez
    • |
    • permalink
    Bonjour Curt,
    Merci pour ton message congratulant qui me va droit au cœur.
    Cela encourage à continuer l'écriture de ces billets
    Philippe

    Citation 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
  3. Avatar de cduigou
    • |
    • permalink
    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...
  4. Avatar de Philippe Tulliez
    • |
    • permalink
    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.
  5. Avatar de laurent_ott
    • |
    • permalink
    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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    '------------------------------------------------------------------------------------------------
    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.