Macro exporter plusieurs onglets en pdf

mexitinoco

XLDnaute Nouveau
Salut le forum,

J'ai créé une macro qui affiche une fenêtre avec plusieurs cases à cocher, chaque case correspond en fait à un onglet du classeur, et donc on choisit les onglets que l'on souhaite conserver puis on clique sur un bouton qui les exporte en pdf. J'arriva à faire fonctionner la macro un onglet à la fois mais le soucis est que j'aimerais bien pouvoir sélectionner plusieurs onglets en même temps et les exporter dans le même pdf.

Je vous mets le code que j'ai écris jusqu'à présent mais qui ne fonctionne pas (pour changer) :

VB:
Private Sub CommandButton1_Click()

Dim Sh1, Sh2, Sh3, Sh4, Sh5 As Worksheets

If CheckBox1.Value = True Then
    Set Sh1 = Sheets("Format 1")
    Else
End If

If CheckBox2.Value = True Then
    Set Sh2 = Sheets("Format 2")
    Else
End If

If CheckBox3.Value = True Then
    Set Sh3 = Sheets("Format 3")
    Else
End If

If CheckBox4.Value = True Then
    Set Sh4 = Sheets("Format 4")
    Else
End If

If CheckBox5.Value = True Then
    Set Sh5 = Sheets("Format 5")
    Else
End If
    

Sheets(Array(Sh1, Sh2, Sh3, Sh4, Sh5)).Select
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\Users\antoine.dupont\Desktop\Stage\Mes tâches\Validation format\Fichier_test_formats.pdf" _
    , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
    :=False, OpenAfterPublish:=True
End Sub
Des idées ? Merci pour vos réponses !
 

Roblochon

XLDnaute Occasionnel
Bonjour,

A vue de nez cela devrait être:
VB:
Sheets(Array(Sh1, Sh2, Sh3, Sh4, Sh5)).Select
    Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\Users\antoine.dupont\Desktop\Stage\Mes tâches\Validation format\Fichier_test_formats.pdf" _
    , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
    :=False, OpenAfterPublish:=True
ActiveSheet.Export.... n'exporte que la feuille active Selection.Export...... exporte la sélection

Bon après-midi
 

mexitinoco

XLDnaute Nouveau
Bonjour,

A vue de nez cela devrait être:
VB:
Sheets(Array(Sh1, Sh2, Sh3, Sh4, Sh5)).Select
    Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\Users\antoine.dupont\Desktop\Stage\Mes tâches\Validation format\Fichier_test_formats.pdf" _
    , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
    :=False, OpenAfterPublish:=True
ActiveSheet.Export.... n'exporte que la feuille active Selection.Export...... exporte la sélection

Bon après-midi
Salut Roblochon, merci beaucoup pour ta réponse,

Malheureusement ça ne fonctionne pas non plus, il me met "incompatibilité de type" en surlignant la ligne Sheets(Array(Sh1, Sh2, Sh3, Sh4, Sh5)).Select
Peut-être que je ne dois pas mettre "Worksheets" comme type de variable ?
 

Roblochon

XLDnaute Occasionnel
Re,

Oui c'est normal, il attend un tableau de noms de feuille.

Je suis sûr qu'il y a plus simple, mais sans classeur exemple difficile de faire mieux:
VB:
Private Sub CommandButton1_Click()

Dim NomsFeuilles() As Variant
Dim idx As Integer

If CheckBox1.Value = True Then
    idx = idx + 1
    ReDim Preserve NomsFeuilles(1 To idx)
    NomsFeuilles(idx) = "Format 2"
    Else
End If

If CheckBox2.Value = True Then
    idx = idx + 1
    ReDim Preserve NomsFeuilles(1 To idx)
    NomsFeuilles(idx) = "Format 2"
    Else
End If

If CheckBox3.Value = True Then
    idx = idx + 1
    ReDim Preserve NomsFeuilles(1 To idx)
    NomsFeuilles(idx) = "Format 2"
    Else
End If

If CheckBox4.Value = True Then
    idx = idx + 1
    ReDim Preserve NomsFeuilles(1 To idx)
    NomsFeuilles(idx) = "Format 2"
    Else
End If

If CheckBox5.Value = True Then
    idx = idx + 1
    ReDim Preserve NomsFeuilles(1 To idx)
    NomsFeuilles(idx) = "Format 2"
    Else
End If
  

Sheets(NomsFeuilles).Select
    Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\Users\antoine.dupont\Desktop\Stage\Mes tâches\Validation format\Fichier_test_formats.pdf" _
    , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
    :=False, OpenAfterPublish:=True
End Sub
C'était ma dernière proposition sans classeur exemple.

Bonne après-midi
 

mexitinoco

XLDnaute Nouveau
Re Roblochon,

Voici ci-joint un fichier exemple.
J'ai essayé aussi de faire qu'il sélectionne par exemple l'onglet 1 quand on coche "onglet 1", mais évidemment ensuite il exporte en pdf uniquement le dernier onglet sélectionné.

Merci pour ton deuxième exemple, en revanche je ne comprends pas bien qu'est-ce que fait la variable Nomsfeuilles, et pourquoi il lui est attribué le Format 2 ?

Merci encore pour ton aide,
Bon après-midi
 

Fichiers joints

Roblochon

XLDnaute Occasionnel
Merci pour le classeur,
mais c'eût été mieux que les noms de feuilles correspondent à ce qu'en attende les macros!
Cela fonctionne correctement dans le classeur joint. Attention j'ai changé le répertoire par ThisWorkbook.Path.
NomsFeuilles est un tableau qui contient les noms des feuilles correspondants aux checkBox.

La boucle For parcourt les CheckBox et à chaque CheckBox qui est = True le tableau est redimensionné (+1) pour contenir le nom de la feuille.

Bonne soirée
 

Fichiers joints

Dernière édition:

mexitinoco

XLDnaute Nouveau
Merci pour le classeur,
mais c'eût été mieux que les noms de feuilles correspondent à ce qu'en attende les macros!
Cela fonctionne correctement dans le classeur joint. Attention j'ai changé le répertoire par ThisWorkbook.Path.
NomsFeuilles est un tableau qui contient les noms des feuilles correspondants aux checkBox.

La boucle For parcourt les CheckBox et à chaque CheckBox qui est = True alors le tableau est redimensionné (+1) pour contenir le nom de la feuille.

Bonne soirée
Ah oui autant pour moi je me suis un peu précipité pour rentrer les noms de feuille dans la macro^^
Génial ça marche merci !! et encore mieux que ce que je voulais grâce à l'astuce ThisWorkbook.Path que je ne connaissais pas !

Après tant d'heures où j'ai galéré dessus, tu es un génie ! ^^
Bonne soirée
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, mexitinoco, Roblochon

Juste pour infos (et pour confirmation de test)
Chez moi, cela fonctionne sans boucle
(Chez vous aussi?)
VB:
Sub TestOK()
Dim sPath
sPath = "C:\Users\STAPLE\Documents\2019\"
Sheets(Array("Feuil1", "Feuil2", "Feuil3")).Select False
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sPath & "TEST_formats.pdf", Quality:=xlQualityStandard, IgnorePrintAreas _
    :=True
End Sub
PS: Bizarrement, pour que cela fonctionne, il faut je définie des zones d'impressions au préalable sur chaque feuille.
 

mexitinoco

XLDnaute Nouveau
Bonjour Staple1600,

Ce code tu l'utilises aussi avec un UserForm ? Parce que sinon de ce que j'en comprends là ton code sélectionne en fait simplement les Feuilles 1,2 et 3 pour les exporter en pdf, dans le dossier que tu as définis avec "sPath".

Si tu veux seulement exporter ces 3 feuilles (qui resteront fixes du coup) sans boucle ni Userform c'est normal que cela fonctionne :)

PS : par contre c'est bizarre que tu dois définir des zones d'impression pour que ça marche parce que tu as mis "IgnorePrintAreas _:=True", logiquement c'est en mettant False qu'il va avoir besoin des zones d'impression.
 

mexitinoco

XLDnaute Nouveau
Bonsoir le fil, mexitinoco, Roblochon

Juste pour infos (et pour confirmation de test)
Chez moi, cela fonctionne sans boucle
(Chez vous aussi?)
VB:
Sub TestOK()
Dim sPath
sPath = "C:\Users\STAPLE\Documents\2019\"
Sheets(Array("Feuil1", "Feuil2", "Feuil3")).Select False
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sPath & "TEST_formats.pdf", Quality:=xlQualityStandard, IgnorePrintAreas _
    :=True
End Sub
PS: Bizarrement, pour que cela fonctionne, il faut je définie des zones d'impressions au préalable sur chaque feuille.
Ah effectivement je viens d'avoir un problème aussi avec la zone d'impression, la macro exportait que des feuilles blanches, je comprenais pas. En fait il faut remplacer Selection par ActiveSheet : "ActiveSheet.ExportAsFixed...."

Parce que sinon avec Selection il exporte que les cellules que tu as à l'instant T sélectionnées
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, mexitinico, Roblochon

mexitinoco
Ce que je voulais montrer c'est que la syntaxe (avec le paramètre False ajouté en fin)
Sheets(Array("TEST_1", "TEST_2", "TEST_3")).SelectFalse
permet de ne pas boucler
Sauf que...le test ci-dessous produit des choses bizarres chez moi
Et chez vous?
Mode opératoire du test
Dans un classeur vierge , lancer une seule fois la macro PREAMBULE.
2) Enregistrer le classeur dans le répertoire de votre choix
3) puis lancer la macro Export_PDF_SansBoucles
a) avec IgnorePrintAreas sur True puis une seconde fois sur False
(en changeant dans le code le nom du PDF exporté lors de la seconde éxécution)
VB:
Sub PREAMBULE()
Dim i%
'A NE LANCER qu'une seule fois et en premier
Application.ScreenUpdating = False
For i = 1 To 3
  With Sheets.Add(after:=Sheets(Sheets.Count)).Cells(1)
  .Parent.Name = "TEST_" & i
  With .Resize(25, 7)
  .Value = .Parent.Name: .Interior.ColorIndex = 26 + (i * 3): .Borders.LineStyle = 1
  End With
  End With
Next
Sheets("TEST_1").PageSetup.PrintArea = "$A$1:$G$25"
Sheets("TEST_2").PageSetup.PrintArea = "$A$1:$G$15"
Sheets("TEST_3").PageSetup.PrintArea = "$A$1:$G$5"
End Sub
Sub Export_PDF_SansBoucles()
Dim sPath$
sPath = ThisWorkbook.Path & "\"
Sheets(Array("TEST_1", "TEST_2", "TEST_3")).Select False
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sPath & "TEST88_formats.pdf", Quality:=xlQualityStandard, IgnorePrintAreas _
    :=True
End Sub
Selon les cas, on a... ou on a pas un PDF avec les 3 feuilles.

Et je n'arrive pas à comprendre pourquoi.

Et vous?
 

mexitinoco

XLDnaute Nouveau
Bonjour Staple1600,

J'avoue que je ne comprends pas bien ce que fais ta première macro PREAMBULE. Après sinon pour la 2e partie de ton code effectivement c'est un peu curieux pour moi aussi : j'ai essayé avec IgnorePrintAreas True puis False et dans les deux cas il n'y a pas de pdf qui s'est exporté...

Après je pense que tu devrais remplacer Selection.ExportAsFixedFormat par ActiveSheet.ExportAsFixedFormat, parce qu'avec Selection il va exporter que ce que tu es en train de sélectionner, alors qu'avec ActiveSheet il t'exporter tes 3 feuilles
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, mexitinoco, Roblochon

J'aurai du juste écrire ;)
Dans un classeur vierge, créer trois feuilles que vous nommerez TEST_1, TEST_2 et TEST_3
Remplissez sur trois feuilles, trois plages de cellules avec des données fictives mais distinctes d'une feuille sur l'autre.
C'est donc ce j'appelle un préambule (en gros préparer un classeur pour faire un test)
Du coup, pensant bien faire, j'ai fait une petite macro qui fait ce que je viens de décrire et je l'ai donc naturellement nommée PREAMBULE
(Elle ne sert donc qu'à préparer un "fichier exemple" en vue du test)
Test motivé par une phrase de ton second message
Malheureusement ça ne fonctionne pas non plus, il me met "incompatibilité de type" en surlignant la ligne Sheets(Array(Sh1, Sh2, Sh3, Sh4, Sh5)).Select
Je voulais juste indiquer qu'en ajoutant False sur cette ligne, le code ne plante pas
(et éviter de boucler sur les feuilles)

Par contre, il y a des choses que je ne comprends pas dans la suite (l'export PDF)
Le code ci-dessous chez moi génère bien un PDF (mais pas toujours)
VB:
Sub Export_PDF_SansBoucles()
Dim sPath$
sPath = ThisWorkbook.Path & "\"
Sheets(Array("TEST_1", "TEST_2", "TEST_3")).Select False
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sPath & "TEST88_formats.pdf", Quality:=xlQualityStandard, IgnorePrintAreas _
    :=True
End Sub
C'est pour cela que je sollicitais ceux d'entre nous qui passeraient ton fil pour éclairer ma lanterne.

Voilà, j'espère avoir été plus clair avec ces longues explications ;)
 

Discussions similaires


Haut Bas