Générer un tableau à imprimer depuis un onglet source Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
p
philippe.p@
Membre fidèle
Membre fidèle
Messages : 328
Inscrit le : 16 décembre 2016
Version d'Excel : office 10

Message par philippe.p@ » 3 août 2017, 16:23

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 :.
Tableau avec les liens
Tableau avec les liens
lien onglets.jpg (40.44 Kio) Vu 283 fois
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 ».
Fichier pour impression.xlsm
Fichier pour impression
(113.67 Kio) Téléchargé 18 fois
p
philippe.p@
Membre fidèle
Membre fidèle
Messages : 328
Inscrit le : 16 décembre 2016
Version d'Excel : office 10

Message par philippe.p@ » 4 août 2017, 16:00

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 :lol: .
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.
Fichier pour impression avec fonction index + equiv.xlsm
Nouveau fichier
(108.33 Kio) Téléchargé 16 fois
p
philippe.p@
Membre fidèle
Membre fidèle
Messages : 328
Inscrit le : 16 décembre 2016
Version d'Excel : office 10

Message par philippe.p@ » 5 août 2017, 23:50

Bonsoir le forum,

Personne pour m'apporter une solution à ma question ? :?: :?: Devrai-je continuer à faire un copier coller manuel pour insérer les parties d'info du tableau de l'onglet « Liste AF à compléter par DATES » dans le tableau de l'onglet "« Impression » comme dans le fichier joins dans mon message précédent ? :?: :?:

Cordialement.
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'480
Appréciations reçues : 209
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 7 août 2017, 19:35

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)
Fichier pour impression2.xlsm
(106.53 Kio) Téléchargé 15 fois
p
philippe.p@
Membre fidèle
Membre fidèle
Messages : 328
Inscrit le : 16 décembre 2016
Version d'Excel : office 10

Message par philippe.p@ » 7 août 2017, 22:20

Bonsoir le Forum,

Pour thev :

Super ton travail thev. J'ai parcouru des différentes lignes y a du boulot :wink: . Par contre quand j'ai intégré des modules (Définitions et impression) et ton "UserForm1" dans mon fichier principal, ta macros s'exécute mais bloque à la ligne "If Range(champ.Name).Rows.Count = 1 Then" (copie écran ci-dessous). A quoi peut être dû ce message ? Surtout que dans le fichier que tu m'as retourné tout fonctionne.
module imprimé.jpg
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
Fichier pour impression avec fonction index + equiv.xlsm
Nouveau fichier avec double clic
(130.88 Kio) Téléchargé 17 fois
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'480
Appréciations reçues : 209
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 7 août 2017, 22:38

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 ?
p
philippe.p@
Membre fidèle
Membre fidèle
Messages : 328
Inscrit le : 16 décembre 2016
Version d'Excel : office 10

Message par philippe.p@ » 7 août 2017, 23:43

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 ?
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'480
Appréciations reçues : 209
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 8 août 2017, 00:58

philippe.p@ a écrit :Où je trouve le contenu de champ.Name ?
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.

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
p
philippe.p@
Membre fidèle
Membre fidèle
Messages : 328
Inscrit le : 16 décembre 2016
Version d'Excel : office 10

Message par philippe.p@ » 8 août 2017, 06:45

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. :D.
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.
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'480
Appréciations reçues : 209
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 8 août 2017, 11:42

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
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message