BO - Faire une numérotation continue des pages sur plusieurs rapports en VBA

Business Objects permet d'afficher au travers des différents rapports la numérotation des pages en utilisant les fonctions Page() qui renvoie le numéro de la page courante et NumberOfPage() qui renvoie le nombre de pages au sein d'un rapport.
Soit pour afficher 1/5 (la page 1 sur 5) on utilisera dans une variable les fonctions comme suit : =Page() + "/" + NumberOfPage()
Lorsque vous disposer d'un document (.rep) contenant plusieurs rapports (onglets), il peut être intérressant de pouvoir disposer d'une numérotation de pages en continu sur l'ensemble des rapports de ce document. Ceci permettrait par exemple d'afficher une numérotation de 1 à n lors d'une sauvegarde du document en PDF et de ne pas avoir de coupure dans la numérotation pour chaque rapport du document.


Voici donc la situation de départ :


Comme vous le voyez notre document contient 3 rapports dont le premier contient 5 pages, le second 3 pages et le dernier 18 pages. Si j'utilise une numéroration normale =Page() + "/" + NumberOfPage(), j'aurai effectivement mon compteur de page qui recommence à 1 pour chaque rapport.
L'objectif est donc de disposer (sur base de l'exemple ci-dessus) d'une numérotation allant de 1 à 26 (3 + 5 + 18), comme représenté ci-dessous.


Avant de pouvoir rendre ce calcul automatique via du VBA, il va falloir créer quelques variables. En fait il y aura autant de variables que d'onglets -1.
Dans le cas ci-dessus il me faudra 3 - 1 variable soit 2 variables.
Créons donc ces variables. Pour nous faciliter la vie et povoir réutiliser facilement ces variables dans une boucle VBA, elles porteront le même nom (Page) et seront incrémentées de 1 à n.
Variable 1 :
Name : Page1
Formula : 0
Variable 2 :
Name : Page2
Formula : 0
Voilà, nous diposons des variables qui contiendront chacunes le nombre total de pages de chaque rapport.
Créez la variable qui contiendra le nombre total de pages pour l'ensemble du document.
Variable total :
Name : PageALL
Formula : 0
Dans chaque rapport nous allons adapter la formule qui présente le nombre de page =Page() + "/" + NumberOfPage().
Dans le rapport 1 notre formule devient : =Page() + "/" + <PageALL>
Dans le rapport 2 notre formule devient : =ToNumber(<Page1> + Page()) + "/" + <PageALL>
Dans le rapport 3 notre formule devient : =ToNumber(<Page2> + Page()) + "/" + <PageALL>
Vous l'avez certainement compris, continuer à incrémenter avec chacun de vos rapports.
Passons maintenant aux choses sérieuses, à savoir rendre le calcul des pages automatique.

Public Sub CalculPage()
    Dim StrName As String
    Dim VarPage As busobj.DocumentVariable
    Dim Doc As busobj.Document
    Dim Rep As busobj.Report
    Dim i As Integer
    Dim iPage As Integer

    On Error goto Err_CalculPage
    Set Doc = Application.ActiveDocument
    i = 0
    iPage = 0
    For Each Rep In Doc.Reports
        Rep.ForceCompute
        iPage = iPage + CInt(Rep.NumberOfPages)
        If i < Doc.Reports.Count Then
            Set VarPage = Doc.DocumentVariables("Page" & i)
            VarPage.Formula = iPage
        Else
            Set VarPage = Doc.DocumentVariables("PageALL")
            VarPage.Formula = iPage
        End If
        i = i + 1
        Set VarPage = Nothing
    Next
    Set Rep = Nothing
    Set Doc = Nothing
Exit_CalculPage:
        Exit Sub
Err_CalculPage:
    MsgBox Err.Description
    Resume Exit_CalculPage
End Sub

Faites un Run de la procédure, le rapport affiche bien une numérotation de page en continu.

Commentaires (La modération des commantaires est active. Votre commentaire apparaîtra après approbation.)
BlogCFC was created by Raymond Camden. This blog is running version 5.9.003.