Impression PDF

rafi1875

XLDnaute Nouveau
Bonjour, je suis tout nouveau sur le forum et j'admire le travail et l'entraide sur celui-ci.

Je suis un débutant en VBA et je vous avoue que je coince sur une nouvelle macro.

J'aimerais pouvoir imprimer en PDF depuis excel via une macro, plusieurs fois une même page mais en changeant la référence de la première valeur en haut à gauche.

J'ai mis sur une autre feuille, sur une colonne, tout les références.

J'ai mis une condition pour ne pas sortir les factures en dessous d'un montant défini, "Amount", inférieur à 10€ dans ce cas précis. Le problème est que le msgbox apparaît trois fois et je dois cliquer trois fois pour le fermer...

Voici le code mais pour l'instant j'arrive à imprimer qu'une page.


Dim MonRepertoire As String 'Créer folder de l'année en cours
Dim RepertoireAnnuel As String 'Créer folder dans l'année en cours pour le trimestre en cours

MonRepertoire = "G:\D - ABC\Clientele\B - Facturation\FRAIS\" & ThisWorkbook.Sheets("FACTURE").Range("C2").Value 'Ceci créé le folder de l'année en cours

RepertoireAnnuel = "G:\D - ABC\Clientele\B - Facturation\FRAIS\" & ThisWorkbook.Sheets("FACTURE").Range("C2").Value & "\" & _
ThisWorkbook.Sheets("FACTURE").Range("C1").Value 'Ceci créé le folder du trimestre en cours

On Error Resume Next
MkDir MonRepertoire
MkDir RepertoireAnnuel

End Sub

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub ExportFullPDF()
Call Répertoire

Dim fName As Variant
Dim Nom$
Dim Year$
Dim Amount As Variant
Dim Cellule As Variant



For Each Cellule In ThisWorkbook.Sheets("TOTAL").Range("A2:A4")
Cellule = Cellule.Value

Nom = "FACTURE" & ThisWorkbook.Sheets("FACTURE").Range("C1").Value & " - " & ThisWorkbook.Sheets("FACTURE").Range("C13").Value 'Définit le nom de la facture
Amount = ThisWorkbook.Sheets("FACTURE").Range("I29").Value ' condition pour imprimer les factures au dessus du montant de 10€, en cellule I29.

If Amount <= 10 Then
MsgBox "Montant inférieur à la limite d'envoi..."

End If


If Amount > 10 Then

fName = Nom & ".pdf"

End If


If fName <> False Then

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fName, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

End If


Next


End Sub


Merci d'avance pour votre aide et je reste à votre disposition pour toutes informations complémentaires.

Rafaël
 
Solution
VB:
Const DossierRacine = "G:\D - ABC\Clientele\B - Facturation\FRAIS"

Sub ExportFullPDF()
Dim Valeur As Variant
    
    With Worksheets("Facture")
        .Activate
        For Each Valeur In WorksheetFunction.Transpose(Range([A2].Validation.Formula1))
            If Valeur <> vbNullString Then
                [A2] = Valeur
                If Val([I29]) > 10 Then
                    Fname = RepertoireAnnuel & "\" & "FACTURE " & [A2] & " " & [C1] & " - " & [C13] & ".pdf"
                    Debug.Print [A2], Fname
                    .ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fname
                End If
            End If
        Next
    End With

End Sub
Function RepertoireAnnuel() As String 'Créer folder dans l'année en cours pour le...

rafi1875

XLDnaute Nouveau
Bonjour,
Sans classeur exemple anonymisée , c'est difficile de vous aider avec le bout de code incomplet fourni .
Bonjour Fanch55, merci pour ton retour.

J'ai mis l'entièreté du code, du moins ce que j'ai pu écrire moi-même avec mes connaissances...

J'aurai bien mis le fichier Excel en exemple en pièce jointe mais il est lourd et beaucoup de data confidentiel...

La macro avec la création des répertoire fonctionne, il faut juste je pense revoir l'export full PDF, car ma boucle (for each et next) ne doit pas être bien construite. Peut-être faut-il utiliser while or do.

Est-ce que tu penses que tu peux m'aider comme ça? En tout cas, merci de m'avoir lu et d'avance, pour ton aide.

Rafaël
 

rafi1875

XLDnaute Nouveau
Et précision, de base j'avais une liste déroulante via le data validation mais je pense que c'est impossible. C'est pour cela que j'ai mis dans une colonne d'une autre sheet du classeur, toutes les références.

Merci encore pour votre lecture et votre aide/conseil.

Rafaël
 

fanch55

XLDnaute Barbatruc
Pour résumer, si j'ai bien compris :

Vous voulez exporter en Pdf sous un certain nom la feuille Facture.
La mise à jour de [I29] provoque la mise à jour par formule de [C1] et [C13]
Le nom de l'export est composé du mot "Facture" & [C1] & "-" & [C13] & ".pdf"

Cet export doit être fait pour chaque mise à jour de [I29] de la feuille Facture avec les valeur en [A2:A4] de la feuille Total si cette valeur est supérieure à 10.

Est-ce correct ? 🤔
 
Dernière édition:

rafi1875

XLDnaute Nouveau
Pour résumer, si j'ai bien compris :

Vous voulez exporter en Pdf sous un certain nom la feuille Facture.
La mise à jour de [I9] provoque la mise à jour par formule de [C1] et [C13]
Le nom de l'export est composé du mot "Facture" & [C1] & "-" & [C13] & ".pdf"

Cet export doit être fait pour chaque mise à jour de [I9] de la feuille Facture avec les valeur en [A2:A4] de la feuille Total si cette valeur est supérieure à 10.

Est-ce correct ? 🤔
J'aimerais exporter en PDF plusieurs fois la même page dans un folder qui est bien créer via la création de répertoire. Cette page est déjà définie en print area et en haut de cette page j'ai une liste déroulante mais je pense pas pouvoir imprimer la même page plusieurs fois en descendant d'une référence dans cette liste déroulante. Si vous me dites que oui c'est possible, alors là ça rendrai la chose plus facile encore au jour le jour.

Mais en attendant, j'ai préféré essayer avec la même liste mais dans une colonne A, feuille Total.

Avant toute automatisation, je choisissais chaque référence dans la feuille facture en haut à gauche, et imprimais ensuite en pdf la même page mais avec le data qui changeait.

Le nom de l'export est correct comme vous avez indiqué mais la mise à jour de I9? peut-être I29? C'était pour éviter d'imprimer en pdf les factures inférieures à 10€ avec la définition de la variable Amount avec le code ci-dessous (extrait)

If Amount <= 10 Then
MsgBox "Montant inférieur à la limite d'envoi..."

End If


If Amount > 10 Then


J'aimerais savoir si on peut au final imprimer plusieurs PDF de la même page mais avec la référence qui change, présente en liste déroulante en haut à gauche de la feuille facture ou en colonne A de la feuille total, dans un folder, en faisant tourner une boucle (condition I29 de la feuile facture "Amount" > 10€).

J'espère que je suis clair et si ce n'est pas le cas, n'hésitez pas à me demander des informations complémentaires et je tacherai de m'expliquer davantage.
J'ai mis un excel exemple en pièce jointe si besoin :)

Merci encore pour votre aide.
 

Pièces jointes

  • Print to PDF.xlsm
    22.6 KB · Affichages: 13

fanch55

XLDnaute Barbatruc
Oki, le I9 était un "Finger check", c'est effectivement I29 qu'il faut comprendre. 🥳

Essayez le code suivant :
Je me suis basé sur la liste de validation .
Dans le classeur fourni, C1 et C3 ne changeant pas, j'ai rajouté A2 dans le nom pour différencier les fichiers.
Il faudra rajouter le Répertoire en début de Nom ( ne sachant pas la variable affectée ).
J'ai fait un debug.print du "résultat" et neutralisé l'export.
A vous de corriger si cela vous convient ... 😩


VB:
Sub ExportFullPDF()
Dim Valeur As Variant
    Call Répertoire
    
    With Worksheets("Facture")
        .Activate
        For Each Valeur In WorksheetFunction.Transpose(Range([A2].Validation.Formula1))
            If Valeur <> vbNullString Then
                [A2] = Valeur
                If Val([I29]) > 10 Then
                    Fname = "FACTURE " & [A2] & " " & [C1] & " - " & [C13] & ".pdf"
                    Debug.Print  Fname
                    '.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fname
                End If
            End If
        Next
    End With

End Sub
 

rafi1875

XLDnaute Nouveau
Oki, le I9 était un "Finger check", c'est effectivement I29 qu'il faut comprendre. 🥳

Essayez le code suivant :
Je me suis basé sur la liste de validation .
Dans le classeur fourni, C1 et C3 ne changeant pas, j'ai rajouté A2 dans le nom pour différencier les fichiers.
Il faudra rajouter le Répertoire en début de Nom ( ne sachant pas la variable affectée ).
J'ai fait un debug.print du "résultat" et neutralisé l'export.
A vous de corriger si cela vous convient ... 😩


VB:
Sub ExportFullPDF()
Dim Valeur As Variant
    Call Répertoire
  
    With Worksheets("Facture")
        .Activate
        For Each Valeur In WorksheetFunction.Transpose(Range([A2].Validation.Formula1))
            If Valeur <> vbNullString Then
                [A2] = Valeur
                If Val([I29]) > 10 Then
                    Fname = "FACTURE " & [A2] & " " & [C1] & " - " & [C13] & ".pdf"
                    Debug.Print  Fname
                    '.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fname
                End If
            End If
        Next
    End With

End Sub
Bonjour Fanch55, Je me suis remis sur le fichier mais pour précision, le C1 ne change pas mais le C13 oui, c'est le numero client selon la référence client choisie en haut de la page.

J'ai essayé votre code au lieu du mien mais fname n'est pas défini et je n'ai pas compris l'insertion d'une nouvelle cellule A2. C'est pour faire tourner la liste déroulante?

Merci d'avance pour votre aide et votre patience envers un débutant.

Belle journée à vous,
 

rafi1875

XLDnaute Nouveau
Re bonjour,

J'ai fait plusieurs tests et voici ce que j'ai pour l'instant:

La macro tourne car j'ai associé la macro à une zone de texte tel un button, je vois bien le data qui change et la référence en A2 défilée un par un c'est parfait.

Le répertoire est crée mais aucun PDF dedans. Je pense que l'impression ne se fait pas.

Avez-vous une idée pour corriger ce problème? Je pense que nous sommes presque au bout du problème!

On peut peut-être essayer avec ceci:
fName = Application.GetSaveAsFilename( _
InitialFileName:="G:\D - ABC\FACTURE\B - CLIENT\FACTURE " & ThisWorkbook.Sheets("FACTURE").Range("C1").Value & "\" & Nom & ".pdf", _
FileFilter:="PDF files, *.pdf", _
Title:="Sauvegarder Facture Client en PDF")

Merci
-------------------------------------------------------------------------------------------------------
Sub ExportFullPDF()
Dim Valeur As Variant
Dim fName As Variant

Call Répertoire

With Worksheets("FACTURE")
.Activate
For Each Valeur In WorksheetFunction.Transpose(Range([A2].Validation.Formula1))
If Valeur <> vbNullString Then
[A2] = Valeur
If Val([I29]) > 10 Then
fName = "FACTURE " & ThisWorkbook.Sheets("FACTURE").Range("C1").Value & " - " & ThisWorkbook.Sheets("FACTURE").Range("C13").Value & ".pdf"
Debug.Print fName
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fName, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

End If
End If
Next
End With

End Sub
 

fanch55

XLDnaute Barbatruc
VB:
Const DossierRacine = "G:\D - ABC\Clientele\B - Facturation\FRAIS"

Sub ExportFullPDF()
Dim Valeur As Variant
    
    With Worksheets("Facture")
        .Activate
        For Each Valeur In WorksheetFunction.Transpose(Range([A2].Validation.Formula1))
            If Valeur <> vbNullString Then
                [A2] = Valeur
                If Val([I29]) > 10 Then
                    Fname = RepertoireAnnuel & "\" & "FACTURE " & [A2] & " " & [C1] & " - " & [C13] & ".pdf"
                    Debug.Print [A2], Fname
                    .ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fname
                End If
            End If
        Next
    End With

End Sub
Function RepertoireAnnuel() As String 'Créer folder dans l'année en cours pour le trimestre en cours

Dim MonRepertoire As String 'Créer folder de l'année en cours
    MonRepertoire = DossierRacine & "\" & Worksheets("FACTURE").[C2]
    If Dir(MonRepertoire, vbDirectory) = "" Then MkDir MonRepertoire

    RepertoireAnnuel = MonRepertoire & "\" & Worksheets("FACTURE").[C1]
    If Dir(RepertoireAnnuel, vbDirectory) = "" Then MkDir RepertoireAnnuel

End Function
 

rafi1875

XLDnaute Nouveau
VB:
Const DossierRacine = "G:\D - ABC\Clientele\B - Facturation\FRAIS"

Sub ExportFullPDF()
Dim Valeur As Variant
   
    With Worksheets("Facture")
        .Activate
        For Each Valeur In WorksheetFunction.Transpose(Range([A2].Validation.Formula1))
            If Valeur <> vbNullString Then
                [A2] = Valeur
                If Val([I29]) > 10 Then
                    Fname = RepertoireAnnuel & "\" & "FACTURE " & [A2] & " " & [C1] & " - " & [C13] & ".pdf"
                    Debug.Print [A2], Fname
                    .ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fname
                End If
            End If
        Next
    End With

End Sub
Function RepertoireAnnuel() As String 'Créer folder dans l'année en cours pour le trimestre en cours

Dim MonRepertoire As String 'Créer folder de l'année en cours
    MonRepertoire = DossierRacine & "\" & Worksheets("FACTURE").[C2]
    If Dir(MonRepertoire, vbDirectory) = "" Then MkDir MonRepertoire

    RepertoireAnnuel = MonRepertoire & "\" & Worksheets("FACTURE").[C1]
    If Dir(RepertoireAnnuel, vbDirectory) = "" Then MkDir RepertoireAnnuel

End Function
Merci pour le code, je viens de l'ajuster pour mon fichier, j'ai dû définir fName as variant car le code plantait.
 

rafi1875

XLDnaute Nouveau
Très bien, je ne savais pas mais dès que j'ai mis en début de code, Dim fName as variant, le code fonctionnait.

En tout cas, merci beaucoup pour votre aide et le temps passé sur le dossier. Peut-être à une prochaine et bonne continuation à vous 😇
 

rafi1875

XLDnaute Nouveau
Toutes les variables non déclarées sont des Variants ...
Bonjour, je reviens vers vous car mon boss me demande maintenant d'encoder le pdf qui sort pour envoi par email.

Est-ce que tu saurais m'aider sur ce point? Mettre un morceau de code dans cette macro?

Merci d'avance pour ton aide parce que je t'avoue que j'ai cherché mais j'ai rien trouvé sur le net pour encoder un pdf. C'est une impression one by one et il y aura toujours le même password, que j'ai mis en cellule F1 si jamais.



Sub ExportPDF()
Call Répertoire

Dim fName As Variant
Dim Nom$
Dim Year$

Nom = "Report " & ThisWorkbook.Sheets("Report").Range("C11").Value

fName = Application.GetSaveAsFilename( _
InitialFileName:="G:\D - ABC\Clientele\ Reports\Quarterly Reports " & ThisWorkbook.Sheets("Report").Range("C1").Value & "\" & Nom & ".pdf", _
FileFilter:="PDF files, *.pdf", _
Title:="Sauvegarder Report Client en PDF")

If fName <> False Then

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fName _
, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
:=False, OpenAfterPublish:=False

End If

End Sub
 

fanch55

XLDnaute Barbatruc
Salut,

Mettre un mot de passe sur un ficher Excel, c'est faire l'autruche .
Sur un ficher Pdf également .
On trouve de nombreux moyens et pas très compliqués pour craquer de tels fichiers.

Il faut dire à votre Boss que la seule façon de sécuriser un document,
c'est de ne le transmettre à personne :

Stocker le ficher sur un serveur sécurisé ( personnel ou cloud ) .
Et donner un accès aux personnes concernées via connexion ou clé d'accès
ou lien par mail .
 

Discussions similaires

Statistiques des forums

Discussions
311 708
Messages
2 081 750
Membres
101 812
dernier inscrit
trufu