Générer un tableau à imprimer depuis un onglet source
Bonjour le forum,
Me revoilà pour solliciter de nouveaux vos compétences ou conseils de « VBAistes ». Dans un souci d’automatisation, je voudrais savoir s’il est possible de générer un tableau d’impression qui reprendrait tous les personnes inscrites dans une formation identifiée par son code session qui est en colonne E (ce code étant unique il n’y a pas de risque d’erreur de formation) à partir de l’onglet « Liste AF à compléter par DATES » ? Actuellement je le fait manuellement par des copier-coller mais je pense qu’il peut exister une solution plus simple… donc je suis preneur de toutes bonnes idées ou petites macro.
J’ai mis dans le fichier joint un onglet « Impression » qui correspond à la matrice du tableau à générer. Les correspondances entre les cellules du tableau de l’onglet « Impression » avec le tableau maître de l’onglet « Liste AF à compléter par DATES » sont dans le fichier "lien onglets" et ci-dessous :.
La particularité de ce tableau à imprimer c’est qu’il varie en fonction du nombre de candidature. Attention c’est bien le nombre de candidature qui détermine le nombre de ligne du tableau car on peut avoir plus de candidatures que de places qui dans ce cas-là ne pourront pas faire la formation.
Afin d’être plus clair (enfin j’espère), je mets dans le fichier joint comme exemple ce que je souhaiterai obtenir dans le tableau de l’onglet « Impression » si je souhaitais imprimer les lignes correspondant à l’AF QP17 du tableau de l’onglet « Liste AF à compléter par DATES ».
Bonjour le forum,
N’ayant pas eu de réponse à ma question je me dis soit elle n’est pas claire ou soit tous les VBAistes sont en vacances
Enfin pour pallier à ma première supposition, je reformule ma question différemment.
Dans le fichier joins j’ai un onglet « Impression » qui est composé d’un tableau. Ce tableau à l’aide de la saisie d'un code session en K3, j’ai certaines cellules qui se remplissent automatiquement essentiellement grâce à l’utilisation de la formule INDEX et EQUIV .
Ce que je vaudrais c’est par rapport à un code session (saisie par inputbox par exemple) avoir une macro qui me remplit le tableau de l’onglet « Impression » à partir de la cellule A6 en copiant les informations qui se trouvent dans les cellules Ki :Si du tableau de l’onglet « Liste AF à compléter par DATES ».
Le « i » correspond au nombre de lignes que comporte une formation identifié par son code session qui est en colonne E.
Exemple : Pour le code session « AF », la macro, après avoir effacée les données précédemment copiées, me copie les données des cellules de la plage K13 :S22 situées dans l’onglet « Liste AF à compléter par DATES » pour les mettre dans l’onglet « Impression « à partir de la cellule A6 ce qui dans ce cas-là me remplira la plage de cellules A6 :I10.
Dans cette exemple la valeur de « i » est de 10 qui correspond aux 10 lignes que comporte le code session « AF ». Se nombre de lignes peut-être trouvé soit en comptant le nombre de fois que le code session est écrit ou soit en récupérant la valeur en colonne « II» (NBR CANDIDATURE) du code session choisi.
Point particulier : le code session est unique pour chaque formation.
Voila, j’espère que cette fois-ci une solution pourra être trouvé et pour les "VBAistes" ou "Exceliste" en vacances qu’ils en profitent 8)
Cordialement.
Bonsoir le forum,
Personne pour m'apporter une solution à ma question ?
Cordialement.
- Messages
- 4'093
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
ci-jointe proposition (procédure : imprimer_session) à partir de la définition de noms de plage communs à la liste AF et à la feuille d'impression (procédure: créer_définitions)
Bonsoir le Forum,
Pour thev :
Super ton travail thev. J'ai parcouru des différentes lignes y a du boulot
Pour le forum :
N'ayant pas eu de réponse à ma question avant celle de thev ce soir, j'ai essayé d'adapter une macro à mon "problème" d'impression seulement le résultat que j’obtiens n’est pas toujours juste. Donc si quelqu’un peut m’apporter les corrections ou me dire ce qui ne va pas ça me permettrait de mieux comprendre mes erreurs et d'avoir le choix entre deux possibilités différentes entre le double clic et la macro de thev à ma disposition.
J’explique. La macro se trouve dans Feuil2(Liste AF compléter par DATES) avec le nom « Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ».
Si je double clic sur un code session du tableau situé dans l’onglet « Liste AF à compléter par DATES », un nouvel onglet du nom de ce code session est créé. Là pas de problème.
Les noms des personnes qui sont identifiées dans cette formation sont collées dans cet onglet. Là arrive mon problème : certains noms ne sont pas copiés.
Ensuite ce que je voudrais mais je ne sais pas faire c’est que si je double clic sur un code session et que l’onglet existe déjà, il me donne le choix soit de le supprimer pour que la macro crée le nouveau ou arrête la macro car j’ai fait une fausse manip avec la souris.
Ensuite je n’arrive pas à pouvoir afficher dans la cellule B8 de l’onglet qui a été créé le nombre de candidat qui figure dans le tableau. J’avais mis une formule « =NBVAL() » mais ça ne marche pas.
Enfin merci encore à Thev pour son travail et j'espère que les causes de mes "petit" bug que je rencontre seront vite trouvés.
Cordialement
- Messages
- 4'093
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
philippe.p@ a écrit :ta macros s'exécute mais bloque à la ligne "If Range(champ.Name).Rows.Count = 1
As-tu créé les noms de plage en exécutant la macro du module "définitions" ? Cette macro n'est à exécuter qu'une seule fois.
Sinon quel est le contenu de champ.Name ?
J'ai recréer tous les noms comme dans le fichier que tu m'as envoyé et j'ai exécuté la macro "définiton" mais la macro "impression" bloque toujours au même endroit.
Où je trouve le contenu de champ.Name ?
- Messages
- 4'093
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Lorsque l'exécution s'interrompt sur l'erreur, il suffit de mettre le curseur de la souris sur champ.Name et sa valeur s'affiche.philippe.p@ a écrit :Où je trouve le contenu de champ.Name ?
En fait, tu dois avoir dans ta feuille des noms de plage invalides.
Deux solutions :
1-aller dans Formules --> Gestionnaire de noms : supprimer les noms invalides, c'est à dire ceux comportant #REF.
2- modifier le code du module Impression comme suit
Dim i1 As Integer, i2 As Integer, i_max As Integer, nb_lignes As Integer
For Each champ In F2.Names
On Error Resume Next
nb_lignes = Range(champ.Name).Rows.Count
If Err.Number = 0 Then
champ_F1 = Replace(champ.Name, F2.Name, F1.Name)
If nb_lignes = 1 Then
If Range(champ_F1).Rows(i1) <> Empty Then Range(champ.Name) = Range(champ_F1).Rows(i1)
Else
If Range(champ_F1).Rows(i1) <> Empty Then Range(champ.Name).Rows(i2) = Range(champ_F1).Rows(i1)
End If
End If
Salut thev
Le contenu de champ.Name est "plDatas". J'ai regardé dans le gestionnaire de noms et il n'y a pas de nom invalide qui commence par #REF. Par contre le nom "plDatas" est dupliqué deux fois un dans le classeur (ce qui est normal puisque je l'utilise pour ma macro de chevauchement) et un dans "Modèle_impression". Je l'ai supprimé de "Modèle_impression" est là ta macro marche.
J'ai essayé aussi avec ton nouveau code à ajouter mais avant de supprimer le nom "plDatas" et ça marche également.
Conclusion il n'y a plus de problème. Super.
Question : Est possible d'avoir la "main" avant l'impression pour ajuster la colonne remarque dont le texte par moment est tronqué car trop long.
J'attends un peu avant de mettre en résolu la question pour voir si quelqu'un pourra répondre à ma question sur le bug de ma macro "double clic" ci-dessous :
"Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Application.ScreenUpdating = False
If Target.Value = "" Then End
'détermine le code session
If Not Intersect(Target, Range("E2:E" & Range("E" & Rows.Count).End(xlUp).Row)) Is Nothing Then
Set f = ActiveSheet
Sheets("Impression").Visible = True
Sheets("Impression").Copy After:=Sheets("Liste AF à compléter par DATES")
ActiveSheet.Name = Target
Sheets("Impression").Visible = False
End If
'compte le nombre de code session identique à la cellule double cliquée
For i = 3 To f.Range("E" & Rows.Count).End(xlUp).Row
If f.Range("E" & i) = Target Then
lgn = Application.Max(11, Sheets(Target.Value).Range("A" & Rows.Count).End(xlUp)(2).Row)
Ln = 0
While f.Range("A" & i - Ln) = ""
Ln = Ln + 1
Wend
'copie les lignes K à S dans l'onglet cible
f.Range("K" & i & ":S" & i).Copy
Sheets(Target.Value).Range("A" & lgn).PasteSpecial xlPasteAll
End If
Next i
Sheets(Target.Value).Range("D5").Select
Sheets(Target.Value).Range("D5").Value = Target
Cancel = True
Application.ScreenUpdating = True
End Sub"
En attendatn encore merci à toi thev.
Cordialement.
- Messages
- 4'093
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Pour agir sur la feuille d'impression, modifier le code du module "impression" ainsi :
Option Explicit
'// variables classeur
Public code_session_sel As String
'// API GetAsyncKeyState
#If VBA7 Then
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal nVirtKey As LongPtr) As Integer
#Else
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#End If
'// Modification feuille à imprimer
MsgBox "Vous pouvez modifier votre feuille d'impression -- Appuyez sur ECHAP pour terminer"
While GetAsyncKeyState(vbKeyEscape) = 0
DoEvents
Wend
'// Impression avec suppression feuille à imprimer
With F2
.PageSetup.PrintArea = .UsedRange.Address
.PrintPreview
DoEvents
Application.DisplayAlerts = False
.Delete
End With
Merci Thev pour ce petit ajout de lignes de commande. La macro me donne bien accès à la feuille d'impression mais par contre je ne peux faire aucune modification de mise en forme ou autre.
J'ai contourné le problème en mettant directement la bonne mise en forme sur le fichier d edépart.
J'ai essayé ta macro toute la journée dans différents cas et elle fonctionne super bien donc je ne vais pas attendre la correction de ma macro double clic (ce qui aurait pu me faire comprendre mon erreur) et je mets en résolu ma question de départ.
Encore merci pour ton excellent travail thev et au plaisir.
Cordialement.
Question subsidiaire à thev : Pourquoi tu mets "Public code_session_sel" et pas en privé ? Est-ce que tu penses qu'il y a un rapport avec ta macro et la demande d'Excel à vouloir accéder au VBAProjet que j'ai protégé par un mot de passe ????
Pour tech de nouveau :
Je te remets le fichier sur lequel ta travaillé avec un mot de passe pour accéder aux macros (MP : papa). Est-ce que tu peux essayer de lancer ta macro (bouton 35 en haut à gauche) et voir si tu as le même message que moi à savoir une demande d'accés au VBAProjet et si on dit non un message disant "microsoft excel a cessé de fonctionné".
Ce problème vient uniquement que si je lance ta macro.
Pour thev et non tech
- Messages
- 4'093
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Pour que cette variable puisse être renseignée par le formulaire permettant de sélectionner le code session. Si cette variable était privée, elle ne pourrait pas être utilisée dans le code du UserForm.philippe.p@ a écrit :Pourquoi tu mets "Public code_session_sel"
Après essai sur ton bouton 35, pas de souci chez moi. Je pense que c'est un problème de paramétrage de ton Excel.
Voir options --> Centre de gestion et de la confidentialité --> paramètres des Macros
cocher : activer toutes les macros et Accès au projet VBA.
Salut Thev
Merci pour ta réponse sur la variable. Pour mon "petit" soucis j'ai identifié le problème donc plus de soucis. C'était un "petit" bug de Excel (il était peut-être trop tard pour lui
Cordialement.