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 :.

lien onglets

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 ? 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.

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 . 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 imprime

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

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 ?

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

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.

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 ???? car ça me le fait uniquement que si j'ai utilisé ta macro?

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

philippe.p@ a écrit :

Pourquoi tu mets "Public code_session_sel"

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.

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.

Rechercher des sujets similaires à "generer tableau imprimer onglet source"