IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Création pdf et incrémentation du nom


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut Création pdf et incrémentation du nom
    Bonjour,

    Je me permets de faire appel au forum, car je cherche à élaborer une macro en vba Excel, qui regroupe deux thèmes. J'ai trouvé beaucoup d'informations et de codes sur les deux thèmes, mais pas de code qui permette de les synthétiser tous les deux. Certaines m'ont permis de réaliser la première demande, mais je bute alors sur la seconde.

    Ce que je cherche à faire:
    J'ai un fichier Excel, qui contient des données sur une seule feuille, sur une zone bien définie (en l'occurrence une page au format A4).
    J'aimerais pouvoir lancer, depuis un bouton présent dans le fichier, générer un pdf qui se situe dans le même dossier que le fichier Excel (première demande), en incrémentant le nom du fichier de 1. Par exemple, le premier fichier pdf devra avoir pour nom "Planning_1.pdf". Si l'utilisateur essaie d'en générer d'autres, ils devront porter les noms "Planning_2.pdf", puis "Planning_3.pdf", etc. La création du pdf n'écrasera donc jamais de fichier existant.

    Encore une précision: serait-il possible de détecter, au moment où la macro est lancée, s'il n'y a pas eu de changement fait depuis le dernier enregistrement? Dans ce cas, la création d'un nouveau pdf n'aurait pas de sens: elle serait identique au dernier pdf. Un message pourrait avertir l'utilisateur qu'il n'a pas fait de changement et, par exemple, ne pas créer de nouveau pdf.

    Merci d'avance pour votre aide!

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, teste ceci, place la macro dans le module de la feuille contenant le bouton.

    Code : 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
    Sub GenererPDF()
        Dim Chemin As String
        Dim NomFichier As String
        Dim i As Integer
        Dim wb As Workbook
        Dim ws As Worksheet
     
        Set wb = ThisWorkbook
        Set ws = wb.ActiveSheet
     
        ' Vérifier si des modifications ont été apportées depuis la dernière sauvegarde
        If wb.Saved Then
            MsgBox "Aucune modification n'a été apportée depuis la dernière sauvegarde. La création d'un nouveau PDF n'est pas nécessaire.", vbInformation
            Exit Sub
        End If
     
        ' Chemin du fichier
        Chemin = wb.Path & "\"
     
        ' Nom de base du fichier
        NomFichier = "Planning_"
     
        ' Trouver le prochain numéro de fichier disponible
        i = 1
        While Len(Dir(Chemin & NomFichier & i & ".pdf")) <> 0
            i = i + 1
        Wend
     
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin & NomFichier & i & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
     
        MsgBox "Fichier PDF créé avec succès : " & Chemin & NomFichier & i & ".pdf", vbInformation
     
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut Macro
    Salut Franc,

    Merci pour ta réponse et ton aide. Je ne pourrai tester la macro que demain. Je me réjouis d’essayer ta proposition! Je te tiens au courant

  4. #4
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut Yes
    Me voici de retour. Les tests sont concluants, la macro fait exactement ce que je souhaitais qu'elle fasse: enregistrement du pdf dans le même dossier que le fichier Excel, avec incrémentation du nom. C'est parfait! Merci Franc!
    La seule chose qui est problématique, c'est le test pour savoir si quelque chose a été modifié depuis la dernière fois.
    Par exemple, si j'ouvre le fichier et change une valeur, un clic sur le bouton génère un nouveau pdf (correct).
    Si par contre, l'utilisateur ouvre le fichier, change une valeur, puis enregistre, un nouveau clic sur le bouton va générer le message indiquant qu'il n'y a pas eu de modification depuis la dernière fois (ce qui, en l'occurrence, n'est pas correct). Autre cas de figure problématique: si l'utilisateur ouvre le fichier et essaie de générer un nouveau pdf, Excel accepte (ce qui devrait plutôt déclencher le message disant qu'il n'y a pas eu de modification depuis la dernière fois.
    Peut-on corriger cela?

    J'ai développé la suite de la macro et je rencontre un problème avec l'impression. Peut-on dire à Excel d'imprimer avec telle imprimante (nom exact sur le réseau), mais, si cette dernière n'est pas trouvée, de simplement lancer une impression avec l'imprimante par défaut?

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, si la propriété .Saved ne répond pas à tes attentes, je vois une autre possibilité.
    On utilise une cellule cachée dans la feuille de calcul pour stocker la date et l’heure de la dernière modification. Ensuite, on utilise l’événement Worksheet_Change pour mettre à jour cette cellule chaque fois qu’une modification est apportée à la feuille de calcul.
    J'ai modifié la macro pour vérifier cette cellule avant de générer un nouveau PDF. Cette approche nécessite que l’utilisateur enregistre le classeur après avoir apporté des modifications, sinon l’indicateur ne sera pas mis à jour.
    Change Z1 et Z2 à ta convenance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Change(ByVal Target As Range)
        ' Mettre à jour la cellule Z1 avec la date et l'heure actuelles chaque fois qu'une modification est apportée à la feuille de calcul
        Me.Range("Z1").Value = Now
    End Sub
    Code : 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
    Sub GenererPDF()
        Dim Chemin As String
        Dim NomFichier As String
        Dim i As Integer
        Dim wb As Workbook
        Dim ws As Worksheet
        Dim DerniereModification As Date
     
        Set wb = ThisWorkbook
        Set ws = wb.ActiveSheet
     
        ' Obtenir la date et l'heure de la dernière modification à partir de la cellule Z1
        DerniereModification = ws.Range("Z1").Value
     
        ' Vérifier si des modifications ont été apportées depuis la dernière génération de PDF
        If DerniereModification <= ws.Range("Z2").Value Then
            MsgBox "Aucune modification n'a été apportée depuis la dernière génération de PDF. La création d'un nouveau PDF n'est pas nécessaire.", vbInformation
            Exit Sub
        End If
     
        ' Chemin du fichier
        Chemin = wb.Path & "\"
     
        ' Nom de base du fichier
        NomFichier = "Planning_"
     
        ' Trouver le prochain numéro de fichier disponible
        i = 1
        While Len(Dir(Chemin & NomFichier & i & ".pdf")) <> 0
            i = i + 1
        Wend
     
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin & NomFichier & i & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
     
        ' Mettre à jour la cellule Z2 avec la date et l'heure actuelles
        ws.Range("Z2").Value = Now
     
         MsgBox "Le fichier PDF a été créé avec succès : " & Chemin & NomFichier & i & ".pdf", vbInformation
     
    End Sub
    Et une macro pour imprimer:

    Code : 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
    Sub Imprimer()
        Dim NomImprimante As String
        Dim ImprimanteParDefaut As String
        Dim Imprimante As Variant
     
        NomImprimante = "Nom exact de l'imprimante sur le réseau"
     
        ImprimanteParDefaut = Application.ActivePrinter
     
        ' Vérifiez si l'imprimante spécifiée est disponible
        For Each Imprimante In Application.Printers
            If Imprimante.DeviceName = NomImprimante Then
                ' Si l'imprimante spécifiée est disponible, utilisez-la pour l'impression
                Application.ActivePrinter = NomImprimante
                Exit For
            End If
        Next Imprimante
     
        ' Si l'imprimante spécifiée n'est pas disponible, utilisez l'imprimante par défaut pour l'impression
        If Application.ActivePrinter <> NomImprimante Then
            Application.ActivePrinter = ImprimanteParDefaut
        End If
     
        ' Imprimez la feuille active
        ActiveSheet.PrintOut
     
    End Sub

  6. #6
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut
    Franc, merci beaucoup pour tes propositions. Celle pour l'impression convient parfaitement. Lors de problèmes de réseau, il arrive qu'aucune imprimante ne soit (temporairement) disponible. Dans ce cas, la macro ne parviendra pas à imprimer. Que faudrait-il ajouter comme code, en fin de macro, pour avertir l'utilisateur et le prévenir que, en ce moment, sa requête n'a pu être satisfaite et lui dire de réessayer plus tard?

    Pour la première macro, qui fait recours aux procédures événementielles, elle me semble être tout à fait adaptée. Ma seule réserve concerne le fait qu'il faille enregistrer pour que l'indication soit prise en compte. Le fichier sera utilisé par des collègues, qui pourraient oublier d'enregistrer. Pourrait-on ajouter, dans la macro qui génère le pdf, une instruction qui comparerait la valeur notée en Z1 à l'ouverture du fichier, et la valeur en Z1 au moment du lancement de la macro. Si les valeurs sont les mêmes, cela signifierait qu'aucune modification n'a été apportée. Dans ce cas seulement, le message indiquant qu'aucune modification n'a été apportée serait lancé et, dans tous les autres cas, la macro créerait un pdf. Je ne suis pas sûr de la procédure à suivre. Je suppose qu'il faudrait, à l'ouverture du fichier, enregistrer la valeur en Z1 quelque part, pour que, lorsque la macro créant un pdf sera utilisé, une comparaison entre la valeur en Z1 à l'ouverture puisse être comparée à sa valeur actuelle. Cette procédure est-elle correcte et, si oui, comment l'insérer dans la macro précécente?

    Merci d'avance et, en attendant, meilleurs voeux pour la nouvelle année!

  7. #7
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 509
    Par défaut
    Salut,
    Ma seule réserve concerne le fait qu'il faille enregistrer pour que l'indication soit prise en compte.
    Non pas d'enregistrement dans ce cas là:
    Z1 est mis à jour sur changement dans la feuille donc ok
    Z2 est mis à jour lors de l'exportation du PDF donc ok

    Tu pourrais faire un test à l'ouverture du classeur et si Z1 est inférieur à Z2 alors tu désactives le bouton d'exportation, ou tu met un message.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création pdf depuis xls avec nom selon valeur d'une cellule
    Par Tom-pouic dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/12/2018, 17h14
  2. [AC-2016] Chemin d'accès d'un fichier PDF qui change de nom toute les semaines
    Par Daniel-Gérald dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/12/2017, 15h28
  3. [OL-2010] Extraire une seule pièce jointe en pdf et changer son nom
    Par cointel dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 28/12/2014, 02h42
  4. Macro enregistrer en pdf : comment mettre un nom défini ?
    Par alexb' dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/01/2014, 09h32
  5. Réponses: 3
    Dernier message: 05/02/2013, 21h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo