Bonjour,
Cette question est fréquente sur le forum.
.....(et sauf erreur de ma part) je n’ai pas trouvé de solution sur les différents Forum Office....
Réinitialiser [Page] à chaque groupe est simple à obtenir, dans l’événement "Au formatage" du groupe, il suffit de l’instruction :
Par contre, pour ce qui est du nombre de pages que comporte le groupe, pas de syntaxe prévue : il n’y a pas, pour chaque groupe un équivalent du [pages] qui correspond au nombre de pages de l’état complet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Me.Page = 1
Je vous propose une solution facile à mettre en place.
Elle s’inspire largement de
La différence essentielle : ici, pas besoin de définir une table auxiliaire à chaque état.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 Option Compare Database Option Explicit Dim DB As Database Dim GrpPages As Recordset Function GroupTotalPages() 'Trouvez le nom de groupe. GrpPages.Seek "=", Me![secteurs] If Not GrpPages.NoMatch Then GroupTotalPages = GrpPages![PageNuméro] End If End Function Private Sub EntêteGroupe0_Format(Cancel As Integer, FormatCount As Integer) ' Initialise le numéro de page à 1 lorsqu'un nouveau groupe débute Page = 1 End Sub Private Sub Report_Open(Cancel As Integer) Set DB = DBEngine.Workspaces(0).Databases(0) DoCmd.SetWarnings False DoCmd.RunSQL "Delete * From [tbl_GroupePage];" DoCmd.SetWarnings True Set GrpPages = DB.OpenRecordset("tbl_GroupePage", DB_OPEN_TABLE) GrpPages.Index = "PrimaryKey" End Sub Private Sub ZonePiedPage_Format(Cancel As Integer, FormatCount As Integer) 'Trouve le groupe au fur et à mesure. GrpPages.Seek "=", Me![secteurs] If Not GrpPages.NoMatch Then 'Le groupe est déjà comptabilisé. If GrpPages![PageNuméro] < Me.Page Then GrpPages.Edit GrpPages![PageNuméro] = Me.Page GrpPages.Update End If Else 'C'est une nouvelle page du groupe, Par conséquent on l'ajoute. GrpPages.AddNew GrpPages![secteurs] = Me![secteurs] GrpPages![PageNuméro] = Me.Page GrpPages.Update End If End Sub
Pas besoin non plus de modifier le code pour y mentionner le champ sur lequel on regroupe.
D’où simplification de la mise en place.
Pour appliquer :
- Dans le pied de page :
** un contrôle avec comme source : =[Pages], pour éviter toute ambiguïté, sa propriété visible = non.
Sa présence est indispensable pour le déroulement du processus.
** un contrôle avec comme source : =" Page " & [Page] & " sur " & getPages(). C’est lui qui affichera la pagination.
** Dans le module de l’état, le code suivant :
Un peu de commentaires sur la programmation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Option Compare Database Option Explicit Dim ChampGroupe As String, CtlGroupe As String, ctl As Control Dim ArrGroupePages(2000, 1) Private Sub EntêteGroupe0_Format(Cancel As Integer, FormatCount As Integer) ' Provoquer la réinitialisation de [Page] au changement de Groupe Me.Page = 1 End Sub Private Sub Report_Open(Cancel As Integer) 'recherche du nom du contrôle qui contient le champ de groupage ChampGroupe = Me.Report.GroupLevel(0).ControlSource '<----- le niveau de regroupement le plus élevé 'Boucle sur les contrôles pour en trouver un qui contient ChampGroupe For Each ctl In Me.Controls If ctl.ControlType = acTextBox Or ctl.ControlType = acListBox Then If ctl.ControlSource = ChampGroupe Then CtlGroupe = ctl.Name Exit For End If End If ContinueIci: Next ctl End Sub Private Sub ZonePiedPage_Format(Cancel As Integer, FormatCount As Integer) Dim i As Integer, Trouve As Boolean 'lors du formatage, mémoriser le + grand N° de page de chaque groupe Trouve = False For i = 0 To UBound(ArrGroupePages) If ArrGroupePages(i, 0) = Empty Then Exit For 'on décroche à la 1ère ligne libre If ArrGroupePages(i, 0) = Me(CtlGroupe) Then 'le groupe est déjà présent dans le tableau --> mémoriser la page si supérieure If ArrGroupePages(i, 1) < Me.Page Then ArrGroupePages(i, 1) = Me.Page Trouve = True End If Next i If Trouve = False Then 'c'est un nouveau groupe ---> ajouter une ligne au tableau et mémoriser ' i= 1ère ligne libre (voir ci-avant) ArrGroupePages(i, 0) = Me(CtlGroupe) ArrGroupePages(i, 1) = Me.Page End If End Sub Public Function GetPages() Dim i As Integer For i = 0 To UBound(ArrGroupePages) 'en fait, la boucle s'interrompt au 1er item vide If ArrGroupePages(i, 0) = Me(CtlGroupe) Then GetPages = ArrGroupePages(i, 1) Exit For End If Next i End Function
En incluant un contrôle avec comme source =[Pages], on force Access à reformater.
Chaque fois qu’il y a formatage de la section contenant le champ de regroupement, on comptabilise dans un tableau interne la valeur du champ et le N° de la page le plus grand.
En fin de course, la fonction « GetPages() » aménage pour chaque groupe, le N° mémorisé.
Voici un exemple en annexe.
En espérant que ce petit bout de code sera utile au plus grand nombre....en attente d'amélioration éventuelle de celui-ci et/ou d'un lien que j'aurai loupé ....
Remarques et suggestions, bienvenues (singulièrement dans la recherche du contrôle contenant le champ de regroupement).
Cordialement.
Partager