Re,
Pourquoi ne pas utiliser la boite de dialogue xlDialogPrint où tu à la possibilité de définir l'imprimante et le nombres de copies
Version imprimable
Re,
Pourquoi ne pas utiliser la boite de dialogue xlDialogPrint où tu à la possibilité de définir l'imprimante et le nombres de copies
Merci pour vos messages,
J'ai gardé la solution de Franc, qui fonctionne bien. Elle permet de préciser l'imprimante souhaitée, puis dans la foulée d'indiquer le nombre de pages à imprimer. Excel détecte à présent correctement les changements de valeur sur la feuille. Encore une précision: comment dire à Excel, dans le module Change, que la valeur en Z1 doit intervenir seulement si des changements ont été effectués sur la partie qui sera imprimée (ou passée en pdf)? Imaginons que celle-ci soit nommée "zone_à_imprimer". Si l'utilisateur modifie quelque chose dans cette zone (et dans cette zone seulement), Z1 doit changer. Si l'utilisateur fait un changement hors de cette zone, Z1 ne doit pas réagir? Merci d'avance
Bonjour, voici comment on peut faire:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Private Sub Worksheet_Change(ByVal Target As Range) Dim ZoneAImprimer As Range ' Définir la zone à imprimer Set ZoneAImprimer = Me.Range("zone_à_imprimer") ' Vérifier si la plage modifiée se trouve à l'intérieur de la zone à imprimer If Not Intersect(Target, ZoneAImprimer) Is Nothing Then ' Désactiver temporairement les événements de la feuille de calcul Application.EnableEvents = False ' Mettre à jour la cellule Z1 avec la date et l'heure actuelles Me.Range("Z1").Value = Now ' Réactiver les événements de la feuille de calcul Application.EnableEvents = True End If End Sub
Franc, merci une fois encore, la solution fonctionne très bien et la procédure événementielle Change ne s'active que lorsque des changements sont survenus dans la zone souhaitée!
Je te suis d'autant plus reconnaissant que ma demande d'aide a commencé avec une question, puis une autre, puis une troisième...
J'ai pu finaliser mon projet, qui fonctionne comme je le souhaitais initialement!
Merci beaucoup! Je te rendrais volontiers la pareille, mais au vu de mes connaissances en vba, cela n'a aucune chance de se produire...
Je me permets de revenir vers vous, car j'ai encore une difficulté. J'aimerais régler le pied-de-page pour que vba définissse son libellé exact. Par exemple, s'il s'agit de certains utilisateurs, le pied-de-page devrait afficher le texte "planning -" avec les initiales du collègue (par exemple, "planning-pb"), suivi de la date d'aujourd'hui. S'il s'agit de n'importe quel autre utilisateur, il doit afficher la même chose, mais sans ses initiales (exemple "planning 10.01.2024"). J'ai fait des essais avec l'instruction .UserName (If nom collègue 1, ElseIf nom collègue 2, ElseIf nom collègue 3, puis Else pour tous les autres collègues), mais c'est comme si la mise à jour ne se faisait pas.
Je précise que la macro se trouve dans ThisWorkbook, avec le module BeforePrint. C'est au moment du lancement d'impression que le texte exact doit se noter dans le pied-de-page.
Merci pour toute piste utile!
Salut, sans voir ta macro je ne sais pas s'il y a une erreur. Teste ceci et fait les adaptations nécessaires.
Code:
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 Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim ws As Worksheet Dim NomUtilisateur As String Dim PiedDePage As String ' Définir la feuille de calcul Set ws = ActiveSheet 'modifier si besoin NomUtilisateur = Application.UserName ' Définir le pied de page en fonction du nom de l'utilisateur If NomUtilisateur = "Nom collègue 1" Then PiedDePage = "Planning - PB " & Format(Date, "dd.mm.yyyy") ElseIf NomUtilisateur = "Nom collègue 2" Then PiedDePage = "Planning - XY " & Format(Date, "dd.mm.yyyy") ElseIf NomUtilisateur = "Nom collègue 3" Then PiedDePage = "Planning - ZZ " & Format(Date, "dd.mm.yyyy") Else PiedDePage = "Planning " & Format(Date, "dd.mm.yyyy") End If ' Définir le pied de page de la feuille de calcul ws.PageSetup.CenterFooter = PiedDePage End Sub
Franc, merci pour ta proposition. J'ai adapté la macro... mais elle ne ne mentionne pas le pied-de-page voulu. J'ai placé un bouton Imprimer sur la feuille. Lorsque l'utilisateur clique dessus, cela lancera la macro d'impression (adaptée) que tu m'avais suggérée le 3.01. L'option BeforePrint permettait de m'assurer que, même si l'utilisateur ne passait pas par le bouton Imprimer, mais choisissait la commande Imprimer, le pied-de-page serait tout de même imprimé. En suivant la macro pas à pas, j'observe qu'elle fonctionne correctement, va jusqu'à l'impression, puis déclenche la macro placée dans BeforePrint. Apparemment de manière correcte, en choisissant le bon nom de collègue et sans message d'erreur. Mais lorsque je regarde ensuite dans Mise en page, je vois que le pied-de-page n'est pas mentionné.
As-tu une idée sur ce qui fait que le pied-de-page n'apparaît pas?
Salut,
Deux choses :
- Attention avec cela
Code:Set ws = ActiveSheet 'modifier si besoin
être sûr que l'on est sur la bonne feuille. Il vaut mieux utiliser son CodeName.
- Mettre un Debug.Print pour voir la valeur de PiedDePage
Code:
1
2
3 ' Définir le pied de page de la feuille de calculs. Debug.Print PiedDePage PageSetup.CenterFooter = PiedDePage
Franc,
Set ws = ActiveSheet peut-il poser problème, sachant que le fichier n'a qu'une feuille affichée? Il y en a une deuxième, masquée, qui ne contient que 2-3 informations, pas impliquées dans les formules.
Je ne connaissais pas Debug.Print. D'après ce que j'ai compris, l'instruction sert à savoir si la macro se comporte correctement. C'est bien cela qui m'étonne: un clic sur le bouton Imprimer lance la macro avec sélection de l'imprimante, choix du nombre de pages à imprimer, puis elle lance l'impression... et ce n'est qu'ensuite qu'elle active BeforePrint (j'ai même rajouté dans la macro Imprimer, en première position, Application.EnableEvents = True, pour être sûr que les procédures événementielles soient bien actives?) C'est un peu comme si l'instruction contenue dans BeforePrint, qui règle par vba le texte exact du pied-de-page personnalisé, arrive trop tard.
La seconde chose qui m'étonne, c'est que, même si elle arrive trop tard, je devrais ensuite retrouver le texte du pied-de-page. Or, lorsque je vais dans Mise en page, puis Pied-de-page, aucun texte n'apparaît. Pourtant, même si je n'ai pas utilisé Debug.Print, j'ai lancé la macro depuis le début, ligne par ligne, avec la touche F8. Et la valeur de PiedDePage... est correcte (mais donc ensuite, Excel n'indique aucun pied-de-page).
Il y a quelque chose qui m'échappe...
Comme il n'y a qu'une feuille visible, ce sera forcément la feuille active, donc aucun problème de ce côté là. A part ça, il n'y a rien qui saute aux yeux, je ne vois pas d'où peut venir le problème.
Eventuellement, envoie un classeur exemple pour vérifier plus en profondeur.
Franc, merci pour ta réponse. J'ai reconsidéré le problème et j'ai peut-être une idée pour contourner le problème. Mon idée d'utiliser le BeforePrint visait à garantir que le pied-de-page mentionne dans tous les cas le nom de l'utilisateur qui a imprimé le document (et la date), peu importe qu'il ait passé par la macro d'impression ou choisi le menu Imprimer d'Excel. Mon idée serait de déplacer l'instruction contenue dans BeforePrint dans le module d'ouverture du fichier. De cette manière, à chaque ouverture, le nom serait ainsi mentionné dans le pied-de-page, qu'il y ait (ou non) impression par la suite. En cas d'impression, le nom figurerait en pied-de-page (et, comme je le souhaitais, indépendamment du fait que l'utilisateur choisisse le bouton Imprimer ou la commande Imprimer).
Qu'en penses-tu? Vois-tu des problèmes éventuels à procéder ainsi?
Bon week-end!
C'est une solution qui me semble tout à fait valable, à tester. Bon w-e.
Franc,
J'ai oublié de répondre.Passer l'instruction de BeforePrint à Open, dans ThisWorkbook, a très bien fonctionné. Même si je ne suis pas sûr d'avoir bien compris pourquoi elle n'a pas fonctionné avec Before Print... Mais peu importe, l'alternative envisagée me donne entière satisfaction! Merci encore pour ton aide, qui s'est avérée très précieuse, puisque tu as répondu avec des solutions fonctionnelles à toutes mes questions (nombreuses)! Bonne suite :D