Pour répondre à une question qui revient assez régulièrement mais dont la
réponse semble avoir été perdue : imprimer N°page / Nbre total de page mais
en se référant à un groupe et non à l'ensemble de l'état.
Un truc pour paginer un état en fonction des groupes créés que j'ai trouvé
dans les archives :
NB : il faut garder un contrôle caché avec =[pages] pour forcer le
reformatage avant impression
"Soumis par James H Brooks---
Imprimer le numéro de la première et de la dernière page d'un
groupe.
Il est souvent nécessaire de pagine pour un groupe
d'enregistrements, et non pour tout l'état. Access n'offre aucune
solution pré-établie et parfois, une solution de rechange peut
devenir ardue. Voici un exemple qui, utilisant une structure (array)
pour y parvenir.Ouvrir un état en mode design vecteur et ajouter le
code comme mentionné plus bas.
Note: la ligne Me!Salesperson doit être changée pour le nom du
contrôle de groupe qui gouverne la numérotation de page. De même,
Me!ctlGrpPages est le nom du contrôle du peid de page qui contiendra
le numéro de page.
Le code fonctionne en maintenant deux vecteurs: GrpArrayPage()
maintient le numéro de page pour le groupe et GrpArrayPages()
maintient le nombre total de pages pour le groupe.
Quand Access formate l'état, il est requis d'effectuer deux passes
pour obtenir l'information du genre Page 1 de 10, puisqu'Access ne
peut pas connaître le nombre de pages avant d'avoir effectivement
formatté le tout. On peut se servir de cette procédure pour cérer la
pagination des groupes. Puisque le code utilise la propriété Pages
(nombre total de page), forcément l'état est formatté deux fois.
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
Puisque la dimension de ces vecteurs est dynamique, nous utilisons
Preserve pour conserver l'information accumulée lors de la première
passe.
If Me.Pages = 0 Then
...
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
Fonctionnement du code:
Tant qu'Access n'a pas terminé la première passe, la valeur de la
propriété Pages est de 0. On peut donc utiliser ce fait pour
différencier entre la première et la seconde passe. La première
passe est expliquée avec plus de détails ci-dessous. La seconde
passe se contente d'assigner les valeurs appropriées au pied de
page.
À la première passe de l'état, le code utilise le nom de groupe et
la propriété Page (pas de s) pour construire la pagination désirée.
Chaque page réelle de l'état set d'index pour le vecteur qui
fournira le numéro à imprimer.
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
Ce code simplement assigne le prochain numéro de page pour le
groupe, soit un de plus que celui de la page précédante,
GrpArrayPage(Me.Page - 1).
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next I
GrpPages, une variable temporairement utilisée pour emmagasiner le
numéro de page est alors assigné au numéro de la page actuelle. La
boucle assigne la valeur de GrpArrayPages à la valeur de GrpPages
pour tous les items du vecteur.
Ainsi, s'il y a trois pages dans un groupe, les données devraient
être:
GrpArrayPage( ) GrpArrayPages( )
1 3
2 3
3 3
et lorsqu'on passe à une quatrième page:
GrpArrayPage( ) GrpArrayPages( )
1 4
2 4
3 4
...et ainsi de suite.
Le code détecte un changement du nom de groupe, " GrpNameCurrent <>
GrpNamePrevious", il remet alors la pagination à 1.
Les vecteurs sont souvent mésestimés lorsqu'on développe du code.
Les gens ont tendance à préférer des tables pour manipuler des
données temporaires, mais non seulement celè rend-il le code plus
dificile à maintenir et à débugger, mais il le rend également moins
ré-utilisable. Les vecteurs sont souvent des substituts avanageux en
comparaison à ces tables.
Code complet:
'************ Code Start *************
Option Compare Database
Option Explicit
Dim GrpArrayPage(), GrpArrayPages()
Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant
Dim GrpPage As Integer, GrpPages As Integer
Private Sub PageFooter_Format(Cancel As Integer, FormatCount As
Integer)
Dim i As Integer
If Me.Pages = 0 Then
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
GrpNameCurrent = Me!Salesperson
If GrpNameCurrent = GrpNamePrevious Then
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next i
Else
GrpPage = 1
GrpArrayPage(Me.Page) = GrpPage
GrpArrayPages(Me.Page) = GrpPage
End If
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
GrpNamePrevious = GrpNameCurrent
End Sub
'************ Code End *************
*** Note: Changer Me!Salesperson pour le nom du contrôle du groupe
gouvernant la pagination. Me!ctlGrpPages est le nom du contrôle
placé en pied d'état pour recevoir le numéro de page (vous pouvez le
modifier pour refléter votre choix personnel)."
---
Courrier sortant certifié sans virus
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.754 / Virus Database: 504 - Release Date: 06/09/2004
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Raymond [mvp]
Bonjour.
tu en trouveras une toute aussi simple avec documentation en ligne sur : http://access.vba.free.fr/pagination_groupe.htm qui te propose deux solutions dont 1 avec table et 1 avec tableau.
-- @+ Raymond Access MVP http://access.seneque.free.fr/ http://access.vba.free.fr/ http://access2003.free.fr/ http://users.skynet.be/mpfa/ pour débuter sur le forum
"dip" a écrit dans le message de news:41401e32$0$1289$
Bonjour,
Pour répondre à une question qui revient assez régulièrement mais dont la réponse semble avoir été perdue : imprimer N°page / Nbre total de page mais
en se référant à un groupe et non à l'ensemble de l'état.
Un truc pour paginer un état en fonction des groupes créés que j'ai trouvé dans les archives : NB : il faut garder un contrôle caché avec =[pages] pour forcer le reformatage avant impression
"Soumis par James H Brooks--- Imprimer le numéro de la première et de la dernière page d'un groupe. Il est souvent nécessaire de pagine pour un groupe d'enregistrements, et non pour tout l'état. Access n'offre aucune solution pré-établie et parfois, une solution de rechange peut devenir ardue. Voici un exemple qui, utilisant une structure (array) pour y parvenir.Ouvrir un état en mode design vecteur et ajouter le code comme mentionné plus bas. Note: la ligne Me!Salesperson doit être changée pour le nom du contrôle de groupe qui gouverne la numérotation de page. De même, Me!ctlGrpPages est le nom du contrôle du peid de page qui contiendra le numéro de page. Le code fonctionne en maintenant deux vecteurs: GrpArrayPage() maintient le numéro de page pour le groupe et GrpArrayPages() maintient le nombre total de pages pour le groupe. Quand Access formate l'état, il est requis d'effectuer deux passes pour obtenir l'information du genre Page 1 de 10, puisqu'Access ne peut pas connaître le nombre de pages avant d'avoir effectivement formatté le tout. On peut se servir de cette procédure pour cérer la pagination des groupes. Puisque le code utilise la propriété Pages (nombre total de page), forcément l'état est formatté deux fois. ReDim Preserve GrpArrayPage(Me.Page + 1) ReDim Preserve GrpArrayPages(Me.Page + 1) Puisque la dimension de ces vecteurs est dynamique, nous utilisons Preserve pour conserver l'information accumulée lors de la première passe. If Me.Pages = 0 Then ... Else Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of " & GrpArrayPages(Me.Page) End If Fonctionnement du code: Tant qu'Access n'a pas terminé la première passe, la valeur de la propriété Pages est de 0. On peut donc utiliser ce fait pour différencier entre la première et la seconde passe. La première passe est expliquée avec plus de détails ci-dessous. La seconde passe se contente d'assigner les valeurs appropriées au pied de page. À la première passe de l'état, le code utilise le nom de groupe et la propriété Page (pas de s) pour construire la pagination désirée. Chaque page réelle de l'état set d'index pour le vecteur qui fournira le numéro à imprimer. GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1 Ce code simplement assigne le prochain numéro de page pour le groupe, soit un de plus que celui de la page précédante, GrpArrayPage(Me.Page - 1). GrpPages = GrpArrayPage(Me.Page) For i = Me.Page - ((GrpPages) - 1) To Me.Page GrpArrayPages(i) = GrpPages Next I GrpPages, une variable temporairement utilisée pour emmagasiner le numéro de page est alors assigné au numéro de la page actuelle. La boucle assigne la valeur de GrpArrayPages à la valeur de GrpPages pour tous les items du vecteur. Ainsi, s'il y a trois pages dans un groupe, les données devraient être: GrpArrayPage( ) GrpArrayPages( ) 1 3 2 3 3 3 et lorsqu'on passe à une quatrième page: GrpArrayPage( ) GrpArrayPages( ) 1 4 2 4 3 4 ...et ainsi de suite. Le code détecte un changement du nom de groupe, " GrpNameCurrent <> GrpNamePrevious", il remet alors la pagination à 1. Les vecteurs sont souvent mésestimés lorsqu'on développe du code. Les gens ont tendance à préférer des tables pour manipuler des données temporaires, mais non seulement celè rend-il le code plus dificile à maintenir et à débugger, mais il le rend également moins ré-utilisable. Les vecteurs sont souvent des substituts avanageux en comparaison à ces tables. Code complet: '************ Code Start ************* Option Compare Database Option Explicit
Dim GrpArrayPage(), GrpArrayPages() Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant Dim GrpPage As Integer, GrpPages As Integer
Private Sub PageFooter_Format(Cancel As Integer, FormatCount As Integer) Dim i As Integer If Me.Pages = 0 Then ReDim Preserve GrpArrayPage(Me.Page + 1) ReDim Preserve GrpArrayPages(Me.Page + 1) GrpNameCurrent = Me!Salesperson If GrpNameCurrent = GrpNamePrevious Then GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1 GrpPages = GrpArrayPage(Me.Page) For i = Me.Page - ((GrpPages) - 1) To Me.Page GrpArrayPages(i) = GrpPages Next i Else GrpPage = 1 GrpArrayPage(Me.Page) = GrpPage GrpArrayPages(Me.Page) = GrpPage End If Else Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of " & GrpArrayPages(Me.Page) End If GrpNamePrevious = GrpNameCurrent End Sub '************ Code End ************* *** Note: Changer Me!Salesperson pour le nom du contrôle du groupe gouvernant la pagination. Me!ctlGrpPages est le nom du contrôle placé en pied d'état pour recevoir le numéro de page (vous pouvez le modifier pour refléter votre choix personnel)."
--- Courrier sortant certifié sans virus Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.754 / Virus Database: 504 - Release Date: 06/09/2004
Bonjour.
tu en trouveras une toute aussi simple avec documentation en ligne sur :
http://access.vba.free.fr/pagination_groupe.htm qui te propose deux
solutions dont 1 avec table et 1 avec tableau.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum
"dip" <dipsode@free.fr> a écrit dans le message de
news:41401e32$0$1289$626a14ce@news.free.fr...
Bonjour,
Pour répondre à une question qui revient assez régulièrement mais dont la
réponse semble avoir été perdue : imprimer N°page / Nbre total de page
mais
en se référant à un groupe et non à l'ensemble de l'état.
Un truc pour paginer un état en fonction des groupes créés que j'ai trouvé
dans les archives :
NB : il faut garder un contrôle caché avec =[pages] pour forcer le
reformatage avant impression
"Soumis par James H Brooks---
Imprimer le numéro de la première et de la dernière page d'un
groupe.
Il est souvent nécessaire de pagine pour un groupe
d'enregistrements, et non pour tout l'état. Access n'offre aucune
solution pré-établie et parfois, une solution de rechange peut
devenir ardue. Voici un exemple qui, utilisant une structure (array)
pour y parvenir.Ouvrir un état en mode design vecteur et ajouter le
code comme mentionné plus bas.
Note: la ligne Me!Salesperson doit être changée pour le nom du
contrôle de groupe qui gouverne la numérotation de page. De même,
Me!ctlGrpPages est le nom du contrôle du peid de page qui contiendra
le numéro de page.
Le code fonctionne en maintenant deux vecteurs: GrpArrayPage()
maintient le numéro de page pour le groupe et GrpArrayPages()
maintient le nombre total de pages pour le groupe.
Quand Access formate l'état, il est requis d'effectuer deux passes
pour obtenir l'information du genre Page 1 de 10, puisqu'Access ne
peut pas connaître le nombre de pages avant d'avoir effectivement
formatté le tout. On peut se servir de cette procédure pour cérer la
pagination des groupes. Puisque le code utilise la propriété Pages
(nombre total de page), forcément l'état est formatté deux fois.
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
Puisque la dimension de ces vecteurs est dynamique, nous utilisons
Preserve pour conserver l'information accumulée lors de la première
passe.
If Me.Pages = 0 Then
...
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
Fonctionnement du code:
Tant qu'Access n'a pas terminé la première passe, la valeur de la
propriété Pages est de 0. On peut donc utiliser ce fait pour
différencier entre la première et la seconde passe. La première
passe est expliquée avec plus de détails ci-dessous. La seconde
passe se contente d'assigner les valeurs appropriées au pied de
page.
À la première passe de l'état, le code utilise le nom de groupe et
la propriété Page (pas de s) pour construire la pagination désirée.
Chaque page réelle de l'état set d'index pour le vecteur qui
fournira le numéro à imprimer.
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
Ce code simplement assigne le prochain numéro de page pour le
groupe, soit un de plus que celui de la page précédante,
GrpArrayPage(Me.Page - 1).
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next I
GrpPages, une variable temporairement utilisée pour emmagasiner le
numéro de page est alors assigné au numéro de la page actuelle. La
boucle assigne la valeur de GrpArrayPages à la valeur de GrpPages
pour tous les items du vecteur.
Ainsi, s'il y a trois pages dans un groupe, les données devraient
être:
GrpArrayPage( ) GrpArrayPages( )
1 3
2 3
3 3
et lorsqu'on passe à une quatrième page:
GrpArrayPage( ) GrpArrayPages( )
1 4
2 4
3 4
...et ainsi de suite.
Le code détecte un changement du nom de groupe, " GrpNameCurrent <>
GrpNamePrevious", il remet alors la pagination à 1.
Les vecteurs sont souvent mésestimés lorsqu'on développe du code.
Les gens ont tendance à préférer des tables pour manipuler des
données temporaires, mais non seulement celè rend-il le code plus
dificile à maintenir et à débugger, mais il le rend également moins
ré-utilisable. Les vecteurs sont souvent des substituts avanageux en
comparaison à ces tables.
Code complet:
'************ Code Start *************
Option Compare Database
Option Explicit
Dim GrpArrayPage(), GrpArrayPages()
Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant
Dim GrpPage As Integer, GrpPages As Integer
Private Sub PageFooter_Format(Cancel As Integer, FormatCount As
Integer)
Dim i As Integer
If Me.Pages = 0 Then
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
GrpNameCurrent = Me!Salesperson
If GrpNameCurrent = GrpNamePrevious Then
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next i
Else
GrpPage = 1
GrpArrayPage(Me.Page) = GrpPage
GrpArrayPages(Me.Page) = GrpPage
End If
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
GrpNamePrevious = GrpNameCurrent
End Sub
'************ Code End *************
*** Note: Changer Me!Salesperson pour le nom du contrôle du groupe
gouvernant la pagination. Me!ctlGrpPages est le nom du contrôle
placé en pied d'état pour recevoir le numéro de page (vous pouvez le
modifier pour refléter votre choix personnel)."
---
Courrier sortant certifié sans virus
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.754 / Virus Database: 504 - Release Date: 06/09/2004
tu en trouveras une toute aussi simple avec documentation en ligne sur : http://access.vba.free.fr/pagination_groupe.htm qui te propose deux solutions dont 1 avec table et 1 avec tableau.
-- @+ Raymond Access MVP http://access.seneque.free.fr/ http://access.vba.free.fr/ http://access2003.free.fr/ http://users.skynet.be/mpfa/ pour débuter sur le forum
"dip" a écrit dans le message de news:41401e32$0$1289$
Bonjour,
Pour répondre à une question qui revient assez régulièrement mais dont la réponse semble avoir été perdue : imprimer N°page / Nbre total de page mais
en se référant à un groupe et non à l'ensemble de l'état.
Un truc pour paginer un état en fonction des groupes créés que j'ai trouvé dans les archives : NB : il faut garder un contrôle caché avec =[pages] pour forcer le reformatage avant impression
"Soumis par James H Brooks--- Imprimer le numéro de la première et de la dernière page d'un groupe. Il est souvent nécessaire de pagine pour un groupe d'enregistrements, et non pour tout l'état. Access n'offre aucune solution pré-établie et parfois, une solution de rechange peut devenir ardue. Voici un exemple qui, utilisant une structure (array) pour y parvenir.Ouvrir un état en mode design vecteur et ajouter le code comme mentionné plus bas. Note: la ligne Me!Salesperson doit être changée pour le nom du contrôle de groupe qui gouverne la numérotation de page. De même, Me!ctlGrpPages est le nom du contrôle du peid de page qui contiendra le numéro de page. Le code fonctionne en maintenant deux vecteurs: GrpArrayPage() maintient le numéro de page pour le groupe et GrpArrayPages() maintient le nombre total de pages pour le groupe. Quand Access formate l'état, il est requis d'effectuer deux passes pour obtenir l'information du genre Page 1 de 10, puisqu'Access ne peut pas connaître le nombre de pages avant d'avoir effectivement formatté le tout. On peut se servir de cette procédure pour cérer la pagination des groupes. Puisque le code utilise la propriété Pages (nombre total de page), forcément l'état est formatté deux fois. ReDim Preserve GrpArrayPage(Me.Page + 1) ReDim Preserve GrpArrayPages(Me.Page + 1) Puisque la dimension de ces vecteurs est dynamique, nous utilisons Preserve pour conserver l'information accumulée lors de la première passe. If Me.Pages = 0 Then ... Else Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of " & GrpArrayPages(Me.Page) End If Fonctionnement du code: Tant qu'Access n'a pas terminé la première passe, la valeur de la propriété Pages est de 0. On peut donc utiliser ce fait pour différencier entre la première et la seconde passe. La première passe est expliquée avec plus de détails ci-dessous. La seconde passe se contente d'assigner les valeurs appropriées au pied de page. À la première passe de l'état, le code utilise le nom de groupe et la propriété Page (pas de s) pour construire la pagination désirée. Chaque page réelle de l'état set d'index pour le vecteur qui fournira le numéro à imprimer. GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1 Ce code simplement assigne le prochain numéro de page pour le groupe, soit un de plus que celui de la page précédante, GrpArrayPage(Me.Page - 1). GrpPages = GrpArrayPage(Me.Page) For i = Me.Page - ((GrpPages) - 1) To Me.Page GrpArrayPages(i) = GrpPages Next I GrpPages, une variable temporairement utilisée pour emmagasiner le numéro de page est alors assigné au numéro de la page actuelle. La boucle assigne la valeur de GrpArrayPages à la valeur de GrpPages pour tous les items du vecteur. Ainsi, s'il y a trois pages dans un groupe, les données devraient être: GrpArrayPage( ) GrpArrayPages( ) 1 3 2 3 3 3 et lorsqu'on passe à une quatrième page: GrpArrayPage( ) GrpArrayPages( ) 1 4 2 4 3 4 ...et ainsi de suite. Le code détecte un changement du nom de groupe, " GrpNameCurrent <> GrpNamePrevious", il remet alors la pagination à 1. Les vecteurs sont souvent mésestimés lorsqu'on développe du code. Les gens ont tendance à préférer des tables pour manipuler des données temporaires, mais non seulement celè rend-il le code plus dificile à maintenir et à débugger, mais il le rend également moins ré-utilisable. Les vecteurs sont souvent des substituts avanageux en comparaison à ces tables. Code complet: '************ Code Start ************* Option Compare Database Option Explicit
Dim GrpArrayPage(), GrpArrayPages() Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant Dim GrpPage As Integer, GrpPages As Integer
Private Sub PageFooter_Format(Cancel As Integer, FormatCount As Integer) Dim i As Integer If Me.Pages = 0 Then ReDim Preserve GrpArrayPage(Me.Page + 1) ReDim Preserve GrpArrayPages(Me.Page + 1) GrpNameCurrent = Me!Salesperson If GrpNameCurrent = GrpNamePrevious Then GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1 GrpPages = GrpArrayPage(Me.Page) For i = Me.Page - ((GrpPages) - 1) To Me.Page GrpArrayPages(i) = GrpPages Next i Else GrpPage = 1 GrpArrayPage(Me.Page) = GrpPage GrpArrayPages(Me.Page) = GrpPage End If Else Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of " & GrpArrayPages(Me.Page) End If GrpNamePrevious = GrpNameCurrent End Sub '************ Code End ************* *** Note: Changer Me!Salesperson pour le nom du contrôle du groupe gouvernant la pagination. Me!ctlGrpPages est le nom du contrôle placé en pied d'état pour recevoir le numéro de page (vous pouvez le modifier pour refléter votre choix personnel)."
--- Courrier sortant certifié sans virus Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.754 / Virus Database: 504 - Release Date: 06/09/2004