Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/07/2006, 19h30   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2004
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 71
Points : 12
Points : 12
Envoyer un message via MSN à kinganasius
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.
kinganasius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2006, 15h05   #2
Candidat au titre de Membre du Club
 
Inscription : novembre 2004
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 71
Points : 12
Points : 12
Envoyer un message via MSN à kinganasius
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
kinganasius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2006, 15h43   #3
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 654
Points : 7 654
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.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2006, 17h49   #4
Candidat au titre de Membre du Club
 
Inscription : novembre 2004
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 71
Points : 12
Points : 12
Envoyer un message via MSN à kinganasius
voila le code qui me permet de générer le dit état :

1. l'ouverture du document:
Code :
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 :
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 :
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 :
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"
kinganasius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2006, 18h05   #5
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 654
Points : 7 654
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.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2006, 23h45   #6
Membre habitué
 
Inscription : avril 2003
Messages : 284
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : avril 2003
Messages : 284
Points : 124
Points : 124
Envoyer un message via MSN à marsup54 Envoyer un message via Skype™ à marsup54
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
Citation:
<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 :
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
marsup54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h37.


 
 
 
 
Partenaires

Hébergement Web