Générer des fichiers PDF

Bonjour à tous.

Je reviens encore une fois vers vous pour que vous m'aidiez à construire une macro.

J'ai deux fichiers, que je vous trouverez en pièce jointe :

- Le fichier "Extrait.xls"

Il comprend 3 onglets :

L'onglet "Sélection", qui permet de sélectionner 3 territoires (un principal et 2 de comparaison). Sur la droite, les trois tableaux que vous voyez sont les "synthèses" des chiffres pour le territoire donné. En gros, on met "Paris" en territoire, le fichier va chercher comme un grand dans la Base de données, les données UNIQUEMENT pour Paris.

L'onglet "Base", C'est donc la base de données à laquelle est lié le premier onglet

L'onglet "Listes", qui me permet juste de créer les listes déroulantes

- Le fichier "formefichesimple.xlsm"

C'est tout simplement le résultat mis en forme des tableaux situés sur la partie droite de l'onglet "Sélection" du fichier précédent. Une liaison simple (du genre =[Extrait.xls]SELECTION!$L8) permet de remplir automatiquement l'ensemble des champs de la feuille à partir du premier fichier.

Je vous expose mon objectif :

Dans L'onglet "Sélection", si vous sélectionnez en territoire principale, un EPCI, un petit tableau à partir de la ligne 25 fera apparaître les caractéristiques de l'EPCI en question : nombre de communes et la liste (merci Amadéus !!!).

A partir de cette liste, je voudrai (par simple pression d'un petit bouton) alors générer automatiquement au format PDF l'ensemble des fiches communes (formefichessimple.xlsm) en les stockant dans un même répertoire.

Et là, je suis complètement larguée. Question VBA, je ne sais pas faire grand chose (si ce n'est pour dire rien... A part changer la couleur du texte, YOLO !).

Par avance, merci de vos contributions futures Si jamais je n'ai pas été assez claire, je peux vous re-expliquer.

62extrait.zip (27.31 Ko)

Bonjour

Un essai à tester.

Le fichier doit être enregistré au moins sur le bureau et les fichiers créés viendront dans le même dossier que lui.

Cela te convient-il ?

Bye !

88extrait-v1.xlsm (50.16 Ko)

Bonsoir !

Merci de ton implication

Le fichier de base est enregistré dans un dossier, sur le serveur. Cela posera t-il problème ?

Quand j'essaies de lancer la macro sur mon ordinateur personnel, ça m'affiche un message d'erreur.

Pour info, je tourne sous Excel2007 chez moi et Excel2010 au boulot.

Pixelle a écrit :

Le fichier de base est enregistré dans un dossier, sur le serveur. Cela posera t-il problème ?

Comment le saurais-je ? Fais l'essai !

ça m'affiche un message d'erreur

La réponse ne contient-elle pas la solution : Es-tu sûr que les macros soient bien activées ?

Bye !

Oui ok, je devais pas avoir les yeux en face des trous hier soir. Ca fonctionne bien.

Ca fonctionne du tonnerre ! Merci beaucoup. J'aurai probablement d'autres questions par rapport à cela quand je le mettrai en place la semaine prochaine.

Bonjour, bonjour.

Je suis en train de travailler sur le code fourni pour le transposer sur mon fichier original. Et j'ai quelques petits problèmes. On va y aller au fut et à mesure

Petit point que je n'arrive pas à résoudre pour le moment : Le nom de la commune et le nom de l'EPCI sont inversés.

En M37 : je voudrai le nom de l'EPCI

En B24 : je voudrai le nom de la commune

- - - - - -

De plus, je ne comprends pas trop le passage :

For Each c In Range("B28:B34" & Range("B65536").End(xlUp).Row)
        If c.Value <> "" Then
            Sheets("FicheTerr").Visible = True
            Sheets("FicheTerr").Copy Before:=Sheets(1)
            ActiveSheet.Name = c.Offset(0, 1)
            Set fC = ActiveSheet
            Sheets("FicheTerr").Visible = False

Entre autre, la ligne ActiveSheet.Name = c.Offset(0, 1).

Merci de vos futures réponses !

Bonjour

Nouvelle version.

Les explications demandées sont sur la macro.

Bye !

83extrait-v2.xlsm (51.49 Ko)

Merci je comprends mieux !

J'ai transposé la macro sur le vrai fichier, les onglets ont les mêmes dénominations que sur l'extrait que j'ai envoyé. Malgré tout, on m'indique une erreur à ce niveau, en me disant que "L'indice n'appartient pas à la sélection":

 Sheets("FicheTerr").Visible = True 

Aussi, je me demande pourquoi, dans le fichier essai, la liaison se fait très bien et pas dans mon vrai fichier. Je dis peut être une bêtise, mais on ne déclare pas dans quel classeur se trouve l'onglet "FicheTerr". Ou alors, on le déclare avant et je ne le vois pas ?

Merci par avance pour vos réponses. Je suis désolée de vous assommer de questions.

Bonjour

Pixelle a écrit :

J'ai transposé la macro sur le vrai fichier, les onglets ont les mêmes dénominations que sur l'extrait que j'ai envoyé. Malgré tout, on m'indique une erreur à ce niveau, en me disant que "L'indice n'appartient pas à la sélection":

Je pense que tu n'as pas créé la feuille modèle "FicheTerr" dans ton nouveau fichier, ou alors tu ne lui as pas donné le bon nom.

Pour créer cette feuille, il te faut dupliquer une feuille déjà remplie, effacer toutes les données et ne garder que les titres et formats de cellules, et renommer cette feuille (double clic sur l'onglet) :"FicheTerr"

Si tu as toujours le message, joins ton vrai dossier ...

Bye !

Bonjour !

La feuille du modèle est un classeur à part. Du coup, j'ai tenté ce code, qui m'oblige à avoir le classeur "fiches communales" ouvert :

 Set fD = ActiveSheet                                              
    Set fB = Workbooks("BDD.xlsm").Sheets("BASE")                                        
    For Each c In Range("B28:B" & Range("B65536").End(xlUp).Row)    

        If c.Value <> "" Then                                         
            Workbooks("fiches communales.xlsm").Sheets("FicheTerr").Visible = True                       
            Workbooks("fiches communales.xlsm").Sheets("FicheTerr").Copy Before:=Sheets(1)                 
            ActiveSheet.Name = c.Offset(0, 1)                         
            Set fC = ActiveSheet                                     
            Workbooks("fiches communales.xlsm").Sheets("FicheTerr").Visible = False                         
            

Ca me créé bien la nouvelle fiche (même si la macro met 3 ans à créer le PDF), j'en conclus que mon code est bon.... Mais avec des couleurs différentes de mon document "modèle" et des sauts de page qui ne correspondent pas à ceux présents dans le doc modèle.

Pour ce qui est de l'envoi du fichier original. Je crains avoir quelques difficultés d'exportation. C'est un fichier relativement lourd et le forum ne permet pas l'envoi de fichiers aussi lourds. Si jamais je tourne en rond, je te le ferai passer en zip, via Message privé si cela ne te pose pas de problème.

Pixelle a écrit :

La feuille du modèle est un classeur à part.

Mais pourquoi ne mets-tu pas le modèle dans ton fichier "BDD". C'est une feuille qui n'est pas modifiée puisqu'elle ne contient qu'une trame...

Pour ce qui est de l'envoi du fichier original. Je crains avoir quelques difficultés d'exportation. C'est un fichier relativement lourd

Alors, passe par http://www.cjoint.com cela marche très bien.

Bye !

C'est l'une de mes contraintes, justement : avoir d'un coté ma base de données et de l'autre mon fichier modèle. Je demanderai pourquoi on ne peut pas regrouper le modèle avec la base, il doit probablement y avoir une raison.

Ci-dessous, tu trouveras les deux fichiers :

La fiche modèle: (Liée à la base de données, c'est donc normal qu'elle contienne des valeurs)

La base de données:

Merci pour ta patience et le temps que tu passes dessus.

Je re-up le sujet pour une aide par rapport aux boucles de remplissage.

Dans la macro test que j'ai reçu, j'avais cela :

For Each cell In fB.Range("E3:E" & fB.Range("E3").End(xlDown).Row)
                If cell = fD.Range("B6") Then
                    For i = 5 To 8
                        fC.Cells(41, i) = fC.Cells(41, i) + cell.Offset(0, i - 4)   'pop sans double compte
                        fC.Cells(46, i) = fC.Cells(46, i) + cell.Offset(0, i)       'pop ménages
                        fC.Cells(47, i) = fC.Cells(47, i) + cell.Offset(0, i + 4)   'nbre ménages
                    Next i
                End If
            Next cell

je l'ai adapté à mon fichier :

 For Each cell In fB.Range("A3:A" & fB.Range("A1053").End(xlDown).Row)
                If cell = c.Offset(1, 0) Then
                    For i = 5 To 8
                        fC.Cells(41, i) = fC.Cells(41, i) + cell.Offset(0, i - 4)   'pop sans double compte
                        fC.Cells(46, i) = fC.Cells(46, i) + cell.Offset(0, i)       'pop ménages
                        fC.Cells(47, i) = fC.Cells(47, i) + cell.Offset(0, i + 4)   'nbre ménages
                    Next i
                End If
            Next cell

Mais une erreur se produit à la première ligne :

 fC.Cells(41, i) = fC.Cells(41, i) + cell.Offset(0, i - 4)   'pop sans double compte

De plus, j'ai du mal à comprendre l'égalité dans ce dernier code.

Pourrais-je avoir des explications ? Comment fait-il pour aller chercher dans la base, la colonne suivante ?

Note à part : Quand le PDF se génère, les couleurs du modèle ne sont pas gardées, comment y remédier ?

Bonjour

Pixelle a écrit :

Mais une erreur se produit à la première ligne :

Tu ne m’as pas joint le fichier avec ta macro ‘’adaptée’’.

Il m'est donc très difficile de détecter le bug.

fC.Cells(41, i) = fC.Cells(41, i) + cell.Offset(0, i - 4) 'pop sans double compte

De plus, j'ai du mal à comprendre l'égalité dans ce dernier code.

La cellule ‘’ fC.Cells(41, i)’’ est une cellule de la fiche modèle. Elle est à ligne 41 et à la colonne i, sachant que i va prendre successivement les valeurs 5 à 8

La cellule cell est une cellule de la colonne E de la feuille ‘’BASE’’ (Nom_ECPI5)

Au 1° tour de boucle, la cellule ‘’fC.Cells(41, i)’’ est à la ligne 41, colonne 5 de la feuille Modèle. Sa valeur vaut sa valeur intiale soit 0 (au départ, elle est vide) + la valeur qu’on trouve dans cellule ‘’Cell’’ de la feuille ‘’BASE’’ décalée de zéro ligne et de (i -4 soit 1) colonnes vers la gauche : c’est-à-dire la valeur de’’pop 1990’’.

Au deuxième tout de boucle, cette cellule va se déplacer et sera toujours à la ligne 41 mais à la colonne: elle vaudra la valeur la valeur de la cellule voisine dans ‘’BASE’’ (pop_1999).

Et après les 4 tours de boucles les 4 cellules de la ligne 41 de la fiche modèle seront remplies.

OK ?

Bye !

Compris chef !

J'ai cependant un dernier petit problème dans l'export en format PDF : Il ne garde pas en mémoire les couleurs de la fiche modèle.

A noter que lors de la copie de la Fiche Modèle dans la classeur "Base de Données", j'avais déjà rencontré ce problème, que j'avais réparé avec la macro suivante :

Sub importcouleur()
Workbooks("Base de données.xlsm").Colors = Workbooks("Fiches communales.xlsm").Colors
End Sub

Bonjour

OK

Ton instruction est bonne.

Il suffit donc de l'ajouter dans la macro :

            'On enregistre la nouvelle feuille dans un fichier PDF
            ActiveSheet.Copy
            ActiveWorkbook.Colors = Workbooks("Extrait v2.xlsm").Color     '--> adapter si besoin le nom du fichier qui contient la macro
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & c.Offset(0, 1)

Bye !

Reup.

Ouuuh ! C'est parfait !

Tout fonctionne comme je le souhaite.

Merci énormément pour toute l'aide que tu m'as apporté.

A bientôt !

Rechercher des sujets similaires à "generer fichiers pdf"