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