IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

[VB6][Automation Word 2003] Détecter le passage d'une page à une autre


Sujet :

VBA Word

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 71
    Points : 43
    Points
    43
    Par défaut [VB6][Automation Word 2003] Détecter le passage d'une page à une autre
    bonjour
    je développe actuellement une application qui génère à la volée des reports en utilisant l'automation word. je voudrai savoir si il y a un moyen pour détecter le passage d'une page à une autre dans mon report .

    cordialement.

  2. #2
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    merci les gars, vous etiez nombreux à consulter ma question. mais y'aurait pas un entre vous qui puisse me donner un tuyau? c'est question de vie ou de mort pour moi

  3. #3
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par kinganasius
    c'est question de vie ou de mort pour moi
    Alors... t'es mort!

    Plus sérieusement, quand une question n'obtient pas de réponse, il vaut mieux se demander pourquoi plutôt que de se la jouer dramatique.

    Citation Envoyé par kinganasius
    je développe actuellement une application qui génère à la volée des reports
    Si, au moins, tu nous avais montré ton code, on aurait une petite idée d'où tu en es.

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    voila le code qui me permet de générer le dit état :

    1. l'ouverture du document:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Dim doc As New word.Application
            Dim path_file = "c:\templates\liste_taux.doc"
            Dim liste_taux As word.Document = doc.Documents.Open(FileName:=path_file)
            doc.Selection.HomeKey()
            doc.Visible = False
    2. Extraction des données qui vont alimenter un mon é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
     
            'calculer le nombre de type de dossier 
            Dim req1 As String = "select count(*) from TYPE_DOSSIER"
            Dim rs1 As New OracleCommand(req1, conn)
            rs1.CommandType = CommandType.Text
            Dim nbr_typ As OracleDataReader = rs1.ExecuteReader()
            nbr_typ.Read()
            Dim i As Integer = nbr_typ.Item(0) + 1
     
            Dim req2 As String = "select TD_LIBELLE,TD_TAUX_CNIA, TD_TAUX_CNOPS, TD_PLAFOND_CNIA, TD_PLAFOND_CNOPS from TYPE_DOSSIER"
            Dim rs2 As New OracleCommand(req2, conn)
            rs2.CommandType = CommandType.Text
     
            Dim list_typ_dos As OracleDataReader = rs2.ExecuteReader()
    3. Remplissage du tableau par les données extraites de la base de données
    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
     
            Dim k As Integer
            k = 2
            Dim tableau As word.Table
            tableau = liste_taux.Tables.Add(Range:=doc.Selection.Range, NumRows:=i, NumColumns:=5)
     
            tableau.Borders.Enable = True
     
            tableau.Rows.HeadingFormat = True
     
            tableau.Range.Font.Size = 10
            tableau.Range.Font.Name = "Verdana"
     
            Dim q As Integer = 0 
     
            While list_typ_dos.Read() And k <= i
                MsgBox(doc.Selection.Information(word.WdInformation.wdFirstCharacterLineNumber))
                tableau.AutoFitBehavior(1)
     
     
                tableau.Cell(k, 1).Range.Text = list_typ_dos.Item(0)
                tableau.Cell(k, 2).Range.Text = Str(Val(list_typ_dos.Item(1)) * 100) + " %"
                tableau.Cell(k, 3).Range.Text = Str(Val(list_typ_dos.Item(2)) * 100) + " %"
                tableau.Cell(k, 4).Range.Text = Str(list_typ_dos.Item(3)) + " dhs"
                tableau.Cell(k, 5).Range.Text = Str(list_typ_dos.Item(4)) + " dhs"
     
     
     
                k = k + 1
                q += 1
            End While
     
            doc.PrintOut()
            liste_taux.Close(0)
            doc.Quit()
            conn.Close()
    4. le problème que je n'arrive pas à résoudre jusqu'à maintenant est que je n'arrive pas à executer la partie du code ci-dessous à chaque fois que mon état s'étale sur une nouvelle page (avoir la même entête de tableau sur chaque page de mon état.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    tableau.Cell(k, 1).Range.Text = "Libellé"
                    tableau.Cell(k, 2).Range.Text = "Taux CNIA"
                    tableau.Cell(k, 3).Range.Text = "Taux CNOPS"
                    tableau.Cell(k, 4).Range.Text = "Plafond CNIA"
                    tableau.Cell(k, 5).Range.Text = "Plafond CNOPS"

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Même si ton environnement de développement est VB6, tu fais appel à de la programmation VBA.

    A ce titre, je vais déplacer ta question dans le sous-forum VBA pour que les spécialistes en la matière puissent y jeter un oeil.

    Je suppose que tu n'y verras pas d'inconvénient.

  6. #6
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Pourquoi ne pas utiliser un modèle Word vide avec un saut de page ...

    Voici un exemple de code que j'utilise :
    A placer dans un module

    Dans un document word, je place des flags
    <monflag>
    que je remplace ensuite par les valeurs souhaitées.
    Utilises un code particulier dans ton document word pour spécifier un saut de ligne, page, ... et remplace le ensuite par le code VBA qui convient.

    ++

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    Dim wdApp As Object
     
    ' Fonction qui retourne une chaîne
    Public Function GenerateDocument(sTags As String, sValues As String, SsourcePath As String, SdestPath As String) As String
     
        On Error GoTo ErrHandler
        Dim arrTags() As String, arrValues() As String, iLoop As Integer
        Dim iPosition As Integer, iCheckError As Integer
     
        iCheckError = 0
        Set wdApp = CreateObject("Word.Application")
        iCheckError = 1
        'Ouvre le fichier modèle à partir du chemin spécifié (envoyé par le fichier ASP _
        en tant que paramètre). Une référence au nouveau document Word, fondé sur le modèle, _
        est créée sur le serveur :
        wdApp.Documents.Open SsourcePath
     
        'Récupération de toutes les valeurs obtenues à partir du fichier ASP, _
        dans le tableau arrTags, en utilisant la fonction Split. La virgule sert de _
        séparateur afin de séparer les valeurs de balise dans le fichier ASP :
        arrTags = Split(sTags, ", ")
     
        'Stocke les valeurs correspondant aux valeurs en entrée dans le tableau arrValues. _
        Le caractère pipe (|) est utilisé comme séparateur
        arrValues = Split(sValues, " | ")
     
        'Traitement par itération des balises du tableau arrTags et utilisation _
        de la fonction Rechercher/Remplacer (en utilisant un script VBA) pour trouver _
        les balises du tableau, dans le document Word créé, en les remplaçant par les _
        valeurs correspondantes du tableau arrValues. La série de virgule correspond à _
        certains paramètres optionnels de la méthode Find.Execute qui n 'ont pas été _
        définis. Nous ne nous intéressons ici qu'à la mise en œuvre des options _
        MatchWholeWord, ReplaceWith, et ReplaceAll (représentées ici par la constante _
        numérique 2).
     
        'Contournement d'un bug word : impossibilité de rechercher/remplacer des chaînes_
        'de plus de 255 caractères
        For iLoop = 0 To UBound(arrTags)
            If Len(arrValues(iLoop)) < 255 Then
                sTampon = arrValues(iLoop)
                iPosition = InStr(sTampon, "ZZRetCharZZ")
                If iPosition > 0 Then
                    wdApp.Selection.Find.ClearFormatting
                    With wdApp.Selection.Find
                        .Text = arrTags(iLoop)
                        .Replacement.Text = ""
                        .Forward = True
                        .Wrap = wdFindContinue
                        .Format = False
                        .MatchCase = False
                        .MatchWholeWord = False
                        .MatchWildcards = False
                        .MatchSoundsLike = False
                        .MatchAllWordForms = False
                    End With
                    wdApp.Selection.Find.Execute
                    Do While iPosition > 0
                        wdApp.Selection.TypeText Text:=left(sTampon, iPosition - 1)
                        wdApp.Selection.TypeParagraph
                        sTampon = right(sTampon, Len(sTampon) - (iPosition + 10))
                        iPosition = InStr(sTampon, "ZZRetCharZZ")
                    Loop
                    'On affiche la dernière partie !
                    wdApp.Selection.TypeText Text:=sTampon
                Else
                    wdApp.ActiveDocument.Content.Find.Execute arrTags(iLoop), , True, , _
                    , , , , , sTampon, 2
                End If
            Else
                'Si la chaîne est plus longue
                'If arrTags(iLoop) = "<phrase_4>" Or arrTags(iLoop) = "<nom_agent>" Then
                sTampon = arrValues(iLoop)
                iPosition = InStr(sTampon, "ZZRetCharZZ")
                If iPosition > 0 Then
                    wdApp.Selection.Find.ClearFormatting
                    wdApp.Selection.Find.Text = arrTags(iLoop)
                    wdApp.Selection.Find.Execute
                    Do While iPosition > 0
                        wdApp.Selection.TypeText Text:=left(sTampon, iPosition - 1)
                        wdApp.Selection.TypeParagraph
                        sTampon = right(sTampon, Len(sTampon) - (iPosition + 10))
                        iPosition = InStr(sTampon, "ZZRetCharZZ")
                    Loop
                    'On affiche la dernière partie !
                    wdApp.Selection.TypeText Text:=sTampon
                End If
                'End If
            End If
         Next iLoop
        'Enregistre le document à l'endroit spécifié
        wdApp.ActiveDocument.SaveAs SdestPath
        'Ferme le document, quitte et release
        wdApp.ActiveDocument.Close
        wdApp.Quit
        Set wdApp = Nothing
     
        'Retourne un flag success et quitte la fonction
        GenerateDocument = "Success"
        Exit Function
     
    'Routine de gestion d'erreur. Retourne le message d'erreur,
    'si une erreur s'est produite durant le processus.
    ErrHandler:
        If iCheckError = 0 Then
            'Gestion des logs
            Global_ErrorLog = "Erreur dans la génération du rapport : " & SdestPath
            Global_ErrorLog = Global_ErrorLog & vbCrLf & "Impossible de charger le composant Word.Application"
            Call SaveLogFile("DocumentObject", Global_ErrorLog, LOG_FILENAME, sModeDebug)
            GenerateDocument = "Impossible de charger le composant Word.Application"
            Exit Function
        End If
        'Quitte et libère le word document objet
        wdApp.ActiveDocument.Close
        wdApp.Quit
        Set wdApp = Nothing
        'Construction du message d'erreur et le retourne
        Dim ErrMsg As String
        ErrMsg = "Error Number: " & Err.Number & Chr(10) & "Error Source: " & Err.Source & Chr(10)
        ErrMsg = ErrMsg & "Error Description: " & Err.Description & Chr(10)
        GenerateDocument = ErrMsg
        'Gestion des logs
        Global_ErrorLog = "Erreur dans la génération du rapport : " & SdestPath
        Global_ErrorLog = Global_ErrorLog & vbCrLf & ErrMsg
        Global_ErrorLog = Global_ErrorLog & vbCrLf & "sTags = " & sTags
        Global_ErrorLog = Global_ErrorLog & vbCrLf & "sValues = " & sValues
        Call SaveLogFile("DocumentObject", Global_ErrorLog, LOG_FILENAME, sModeDebug)
        Exit Function
    End Function

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/08/2007, 15h46
  2. Passage de valeur d'une page à l'autre
    Par DJuL- dans le forum ASP.NET
    Réponses: 21
    Dernier message: 20/07/2007, 09h59
  3. Réponses: 3
    Dernier message: 16/06/2007, 11h05
  4. [Tableaux] passage de variables d'une page à une autre
    Par programos dans le forum Langage
    Réponses: 9
    Dernier message: 13/03/2007, 18h31
  5. Réponses: 6
    Dernier message: 29/09/2006, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo