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 :

Enregistrer une zone de feuille en pdf avec nom de feuille variable [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 35
    Points : 20
    Points
    20
    Par défaut Enregistrer une zone de feuille en pdf avec nom de feuille variable
    Bonjour,

    J'écris cette fois pour un problème concret.

    J'ai chercher un moyen de d'enregistrer une zone de ma feuille : Sheets("Feuil4").Range("E1:K44") sous format pdf sous un répertoire défini :
    C:\Dossier1\Dossier12.

    Avant des créer ce poste j'ai effectuer divers recherches sur le sujet, et je suis tombé sur cette discussion : http://www.developpez.net/forums/d15...lon-d-cellule/

    J'ai copier le code et j'ai tenté de d'insérer la ligne de code pour l'enregistrement, l'ennui c'est qu'il m'envoie: "erreur 13 incompatibilité des types" à la ligne 6.

    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
    Private Sub CommandButtonExport_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim sNomFichier As String, sNom As String, Rep As Long
     
        sNom = Sheets("Feuil4").Range("X17")
     
        If sNom Then
            Sheets("Feuil4").Select
        ActiveSheet.PageSetup.PrintArea = "$E$1:$K$44"
        ActiveWindow.SelectedSheets.PrintPreview
            sNomFichier = ThisWorkbook.Path & "\" & sNom & ".pdf"
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="R:\Dossier1\Dossier12\sNomFichier", Quality:=xlQualityStandard, _
                                            IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
                                            False
        End If
    End Sub
    Je ne sais pas trop comment faire pour régler ce problème.

    J'avis aussi fait un enregistrement de macro fonctionnel sauf que je n'arrivait pas a faire en sorte que le nom de la feuille soit déterminé par une cellule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ActiveSheet.PageSetup.PrintArea = "$E$1:$K$44"
        ActiveWindow.SelectedSheets.PrintPreview
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
            "C:\Dossier1\Dossier12\Analyse de panne.pdf", _
            Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
            :=False, OpenAfterPublish:=False
    Bonne journée.

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub plage_to_PDF()
        chemin = "C:\Users\polux\Desktop\"
        nom = "Classeur1.pdf"
        Range("B3:D13").ExportAsFixedFormat Type:=xlTypePDF, Filename:=chemin & nom, _
        quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
    End Sub

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Merci patricktoulon,

    Votre code est parfait, j'ai juste remplacé Classeur1.pdf par range("A1") et cela à marcher du premier coup.
    En plus si un fichier porte le même nom il est automatiquement remplacé.

    Merci encore.

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    de rien
    mais je tiens a dire que cela m'a pris 2 secondes et demie pour le faire avec l'enregistreur de macro et nétoyé le code pour l'aménager

    donc essayer l'enregistreur de macro avant de poster

    si tu avais deja essayé l'enregistreur voici une capture d'ecran qui te montre ce que tu a manqué
    quand tu a choisi le format pdf tu clique sur "OPTION" et tu a une nouvelle petite fenetre et la tu clique sur "selection"

    Nom : Capture.JPG
Affichages : 1788
Taille : 121,1 Ko

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    A d'accord je n'avais pas remarqué ce bouton quand j'ai sélectionné le format pdf pendant l'enregistrement de macro.
    Merci pour cette astuce.

  6. #6
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, à titre de précaution et documentaire, rajoute ceci pour vérifier la validité du nom de fichier

    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
    Private Function NomFichierValide(sChaine As String) As Boolean
    Dim i As Long
    Const CaracInterdits As String = """*/:<>?[\]|"
        NomFichierValide = True
        If Len(sChaine) = 0 Then
            NomFichierValide = False
            Exit Function
        End If
        For i = 1 To Len(CaracInterdits)
            If InStr(sChaine, Mid$(CaracInterdits, i, 1)) > 0 Then
                NomFichierValide = False
                Exit Function
            End If
        Next i
    End Function

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Bonjour kiki29,

    Pourrais tu préciser comment le code fait pour vérifier la validité du nom du fichier?
    Parce que : 1) j'ai du mal à voir comment l'intégrer à mon code,
    2) je ne vois pas non plus au premier abord si je dois remplacer certain nom ou variables.
    3) Je ne comprends pas comment il fonctionne (j'ai encore beaucoup à apprendre).
    Mais merci tout de même.

  8. #8
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, au plus simple qqch dans le genre :
    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
    Option Explicit
     
    Sub Tst()
    Dim sNom As String
        sNom = Sheets("Feuil4").Range("X17")
        If NomFichierValide(sNom) Then
            '... on sauvegarde
        Else
            With Sheets("Feuil4")
                .Select
                .Range("X17").Select
            End With
            MsgBox "Nom du fichier incorrect", vbInformation + vbOKOnly
        End If
    End Sub

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Ok cela fonctionne :

    Voilà le code complet pour ceux que cela intéresse :

    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
     Sub Enregistrer_()
    Dim sNom As String
    sNom = Sheets("votrefeuil").Range("votrecellule") ' la cellule porte le nom qui figureras sur votre pdf
        If NomFichierValide(sNom) Then
     chemin = "votredisque:\votredossier\votresousdossier\"
    nom = Sheets("votrefeuil").Range("votrecellule")
        Range("votreplage").ExportAsFixedFormat Type:=xlTypePDF, Filename:=chemin & nom, _ ' le range détermine ce que vous volez que le
     ' pdf montre.
        quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True 
    ' ou false si vous ne voulez pas que adobe vous montre le résultat de votre sauvegarde
        Else
            With Sheets("votrefeuil")
                .Select
                .Range("votrecellule").Select
            End With
            MsgBox "Nom du fichier incorrect", vbInformation + vbOKOnly
        End If
    End Sub
     
    ' on rajoute la fonction
     
    Private Function NomFichierValide(sChaine As String) As Boolean
    Dim i As Long
    Const CaracInterdits As String = """*/:<>?[\]|"
        NomFichierValide = True
        If Len(sChaine) = 0 Then
            NomFichierValide = False
            Exit Function
        End If
        For i = 1 To Len(CaracInterdits)
            If InStr(sChaine, Mid$(CaracInterdits, i, 1)) > 0 Then
                NomFichierValide = False
                Exit Function
            End If
        Next i
    End Function
    Merci kiki29 et patricktoulon pour cette aide.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour kiki29
    on pourrait simplifier ta fonction avec regexp en late binding bien sur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function NomFichierValide(sChaine As String) As Boolean
        Set ReG = CreateObject("VBScript.RegExp")
        With ReG: .Pattern = "[?||;|:|\\|/|<|>|=|!|]":  NomFichierValide = IIf(ReG.test(sChaine), False, True): End With
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub testo()
        MsgBox NomFichierValide("blablablabla") 'renvoie vrai 
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub testo()
        MsgBox NomFichierValide("bla?bla!..\blabla") 'renvoie faux
    End Sub
    on peut meme organiser le pattern comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Pattern = "[!?\\/.,=+*#&]":

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    buleur@
    ce qui est bien c'est que tu semble avoir compris le shmilblick mais en ce qui concerne le code c'est moyen !
    j'ai simplement copier coler dans l'editeur et je suis deja dans le rouge

    ensuite tu part ,tu reviens dans ta macro des va et viens inutiles

    il est possible de simplifier tout cela

    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Enregistrer_()
        Dim cel, chemin
        chemin = "votredisque:\votredossier\votresousdossier\"
        Set cel = Sheets("votrefeuil").Range("votrecellule")    ' la cellule porte le nom qui figureras sur votre pdf
        If NomFichierValide(cel.Value) Then
            Range("votreplage").ExportAsFixedFormat Type:=xlTypePDF, Filename:=chemin & cel.Value, quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
        Else
            Sheets(cel.Parent.Name).Activate: cel.Select
            MsgBox "Nom du fichier incorrect", vbInformation + vbOKOnly
        End If
    End Sub

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    J'ai appliqué votre "correctif" et ça fonctionne toujours bien.

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    le quel correctif
    la sub ou la fonction ou les deux

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    bonjour kiki29
    on pourrait simplifier ta fonction avec regexp en late binding bien sur !
    Si cela vous dérange pas, pourriez vous expliquer cette "méthode" "d'expressions rationnelles en liaisons tardives"?

    et pour le correctif je parle du sub

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re

    Une expression rationnelle, ou expression régulière (traduction de l'anglais regular expression), est, en informatique, une chaîne de caractères que l’on appelle parfois un motif(inscrit dans le Pattern) et qui décrit un ensemble de chaînes de caractères possibles selon une syntaxe précise
    en vba on le gere avec la bibliothèque Microsoft VBScript Regular Expressions

    perso je prefere le late binding pour ne pas avoir a activer des references

    en fait comment ca marche
    l'argumentation se trouve dans le patern
    selon la fonction utilisée (test,execute,replace) la fonction peut fonctionner différement

    ici dans notre cas que cherchons nous

    on cherche tout symbole qui pourrais engendrer une erreur ou une mauvaise interpretation dans le chemin complet d'un fichier

    exemple
    nom="bidule,\.xls"

    si je fait trucmachin chose saves as "c:\ " & bidule il va chercher le dossier bidule dans c hors il n'existe pas

    donc avec les expression reguliere et donc dans notre cas la fonction test va chercher dans la valeur si un ou plusieur des caracteres precisés dans le ".patern" et presente

    quelle est l'avantage
    moins de code (plus de boucle) comme dans la version de Kiki29

    et aussi on peut parametrer la facon dont la fonction peut interpréter le patern avec d'autre arguments mais c'est assez complexe quand on debarque
    alors voila le lien de l'exellent tutoriel de cafeine qui est assez complet pour un debut
    http://cafeine.developpez.com/access/tutoriel/regexp/

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

Discussions similaires

  1. [XL-2003] Macro pour imprimer en pdf avec nom de fichiers variables
    Par YoTaPi dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/07/2014, 18h50
  2. Remplir une zone fermée d'un dessin avec une texture
    Par elfdav dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/03/2009, 02h15
  3. Réponses: 4
    Dernier message: 16/12/2008, 17h13
  4. faire un publipostage en PDF avec nom d'enregistrement
    Par Bernard67 dans le forum VBA Word
    Réponses: 31
    Dernier message: 01/02/2008, 20h51
  5. Réponses: 10
    Dernier message: 27/03/2007, 20h19

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