XL 2010 Comment gérer une impression ciblée

micheldu52

XLDnaute Occasionnel
Bonjour,

Je tourne "un peu" (beaucoup...) en rond, help me !!! Merci d'avance si vous essayez de trouver, et merci encore plus .... si vous trouvez !

J'ai joins un fichier simpliste (la réalité est nettement plus complexe mais ma difficulté se résume à cela).

Ma question est :

Comment, sur la base des sélections faite par l'usager en K5 K6 (qui génèrent la sélection des fiches correspondantes) faire imprimer la fiche (très simplifiée) qui figure en A10/D17 (pour information la "vraie" fiche sera sur un onglet spécifique et contiendra des centaines d'informations) ?

La question de l'impression (déclenchée par exemple par appui sur le cadre texte "lancer l'impression") devra se décliner, selon le choix de l'utilisateur (en D6) par

* une impression directe sur l'imprimante (de chaque fiche les unes après les autres) - ici c'est une impression "à l'ancienne" sur papier
* un pdf global de x pages (dans l'exemple 2, mais dans la réalité, plusieurs centaines), si le nom est paramétrable c'est encore mieux mais pas indispensable
* la création d'un pdf par fiche avec un nom spécifique (disons le contenu de la colonne j, donc dans l'exemple AIMAR.XLS puis OMALIE.XLS (dans la réalité plusieurs centaines qui seront ensuite reprises par un publipostage à chaque destinataire de la fiche qui le concerne, ça c'est "réglé déjà)

Merci pour votre aide, mes essais de macro ne fonctionnent pas et je m'y perds...

Pour la petite histoire les noms dans le fichier sont tous des jeux de mots...

Bien cordialement,

Michel
 

Pièces jointes

  • impressions ciblees.xlsx
    10.6 KB · Affichages: 7
Solution
Ah oui pardon, j'ai corrigé le post #9 et le fichier (2).

Maintenant si l'on veut des fichiers XLS au lieu des PDF voyez ce fichier (3) et la macro :
VB:
Sub Fichier_XLS()
Dim chemin$, ville$, loisirs$, tablo, i&, n%
chemin = ThisWorkbook.Path & "\" 'dossier à adapter
ville = [K5]: loisirs = [K6]
tablo = [J27].CurrentRegion.Resize(, 4) 'matrice, plus rapide
Application.ScreenUpdating = False
[C13:C16] = "" 'RAZ
For i = 2 To UBound(tablo)
    If (tablo(i, 3) = ville Or ville = "non précisé") And (tablo(i, 4) = loisirs Or loisirs = "non précisé") Then
        Range("C13") = tablo(i, 2)
        Range("C14") = tablo(i, 1)
        Range("C15") = tablo(i, 3)
        Range("C16") = tablo(i, 4)
        [A10:D17].Copy...

micheldu52

XLDnaute Occasionnel
oups... je reformule, désolé ! (xls pas pdf à un endroit)

Bonjour,

Je tourne "un peu" (beaucoup...) en rond, help me !!! Merci d'avance si vous essayez de trouver, et merci encore plus .... si vous trouvez !

J'ai joins un fichier simpliste (la réalité est nettement plus complexe mais ma difficulté se résume à cela).

Ma question est :

Comment, sur la base des sélections faites par l'usager en K5 K6 (qui génèrent la sélection des fiches correspondantes) faire imprimer la fiche (très simplifiée) qui figure en A10/D17 (pour information la "vraie" fiche sera sur un onglet spécifique et contiendra des centaines d'informations) ?

La question de l'impression (déclenchée par exemple par appui sur le cadre texte "lancer l'impression") devra se décliner, selon le choix de l'utilisateur (en D6) par

* une impression directe sur l'imprimante (de chaque fiche les unes après les autres) - ici c'est une impression "à l'ancienne" sur papier
* un pdf global de x pages (dans l'exemple 2, mais dans la réalité, plusieurs centaines), si le nom est paramétrable c'est encore mieux mais pas indispensable
* la création d'un xls par fiche avec un nom spécifique (disons le contenu de la colonne j, donc dans l'exemple AIMAR.XLS puis OMALIE.XLS (dans la réalité plusieurs centaines qui seront ensuite reprises par un publipostage à chaque destinataire de la fiche qui le concerne, ça c'est "réglé déjà)

Merci pour votre aide, mes essais de macro ne fonctionnent pas et je m'y perds...

Pour la petite histoire les noms dans le fichier sont tous des jeux de mots...

Bien cordialement,

Michel
 

micheldu52

XLDnaute Occasionnel
Bonjour,
Merci pour l'intérêt porté à ma demande.
Le vrai fichier, outre sa taille "énorme" est couvert par le secret professionnel.
le fichier joint en exemple cible la "seule" pièce manquante (à vrai dire après il y aura un autre étage, mais ce n'est pas le moment) à l'édifice.
Si ce fichier, pour être simplifié à l'extrême, est résolu, je saurais l'adapter à la vraie réalité.
Si mon explication, sur la base de ce fichier, n'est pas assez claire, il ne faut pas hésiter à me le dire.
La clef de voute réside dans l'automatisation d'un onglet rempli "fiche par fiche" (ici mes noms de personne leur ville et leur loisir) qui doit constituer "le document final" (un document unique d'un seul onglet personnalisé à chaque fois avec un nom automatisé, nom issu d'une des colonnes (ici la colonne avec le nom mais peu importe je mettrais les bonnes info pour le nom de fichier -par concaténation des bonnes sources-) qui sera repris lors du publipostage personnalisé (chaque personne aura "son" fichier (c'est à un onglet XLS pré-renseigné) avec "ses propres informations personnalisées".
Je peux donc, si vous le souhaitez, vous mettre aussi un fichier type, mais ce "ne sera" que le cadre avec A10/D17 déposé dans un onglet d'un nouveau fichier (c'est ce fichier qui doit avoir le nom, par exemple, aimar.xls.
La macro devra, à mon avis, prévoir un "copier/collage spécial valeur" avant enregistrement de chaque fichier pour éviter une erreur en ouverture sur un ordinateur ne disposant que de ce simple fichier (et pas de ma source).
Suis-je plus clair?
Faut-il que je poste le fichier "final" (pour l'usager) dont je viens de parler?

Bien cordialement et en renouvellant mes remerciements!
Michel
 

job75

XLDnaute Barbatruc
Si ce fichier, pour être simplifié à l'extrême, est résolu, je saurais l'adapter à la vraie réalité.
Très bien alors voyez le fichier joint et ces macros :
VB:
Option Compare Text 'la casse est ignorée

Sub Imprimer() 'bouton Imprimer
If [D6] = "imprimante" Then Imprimante
If [D6] Like "un pdf*" Then PDF
If [D6] Like "*global*" Then PDF_Global
End Sub

Sub Imprimante()
Dim ville$, loisirs$, tablo, i&, n%
ville = [K5]: loisirs = [K6]
tablo = [J27].CurrentRegion.Resize(, 4) 'matrice, plus rapide
[C13:C16] = "" 'RAZ
For i = 2 To UBound(tablo)
    If tablo(i, 3) = ville And tablo(i, 4) = loisirs Then
        Range("C13") = tablo(i, 2)
        Range("C14") = tablo(i, 1)
        Range("C15") = ville
        Range("C16") = loisirs
        ActiveSheet.PageSetup.PrintArea = "$A$10:$D$17"
        ActiveSheet.PrintPreview 'pour tester
        'ActiveSheet.PrintOut 'pour imprimer
        n = n + 1
        Range("D8") = n
    End If
Next
If n Then MsgBox n & " fiche" & IIf(n > 1, "s", "") & " imprimée" & IIf(n > 1, "s", ""), , "Imprimante"
End Sub

Sub PDF()
Dim chemin$, ville$, loisirs$, tablo, i&, n%
chemin = ThisWorkbook.Path & "\" 'dossier à adapter
ville = [K5]: loisirs = [K6]
tablo = [J27].CurrentRegion.Resize(, 4) 'matrice, plus rapide
Application.ScreenUpdating = False
[C13:C16] = "" 'RAZ
For i = 2 To UBound(tablo)
    If tablo(i, 3) = ville And tablo(i, 4) = loisirs Then
        Range("C13") = tablo(i, 2)
        Range("C14") = tablo(i, 1)
        Range("C15") = ville
        Range("C16") = loisirs
        ActiveSheet.PageSetup.PrintArea = "$A$10:$D$17"
        ActiveSheet.ExportAsFixedFormat xlTypePDF, chemin & tablo(i, 1) & " " & tablo(i, 2) & " " & Format(Now, "yyyy-mm-dd hhmm")
        n = n + 1
        Range("D8") = n
    End If
Next
Application.ScreenUpdating = True
If n Then MsgBox n & " fichier" & IIf(n > 1, "s", "") & " PDF créé" & IIf(n > 1, "s", ""), , "PDF"
End Sub

Sub PDF_Global()
Dim chemin$, ville$, loisirs$, tablo, i&, n%
chemin = ThisWorkbook.Path & "\" 'dossier à adapter
ville = [K5]: loisirs = [K6]
tablo = [J27].CurrentRegion.Resize(, 4) 'matrice, plus rapide
Application.ScreenUpdating = False
[C13:C16] = "" 'RAZ
[A10:D17].Copy
Workbooks.Add.Sheets(1).Paste 'documen auxiliaire
Application.CutCopyMode = 0
For i = 2 To UBound(tablo)
    If tablo(i, 3) = ville And tablo(i, 4) = loisirs Then
        If n Then Range("A1:D8").Copy Range("A1").Offset(n)
        Range("C4").Offset(n) = tablo(i, 2)
        Range("C5").Offset(n) = tablo(i, 1)
        Range("C6").Offset(n) = ville
        Range("C7").Offset(n) = loisirs
        n = n + 9
    End If
Next
ActiveSheet.ExportAsFixedFormat xlTypePDF, chemin & "PDF global " & Format(Now, "yyyy-mm-dd hhmm")
ActiveWorkbook.Close False
n = n / 9
Application.ScreenUpdating = True
If n Then MsgBox n & " fiche" & IIf(n > 1, "s", "") & " créée" & IIf(n > 1, "s", ""), , "PDF global"
End Sub
 

Pièces jointes

  • impressions ciblees(1).xlsm
    24.6 KB · Affichages: 2

micheldu52

XLDnaute Occasionnel
Merci beaucoup!
Cela me permet d'avancer

J'ai cependant l'impression (j'ai suivi au pas à pas détaillé) que

If tablo(i, 3) = ville And tablo(i, 4) = loisirs Then...

n'est jamais vérifié (la suite du then n'est pas déclenchée) pour aucun des 9 cas sans que je n'arrive à comprendre pourquoi....
si je neutralise ce if il créé bien neuf pdf sinon (mais bien sur sans tenir compte de la condition!)

Par ailleurs, dans mon message qui commence par oups! j'ai modifié une erreur, les fichiers "individuels" que j'ai besoin de créer sont (dans ce cas) des xls pas des pdf

Merci pour ton aide !

Bien cordialement,

ML
 

job75

XLDnaute Barbatruc
J'ai cependant l'impression (j'ai suivi au pas à pas détaillé) que

If tablo(i, 3) = ville And tablo(i, 4) = loisirs Then...

n'est jamais vérifié (la suite du then n'est pas déclenchée) pour aucun des 9 cas sans que je n'arrive à comprendre pourquoi...
Attention il faut que le fichier soit comme celui du post #6 : il ne doit y avoir aucune valeur dans la plage I27:I36 (j'ai effacé les formules qui s'y trouvaient).

Sinon bien sûr on fausse la plage [J27].CurrentRegion.
 

job75

XLDnaute Barbatruc
Je suppose que quand K5 ou K6 sont "non précisé" il faut prendre toutes les valeurs.

Alors voyez ce fichier (2) avec le test complété :
VB:
    If (tablo(i, 3) = ville Or ville = "non précisé") And (tablo(i, 4) = loisirs Or loisirs = "non précisé") Then
 

Pièces jointes

  • impressions ciblees(2).xlsm
    25.3 KB · Affichages: 1
Dernière édition:

micheldu52

XLDnaute Occasionnel
Autant pour moi....
effectivement !!! ca marche ! désolé je n'avais pas pensé à cela!

Peux-tu me dire comment non pas créer un pdf mais un xls pour chaque fiche (avec un seul onglet qui "contient" les infos des pdf individuels générés pour l'instant?

grand merci pour ton aide
 

micheldu52

XLDnaute Occasionnel
Merci j'ai juste modifié ainsi pour que le "non précisé" soit pris en charge:

If (tablo(i, 3) = ville Or [K5] = "non précisé") And (tablo(i, 4) = loisirs Or [K6] = "non précisé") Then

et cela marche nickel
Je vais intégrer cela demain au bureau sur le "vrai fichier"

Peux-tu me dire comment non générer des pdf mais des xls ? (le menu déroulant en D6 aurait dû le prévoir...

Encore merci, j'avance bien grâce à toi !
 

job75

XLDnaute Barbatruc
Ah oui pardon, j'ai corrigé le post #9 et le fichier (2).

Maintenant si l'on veut des fichiers XLS au lieu des PDF voyez ce fichier (3) et la macro :
VB:
Sub Fichier_XLS()
Dim chemin$, ville$, loisirs$, tablo, i&, n%
chemin = ThisWorkbook.Path & "\" 'dossier à adapter
ville = [K5]: loisirs = [K6]
tablo = [J27].CurrentRegion.Resize(, 4) 'matrice, plus rapide
Application.ScreenUpdating = False
[C13:C16] = "" 'RAZ
For i = 2 To UBound(tablo)
    If (tablo(i, 3) = ville Or ville = "non précisé") And (tablo(i, 4) = loisirs Or loisirs = "non précisé") Then
        Range("C13") = tablo(i, 2)
        Range("C14") = tablo(i, 1)
        Range("C15") = tablo(i, 3)
        Range("C16") = tablo(i, 4)
        [A10:D17].Copy
        Workbooks.Add(xlWBATWorksheet).Sheets(1).Paste 'documen auxiliaire
        Application.CutCopyMode = 0
        [A1].Select
        ActiveWorkbook.SaveAs chemin & tablo(i, 1) & " " & tablo(i, 2) & Format(Now, " yyyy-mm-dd hhmm"), 56 'fichier xls
        ActiveWorkbook.Close False
        n = n + 1
        Range("D8") = n
    End If
Next
Application.ScreenUpdating = True
If n Then MsgBox n & " fichier" & IIf(n > 1, "s", "") & " XLS créé" & IIf(n > 1, "s", ""), , "Fichier XLS"
End Sub
Bonne nuit.
 

Pièces jointes

  • impressions ciblees(3).xlsm
    26 KB · Affichages: 1
Dernière édition:

micheldu52

XLDnaute Occasionnel
Nickel chrome! (avec juste la même correction sur le "non précisé)
Un grand merci, j'utilise ca demain dans le "vrai" fichier !!!
Impec ca va me permettre d'avancer fort....
Je pourrais ensuite m'attaquer à mon problème suivant :
il faut que je trouve "un truc" pour que chaque utilisateur après avoir vérifié et modifié "sa fiche" puisse la déposer sur notre serveur (via une DMZ probablement) et que mon fichier de retour vérifie ceux qui ne sont pas déposés (relance) et vérifie si ceux qui ont déposé ont modifié telle ou telle donnée pour mise à jour de la BDD centrale, le tout "automatiquement"... prochain "os à ronger" mais c'est une autre histoire.... car un millier de fichier xls en retour à gérer le plus automatiquement possible!
En tout cas ton aide m'a fait faire un bon en avant, encore une fois merci!
Bien cordialement
 
Haut Bas