Résolu XL 2010 Macro enregistrement PDF + choix des feuilles

safranien

XLDnaute Occasionnel
Bonjour à tous

je vous sollicite car je ne suis pas très aguerri sur la manip VBA. Ci-joint un fichier exemple. Dans Feuil1 il y a un bouton qui me permet d'enregistrer en PDF les feuilles 1,4,5,6,8,9 et 10. Ces feuilles constituent un rapport de base. J'aimerais offrir la possibilité d'ajouter des feuilles et que lorsque je clique sur le bouton "Impression PDF"; il y ait une check box qui me permette de choisir les feuilles à ajouter. Par défaut, seraient cochées les cases correspondant aux feuilles de base citées précédemment. Voir l'onglet "Donnees" dans lequel j'ai imagé cela.

Deux autres questions :

j'ai essayé de manier le code présent dans mon fichier récupéré sur un forum mais il ne comportait pas ce qu'il fallait faire pour dissocier les feuilles et revenir sur une feuille précise la feuille 1). Ce que j'ai écrit est certainement très moche et doit pouvoir être optimisé

With Sheets("Feuil12")
.Activate
End With
With Sheets("Feuil1")
.Select
End With

Pour finir, j'exécute cette macro actuellement sur un fichier qui est assez lourd et chargé de données et de graphiques. Dans mon fichier, j'ai un menu déroulant qui me permet de passer d'une installation à une autre avec des mises à jour de données et de calculs. Je lance l'impression PDF, je passe au site suivant etc. Pour les premieres impressions, tout se passe bien, j'ai, par exemple, 14 pages qui sortent dans mon PDF. Au bout du 4e ou 5e changement de site, quand je lance l'impression PDF, je n'ai plus que 10 pages qui sortent dans le PDF (je devrais toujours avoir 14 pages). Je suis obligé de fermer excel, de relancer le fichier, l'impression et là j'ai bien mes 14 pages. Je me dis qu'en fermant tout l'excel je dois vider une sorte de mémoire cache. Si c'est cela selon vous, est ce qu'il est possible d'insérer dans le code une fonction permettant de vider la mémoire à chaque lancement d'impression?

J'espère que vous pourrez m'aider.

Bonne soirée
 
Ce fil a été résolu! Aller à la solution…

Fichiers joints

safranien

XLDnaute Occasionnel
Salut kiki29

merci beaucoup pour ton lien. Super boulot que tu as fait. Cela semble répondre en grande partie à ce que je cherche à faire. Je pense que je vais galérer à adapter tes codes à mon fichier, étant donné que je ne comprends pas la moitié de ce qui est écrit lol
Sinon, pour éviter de devoir aller sur l'onglet spécifique Recap pour pouvoir faire ses choix d'impression, ce serait possible d'avoir une checkbox qui s'ouvre après avoir cliqué sur un bouton à la place?
 

_Thierry

XLDnaute Barbatruc
Bonsoir @safranien , @kiki29, le Forum

J'ai fait une approche par UserForm, qui dans ce cas est bien plus ergonimique pour la selection des feuilles...
J'y ai ajouté une touche perso pour faire une pré-selection auto de certains onglets en fonction de la couleur de leur "Tab"... (si ca peut t'inspirer....)

@safranien je te laisse découvrir, c'est plus "à la carte" sur ton fichier que la démo proposée par Kiki.

Pour optimiser/libérer le cache, il n'y a pas grand chose à faire en VBA, j'ai remis les Set d'objets à nothing, mais bon mis à part de fermer régulièrement Excel après avoir manipulé des fichiers très volumineux ou gourmants en ressources il n'y a pas de solution miracle.

Bonne soirée
@+Thierry
 

Fichiers joints

kiki29

XLDnaute Barbatruc
Salut, pour te répondre : j'avais fait ce fichier pour un intervenant extérieur, et au départ il y avait une Usf mais ce dernier ayant par la suite jusqu'à 30 à 50 feuilles (!) et voulant pouvoir permuter l'ordre de certaines feuilles dans une fusion, plus vraiment le choix.
 

_Thierry

XLDnaute Barbatruc
Bonsoir kiki29

Ah oui dans ce cas, ca devient compliqué, c'est clair et dans les Propriétés de Worksheet on n'a pas à disposition le "Tag" ou autres..., donc je comprends ton choix.

Bonne soirée
@+Thierry
 

safranien

XLDnaute Occasionnel
Bonsoir @safranien , @kiki29, le Forum

J'ai fait une approche par UserForm, qui dans ce cas est bien plus ergonimique pour la selection des feuilles...
J'y ai ajouté une touche perso pour faire une pré-selection auto de certains onglets en fonction de la couleur de leur "Tab"... (si ca peut t'inspirer....)

@safranien je te laisse découvrir, c'est plus "à la carte" sur ton fichier que la démo proposée par Kiki.

Pour optimiser/libérer le cache, il n'y a pas grand chose à faire en VBA, j'ai remis les Set d'objets à nothing, mais bon mis à part de fermer régulièrement Excel après avoir manipulé des fichiers très volumineux ou gourmants en ressources il n'y a pas de solution miracle.

Bonne soirée
@+Thierry
Bonsoir Thierry

merci beaucoup pour ton aide. Je regarde tout ça demain et reviens vers toi.

Bonne soirée
 

safranien

XLDnaute Occasionnel
Salut, pour te répondre : j'avais fait ce fichier pour un intervenant extérieur, et au départ il y avait une Usf mais ce dernier ayant par la suite jusqu'à 30 à 50 feuilles (!) et voulant pouvoir permuter l'ordre de certaines feuilles dans une fusion, plus vraiment le choix.
d'accord. En tout cas, merci, ça me donne des pistes à explorer.

Bonne soirée
 

safranien

XLDnaute Occasionnel
Thierry,

finalement j'ai jeté un premier oeil maintenant, trop pressé ^^

Ca à l'air de coller cependant, 3 questions :

_ on est d'accord que je peux supprimer tout le code dans le module 1, il ne sert plus à rien?

_ initialement, dans mon fichier, le PDF généré s'enregistrait dans le même dossier que celui où est enregistré l'excel. Maintenant, le PDF va s'enregistrer dans "Documents". Comment, dans ton code, puis-je remettre comme avant? Pour aller plus loin, en s'inspirant de ce qu'a fait kiki29, est ce que la macro pourrait créer un dossier (nommé "PASTEL PDF") dans le dossier où se trouve l'excel et enregistrer les PDF dans ce sous-dossier?

_ dans mon fichier de travail, les onglets que je veux voir cochés par défaut dans le USF sont de couleur différentes. Est-ce qu'à la place de définir une pré-sélection selon les couleurs des onglets, on peut le faire selon les noms des onglets (noms qui ne changeront pas dans le temps) ?

Merci
 

_Thierry

XLDnaute Barbatruc
Bonjour @safranien , @kiki29, le Forum

Oh pour tes trois questions, oui ça ne mange pas de pain, comme on dit ...

  • 1) Oui j'ai supprimé le code inutile dans le Module1 de la v01.
  • 2) Oui pas de souci, j'ai ajouté ces éléments dans la v01. (Check avec Dir et Création avec MkDir)
  • 3) Oui pas de problème, la liste des onglets se trouve en dûr dans un Select Case dans la v01.

Bonne découverte et journée !
@+Thierry
 

Fichiers joints

safranien

XLDnaute Occasionnel
Bonjour Thierry

super merci beaucoup beaucoup. J'ai normalement réussi à tout reproduire dans mon fichier de travail. Ce qui m'amène à une dernière (normalement) question :
_ mon fichier est composé de 23 onglets mais je ne souhaite en voir apparaître que certains (12) dans la liste de choix de l'impression. Pourrais tu m'aider sur ce dernier point stp?
 

_Thierry

XLDnaute Barbatruc
Bonjour @safranien , le Forum

N'as tu pas lu et regardé mon code pour le point 3 ???

3) Oui pas de problème, la liste des onglets se trouve en dûr dans un Select Case dans la v01
Ca se passe ici dans code du Private Module du UserForm1 :

VB:
Private Sub UserForm_Initialize()
Dim WS As Worksheet
Dim x As Integer

Me.Caption = "Selection Feuilles"

With Me.ListBox1
.MultiSelect = fmMultiSelectMulti
.ListStyle = fmListStyleOption
End With


For Each WS In ThisWorkbook.Worksheets
    Me.ListBox1.AddItem WS.Name
  
    Select Case WS.Name
    Case "Feuil1", "Feuil3", "Feuil4", "Feuil6", "Feuil7"
      Me.ListBox1.Selected(x) = True
    Case Else
     'Do Nothing
    End Select
  
  
    If WS.Tab.Color = 255 Then
    End If
    x = x + 1
Next

End Sub
Tu remplaces par ce que tu veux :

Case "Feuil1", "Feuil3", "Feuil4", "Feuil6", "Feuil7", "Feuil8", "Feuil9", "Feuil12", "Feuiletc"


Bonne journée
@+Thierry

EDIT PS en revoyant le code, le résidu de la v00 :
If WS.Tab.Color = 255 Then
End If
Peut être supprimé, puisque tu ne travailles pas par couleur d'onglet.
 
Dernière édition:

safranien

XLDnaute Occasionnel
Si si , ça je l'ai bien vu, et si je comprends bien, c'est pour définir les onglets qui doivent être cochés par défaut.
Ma question est que le USF m'affiche tous les onglets de mon classeur avec la possibilité de cocher. En plus des onglets cochés par défaut, je voudrais la possibilité de cocher des onglets supplémentaires mais pas touts les onglets du classeur. Beaucoup étant des onglets dédiés à des calculs et n'ayant aucun intérêt à pouvoir être sélectionnés pour être intégrés dans la mise en PDF.
Je ne sais pas si je me fais bien comprendre.
 

safranien

XLDnaute Occasionnel
J'imagine qu'on peut le définir par le nom des onglets. Par exemple, n'avoir que les onglets Feuil2 et Feuil3 dans la liste en plus de ceux défnis par défaut. Ce qui veut dire, ne pas faire apparaître les onglets Feuil7 et Données.
 

_Thierry

XLDnaute Barbatruc
Tu n'as pas quelque chose de plus générique ?

Style
If InStr(WS.Name, "Print") <> 0 Then
(Si l'onglet contient "Print" dans son nom

Ou :
If Left(WS.Name, 1) = "P" Then
Si le nom d'onglet commence par "P"....

Enfin tu vois ...

@+Thierry
 

safranien

XLDnaute Occasionnel
arf non je n'ai rien qui colle à ça. En PJ, la liste de tous les onglets de mon fichier (il y en a aussi qui sont masqués mais qui du coup apparaissent également dans la liste de choix). Dans l'encadré rouge, tous ceux que j'aimerais voir apparaître dans la liste d'impression, et ceux avec la croix étant ceux qui doivent être cochés par défaut. Ca va être compliqué si je comprends bien...? Onglets PDF.jpg
 

_Thierry

XLDnaute Barbatruc
Re

Ce n'est pas compliqué, mais dans un loop on ne peut faire qu'un seul Select Case.
Soit on abandonne le loop sur toutes les feuilles du classeur, au bénéfice d'un loop sur une Array des Feuilles, mais je n'aime pas trop car tu ne verras jamais les nouvelles feuilles...

Soit on fait un if infernal avec 12 onglets ...

Même pas l'emplacement dans le classeur peut-être maitrisé ? (les onglets ont un numéro d'index à partir du premier à gauche... ?

@+Thierry
 

safranien

XLDnaute Occasionnel
On pourrait se dire que les onglets devant apparaître sont les 12 en partant de la droite? Sinon je mets une x devant le nom de chaque onglets que je ne veux pas voir apparaître et on part sur le code de type
If Left(WS.Name, 1) = "P" Then (mais faut que tu me dises où l'insérer et la suite ... Oui je n'y pige rien e VBA malheureusement :()

Mais je me dis que puisqu'on peut définir une liste d'onglets qui doivent être cochés par défut, on doit pouvoir définir au préalable une liste d'onglets devant apparaître dans la liste ?
Il n'est pas prévu que j'ajoute des onglets devant être convertis en PDF mais si ça venait à être le cas, il me suffirait d'ajouter le nom de cet onglet dans le code pour le voir apparaître dans la liste.
Qu'en penses-tu?
 
Dernière édition:

fanch55

XLDnaute Impliqué
Bonjour à tous,
Sinon il existe cette macro pour imprimer les onglets que l'on désire dans un fichier quelconque:
VB:
Option Explicit
Private Sub CommandButton2_Click()
Dim PrintDlg        As DialogSheet
Dim CurrentSheet    As Worksheet
Dim Sh              As Worksheet
Dim Cb              As CheckBox
Dim Sel_Sheets      As String
Dim FileName        As Variant
Dim TopPos          As Integer

Application.ScreenUpdating = False

    ' Check for protected workbook
    If ActiveWorkbook.ProtectStructure Then
        MsgBox "Le classeur est protégé.", vbCritical
        Exit Sub
    End If

    ' Add a temporary dialog sheet
    Set CurrentSheet = ActiveSheet
    Set PrintDlg = ActiveWorkbook.DialogSheets.Add

    ' Add the checkboxes
    TopPos = PrintDlg.Buttons(1).Top
    For Each Sh In ActiveWorkbook.Worksheets
        ' Skip hidden sheets
        If Sh.Visible Then
           PrintDlg.CheckBoxes.Add(78, TopPos, 100, 16.5).Text = Sh.Name
           TopPos = TopPos + 13
        End If
    Next
    
    ' Move the OK and Cancel buttons
    PrintDlg.Buttons.Left = PrintDlg.CheckBoxes(1).Left + PrintDlg.CheckBoxes(1).Width
    
    ' Set dialog height, width, and caption
    With PrintDlg.DialogFrame
        .Height = Application.Max(68, PrintDlg.DialogFrame.Top + TopPos - 34)
        .Width = PrintDlg.Buttons(1).Left ' <-- bizarre mais fonctionne
        .Caption = "Cochez les feuilles à publier"
    End With
    
    ' Set focus on Cancel
    PrintDlg.Buttons(1).BringToFront
    
    ' Display the dialog box
    CurrentSheet.Activate
    Application.ScreenUpdating = True
        If PrintDlg.Show Then
            For Each Cb In PrintDlg.CheckBoxes
                If Cb.Value = xlOn Then Sel_Sheets = Trim(Sel_Sheets & " " & Cb.Caption)
            Next Cb
            If Sel_Sheets <> vbNullString Then
               ' Display the dialog box to obtain filename
                FileName = Application.GetSaveAsFilename( _
                    FileFilter:="Publication (*.pdf),*.pdf", _
                    InitialFileName:=ThisWorkbook.Path)
                If Not FileName = False Then
                    ' Select sheets to export
                    Sheets(Split(Sel_Sheets)).Select
                    ' Publication
                    ActiveSheet.ExportAsFixedFormat _
                        Type:=xlTypePDF, OpenAfterPublish:=True, _
                        FileName:=FileName
                End If
            End If
        End If

    ' Delete temporary dialog sheet (without a warning)
    Application.DisplayAlerts = False
    PrintDlg.Delete

' Reactivate original sheet
CurrentSheet.Activate
Set CurrentSheet = Nothing
Set PrintDlg = Nothing

End Sub
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas