Création d'un tableau récap RDV parents-professeurs

Bonjour à tous !

Petite nouvelle inscrite. D'habitude, en relisant les autres posts, je trouve les solutions et bonnes formules mais là...

Coincée de chez coincée, méninges en surchauffe et ne trouve pas de solutions.

Je vous explique donc.

J'ai un tableau reprenant par heure et par enseignant les familles qu'ils vont rencontrer.

A partir de ce tableau, je dois éditer les fiches récapitulatives des rdv pour les familles (idéalement par publipostage ensuite vers word pour lancer une impression automatique en masse).

Et je ne parviens pas à construire soit le tableau secondaire pour les familles qui me servirait de base à mon publipostage. Je n'arrive pas en fait à savoir sur quelle formule partir et je pars dans tous les sens.

Auriez vous des pistes ?

Je vous joins le fameux tableau (simplifié en terme de nombre de famille).

Merci beaucoup pour vos retours en tout cas et bonne journée à tous !

Bonjour,

proposition via une macro (génère un onglet par famille). manque l'info discipline. lancer la macro par alt-F8

Sub aargh()
    With Sheets("6")
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        Sheets.Add
        Set ws = ActiveSheet
        ws.Name = "tempabcd"
        For i = 3 To dl
            dc = .Cells(i, Columns.Count).End(xlToLeft).Column
            For j = 2 To dc
                If .Cells(i, j) <> "" Then
                    k = k + 1
                    ws.Cells(k, 1) = .Cells(i, j)
                    ws.Cells(k, 2) = .Cells(i, 1)
                    ws.Cells(k, 3) = .Cells(1, j)
                    ws.Cells(k, 5) = .Cells(2, j)
                End If
            Next j
        Next i
    End With
    ws.Range("A1:E" & k).Sort key1:=ws.Range("A1"), order1:=xlAscending, key2:=ws.Range("B1"), order2:=xlAscending, Header:=xlNo
    fam = ""
    For i = 1 To k + 1
        If ws.Cells(i, 1) <> fam Then
            If fam <> "" Then
                Sheets("convoc Famille").Copy after:=Sheets(Sheets.Count)
                Set wsf = ActiveSheet
                wsf.Name = fam
                wsf.Range("B4") = fam
                wsf.Range("A15").Resize(lr - fr + 1, 4).Value = ws.Range("B" & fr & ":E" & lr).Value
            End If
            fr = i
            fam = ws.Cells(i, 1)
        Else
            lr = i
        End If
    Next i
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
End Sub

Merci beaucoup pour ton retour rapide !!

Je vais tenter ta solution en croisant les doigts ! Je ne suis pas du tout spécialiste du langage macro. On verra.

Juste une petite question : du coup, ayant 150 familles et quelques, je vais avoir autant d'onglets à chaque fois. Est ce que cela ne risque pas de planter mon fichier lors des impressions ?

rebonjour,

je ne pense pas que 150 onglets poseront problème.

mais plutôt que de générer 1 onglet par famille, on peut préparer la feuille, l'imprimer et passer à la famille suivante, tout en gardant la même feuille. il faut que j'adapte la macro, si c'est ce que tu souhaites.

Oui effectivement il me semble plus maniable (enfin pour moi) d'avoir un seul onglet.

J'ai lu que l'on pouvait automatiser du coup les impressions via VBA.

re-bonjour,

voici pour l'automatisation de l'impression

Bonjour,

Merci beaucoup !

Votre macro fonctionne parfaitement bien

Juste une dernière petite question : j'ai tenté de la comprendre pour faire quelques modifs..mais impossible...une poule devant un couteau a certainement l'air plus intelligente ...

Comment dois-je faire pour intégrer les matières en partant de mon tableau initial ? J'ai rajouté une ligne sous la ligne enseignant en indiquant sa matière mais je ne comprend pas le "mécanisme" de la macro pour intégrer ce paramètre.

Il faut vraiment que je me mette à VBA, devant dans l'avenir avoir recours à des tableaux de plus en plus complexes...

Merci beaucoup pour votre aide une nouvelle fois !

Bonne journée.

Stéphanie

Bonjour,

voici la macro adaptée et commentée. j'ai supposé que la discipline était en ligne 3 et la salle en ligne 2

Sub aargh()
    With Sheets("6")
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        ' on crée une feuille temporaire tempabcd avec une ligne par rendez-vous
        ' famille,heure,professeur,discipline,salle
        Sheets.Add
        Set Ws = ActiveSheet
        Ws.Name = "tempabcd"
        For i = 4 To dl 'on parcourt les lignes de la feuille 6
            dc = .Cells(i, Columns.Count).End(xlToLeft).Column
            For j = 2 To dc 'on parcourt les colonnes de la feuille 6
                If .Cells(i, j) <> "" Then
                    k = k + 1
                    Ws.Cells(k, 1) = .Cells(i, j) ' famille
                    Ws.Cells(k, 2) = .Cells(i, 1) ' heure
                    Ws.Cells(k, 3) = .Cells(1, j) ' professeur
                    Ws.Cells(k, 4) = .Cells(3, j) ' discipline
                    Ws.Cells(k, 5) = .Cells(2, j) ' salle
                End If
            Next j
        Next i
    End With
    ' on trie la feuille temporaire par famille et par heure
    Ws.Range("A1:E" & k).Sort key1:=Ws.Range("A1"), order1:=xlAscending, key2:=Ws.Range("B1"), order2:=xlAscending, Header:=xlNo
    ' on génère et on imprime les convocations
    fam = "" ' fam contient la famille en cours
    Set wsf = Sheets("convoc Famille")
    For i = 1 To k + 1 'on parcourt toutes les lignes des la feuille tempabcd
        If Ws.Cells(i, 1) <> fam Then
            If fam <> "" Then
                wsf.Range("A15:E30").ClearContents
                ' on complète le formulaire
                wsf.Range("B4") = fam 'nom de famille
                ' tous les rendez-vous pour cette famille de la première ligne (fr) à la dernière (lr)
                wsf.Range("A15").Resize(lr - fr + 1, 4).Value = Ws.Range("B" & fr & ":E" & lr).Value
                'on imprime
                wsf.PageSetup.PrintArea = "$A$1:$D$30"
                wsf.PrintOut Copies:=1, Collate:=True, _
                             IgnorePrintAreas:=False
            End If
            fr = i ' première ligne rendez-vous pour cette famille
            fam = Ws.Cells(i, 1)
        Else
            lr = i ' dernière ligne rendez-vous pour la famille en cours
        End If
    Next i
    wsf.Range("A15:E30").ClearContents
    wsf.Range("B4").ClearContents
    'suppression de la feuille temporaire tempabcd
    Application.DisplayAlerts = False
    Ws.Delete
    Application.DisplayAlerts = True
End Sub

Bon et bien grâce à vous, problème résolu et convocations famille imprimées !!!

Merci vraiment pour votre disponibilité et votre efficacité !

Bonne journée...et sûrement à bientôt

Rechercher des sujets similaires à "creation tableau recap rdv parents professeurs"