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 10/06/2008, 16h12   #1
Invité de passage
 
Inscription : février 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 25
Points : 3
Points : 3
Par défaut Insertion formatée de données excel à l'intérieur de word (publipostage-BD-boucles)

Bonjour à Tous,

Je souhaiterais réaliser un document word "dynamique" à partir de données stockées dans un fichier excel.
Pour illustrer ce que j'aimerais réaliser, je vais prendre l'exemple d'un catalogue qui ressemble à mon besoin

Exemple :
Titre 1 : Calalogue des clous
clous1 detail1 prix1
clous2 detail2 prix2
...
Titre 2 : Catalogue des vis
vis1 detail1 prix1
vis2 detail2 prix2
...

J'avais pensé utiliser la fonction publipostage, mais celle-ci me retourne quelque chose dans ce style :

Titre 1 : Calalogue des clous
clous1 detail1 prix1
Titre 2 : Catalogue des vis
vis1 detail1 prix1
Titre 3 : Calalogue des clous
clous2 detail2 prix2
Titre 4 : Catalogue des vis
vis2 detail2 prix2
...

Une autre idée était d'utiliser la fonction insérer une base de données, mais celle-ci est alors incorporée sous forme de tableau dont seul la mise en forme peut être modifiée et non la mise en page.
Pour illustré mon besoin, imaginons que j'ai besoin d'une mise en page pour chaque article qui resemblerait à cela :
clous1
detail1 ....................................................prix1
clous2
detail2 ....................................................prix2

Je pense que seul une programmation VBA peut résoudre mon problème, mais peut-être (et j'espère) je me trompe.

Quelqu'un aurait-il une idée ou une piste ?

Merci d'avance.

Olivier.
oamram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2008, 19h09   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 364
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 364
Points : 29 286
Points : 29 286
Un peu de lecture !!

http://heureuxoli.developpez.com/off.../publipostage/
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 18h01   #3
Invité de passage
 
Inscription : février 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 25
Points : 3
Points : 3
Bonsoir Heureux-oli,

J'ai lu en long et en large ton tuto, en particulier la fin qui je pense me concerne plus, mais je n'arrive pas à l'appliquer à mon cas d'école.
Je viens d'y passer 1 jour dessus !

Si j'ai bien compris la philo appliquée à mon problème, il faudrait créer un modèle avec la mise en page qui va bien (en utilisant la notion de signet pour insérer les données où l'on veut) et ensuite dans le document principale, faire appel à ce "template" pour le remplir et le copier dans le document appelant et cela autant de fois que l'on veut.

Peux-tu me dire si cela est la bonne méthode et si jamais tu tombes sur un exemple, je serais intéressé.

Merci d'avance,

Olivier.
oamram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 18h32   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 364
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 364
Points : 29 286
Points : 29 286
C'est effectivement la bonne méthode.

Les exemples sont dans la Version Hors ligne.
Le zip contient 3 fichiers.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 21h07   #5
Invité de passage
 
Inscription : février 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 25
Points : 3
Points : 3
Merci pour tes réponses.

J'avance doucement vers le long chemin de la compréhension.
Voici sur un exemple, à quoi je suis arrivé :

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
 
Sub donneeAvecExcel()
 
On Error GoTo GestErr
'Déclaration des variables
Dim xlApp As Excel.Application
Dim xlWb As Excel.Workbook
Dim xlSh As Excel.Worksheet
Dim iR As Integer
Dim i As Integer, j As Integer
Dim oDoc As Document
Dim NoFact As Integer
Dim oTbl As Table
Dim stDocName As String
 
Dim aDoc As Document
Set aDoc = ActiveDocument
 
'Affectation des données aux variables
Set xlApp = New Excel.Application
Set xlWb = xlApp.Workbooks.Open("D:\Olivier\Documents\Temp\Rapports\Tmp\donnees.xls")
Set xlSh = xlWb.Worksheets(1)
 
'Récupération du nombre de lignes
iR = xlSh.UsedRange.Rows.Count
 
 
' Récupération des données EXCEL pour les injecter dans le document modèle.
For i = 2 To iR
        Set oDoc = Documents.Add("D:\Olivier\Documents\Temp\Rapports\Tmp\modele.docx")
 
        Set oTbl = oDoc.Tables(1)
        oTbl.Rows.Last.Cells(1).Range.Text = xlSh.Cells(i, 1)
        oTbl.Rows.Last.Cells(2).Range.Text = xlSh.Cells(i, 2)
        oTbl.Rows.Last.Cells(3).Range.Text = xlSh.Cells(i, 3)
 
        Selection.WholeStory
        Selection.Copy
 
        aDoc.Bookmarks(1).Range.Paste
 
        oDoc.Close (False)
Next i
 
Set oDoc = Nothing
Set aDoc = Nothing
GestErr:
'Si pas de document ouvert on fait un resume next
If Err.Number = 91 Then Resume Next
Debug.Print "Erreur : " & Err.Number & Err.Description
xlWb.Close
xlApp.Quit
Set xlSh = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
 
 
End Sub
J'ai 3 soucis (pour l'instant...)
- le doc modèle qui s'ouvre / se ferme comme à Noël - ce qui n'est pas très grave,
- l'insertion à l'endroit voulu du doc résultat se fait par ordre inverse
- j'ai dans l'odre le 3ème tableau puis 2 fois le premier tableau (le deuxième n'est pas affiché !)

Merci d'avance pour ton aide,

Olivier.
oamram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 21h40   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 364
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 364
Points : 29 286
Points : 29 286
J'ai ajouté des fichiers d'exemples, il n'y en a pas beaucoup.
Je vais essayer d'en mettre plus la prochaine fois et d'étoffer cet article.

Par contre je ne comprends pas très bien !
Tu fais une table par document et tu copies la table dans le document actif.
Mais tu dois rencontrer une autre erreur, le Bookmark ne peut servir qu'une fois !
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 21h54   #7
Invité de passage
 
Inscription : février 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 25
Points : 3
Points : 3
Non cela focntionne sans erreur, mais pas comme je voudrais. A priori le signet peut servir plusieurs fois... mais avec l'ordre que j'ai cité pour le résultat.

Concernant mon projet, je voudrais mettre dans word, une suite de tableau (formatés) qui sont construit à partir de données excel et cela à des endroits précis de mon document (en fonction de leurs contenus).
En espérant que ce point rajoute de la clarté dans l'expression de mon besoin.

Olivier.
oamram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 22h01   #8
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 364
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 364
Points : 29 286
Points : 29 286
C'est un peu plus complexe.
Pour les points précis, il faut ajouter des signets pour pouvoir les retrouver facilement dans le document.

Ensuite, on peut ajouter les tableaux avec la méthode Add.

Code :
ActiveDocument.Tables.Add Range:=Selection.Range , NumRows:=2, numcolumns:=3
On peut utiliser le range d'un signet

Code :
ActiveDocument.Tables.Add Range:=Bookmarks(1).range , NumRows:=2, numcolumns:=3
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 22h24   #9
Invité de passage
 
Inscription : février 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 25
Points : 3
Points : 3
J'ai essayé de tester le tables.add comme tu me l'a conseillé, mai là je bloque sur une erreur sans doute du à une utilisation trop brutale : "Erreur : 5850 La plage spécifiée ne fait pas partie du document ou de l'article sélectionné."
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
 
Sub donneeAvecExcel()
 
On Error GoTo GestErr
'Déclaration des variables
Dim xlApp As Excel.Application
Dim xlWb As Excel.Workbook
Dim xlSh As Excel.Worksheet
Dim iR As Integer
Dim i As Integer, j As Integer
Dim oDoc As Document
Dim NoFact As Integer
Dim oTbl As Table
 
Dim aDoc As Document
Set aDoc = ActiveDocument
 
'Affectation des données aux variables
Set xlApp = New Excel.Application
Set xlWb = xlApp.Workbooks.Open("D:\Olivier\Documents\Temp\Rapports\Tmp\donnees.xls")
Set xlSh = xlWb.Worksheets(1)
 
'Récupération du nombre de lignes
iR = xlSh.UsedRange.Rows.Count
 
 
' Récupération des données EXCEL pour les injecter dans le document modèle.
For i = 2 To iR
        Set oDoc = Documents.Add("D:\Olivier\Documents\Temp\Rapports\Tmp\modele.docx")
 
        Set oTbl = oDoc.Tables(1)
        oTbl.Rows.Last.Cells(1).Range.Text = xlSh.Cells(i, 1)
        oTbl.Rows.Last.Cells(2).Range.Text = xlSh.Cells(i, 2)
        oTbl.Rows.Last.Cells(3).Range.Text = xlSh.Cells(i, 3)
 
        oTbl.Range.Select
 
        aDoc.Tables.Add Range:=Selection.Range, NumRows:=2, numcolumns:=3
 
        Set oTbl = Nothing
        oDoc.Close (False)
Next i
 
Set oDoc = Nothing
Set aDoc = Nothing
 
GestErr:
'Si pas de document ouvert on fait un resume next
If Err.Number = 91 Then Resume Next
Debug.Print "Erreur : " & Err.Number & Err.Description
 
xlWb.Close
xlApp.Quit
Set xlSh = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
 
 
End Sub
Je dois certainement mal m'en servir.

Mais cela ne résoud pas mon problème pour insérer les tableaux ou je veux dans le texte et parfois plusieurs fois au même endroit.

Olivier.
oamram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 22h31   #10
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 364
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 364
Points : 29 286
Points : 29 286
Si tu pouvais mettre en commentaire ce que tu veux que ton code fasse dans ton exemple.
A force, je finis par me perdre dans tous les codes.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 22h48   #11
Invité de passage
 
Inscription : février 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 25
Points : 3
Points : 3
Voici un exemple en image qui j'espère sera plus clair que mon discours.

Les tableaux sont incorporés à la volée en fonction du contenu d'excel.

Olivier.
Images attachées
Type de fichier : jpg ex.jpg (49,2 Ko, 6 affichages)
oamram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 22h52   #12
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 364
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 364
Points : 29 286
Points : 29 286
Avec plusieurs lignes par tableau ou une seule ligne de données ?
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2008, 23h01   #13
Invité de passage
 
Inscription : février 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 25
Points : 3
Points : 3
Avec plusieurs lignes. La présentation finale sous forme de tableau est assez complexe.
En fait, cela ressemblerait plutôt à la nouvelle image jointe.
Images attachées
Type de fichier : jpg ex2.jpg (119,2 Ko, 4 affichages)
oamram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2008, 11h11   #14
Nouveau Membre du Club
 
Inscription : janvier 2005
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 54
Points : 25
Points : 25
Salut,

Voici un exemple:
J'ai des agences qui ont des prestations.
Pour chaque agence, j'affiche ses caractéristiques et les prestations qui lui sont associée:
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
Sub AccessAuxDonnees()
    Dim oRs As DAO.Recordset
    Dim db As DAO.Database
    Dim sql As String
    Dim stTemp As String
    Dim oDoc As Document
    stTemp = ""
 
    'acceder à la base
    sql = "SELECT * FROM ExtraireEtatPrestation"
    Set db = OpenDatabase("P:/DDG TFA 2007/20 - Relations clients/20 - Base Access Recensement/20080610 WTFA DDG 2007.mdb")
    Set oRs = db.OpenRecordset(sql)
 
 
    'tant qu'il existe des enregistrements
    While Not oRs.EOF
 
        If stTemp <> oRs!agen_code Then 'si c'est la premiere ligne de mon agence
             On Error Resume Next
             If oRs.AbsolutePosition <> 1 Then 'sauver le document de la précédente boucle (-sauf pour le premier)
             Debug.Print " oRs.AbsolutePosition = " & oRs.AbsolutePosition
                'On sauve le document
                 oDoc.Save
                 oDoc.Close
              End If
 
             'ajouter un document
             Set oDoc = Documents.Add("P:\DDG TFA 2007\20 - Relations clients\20 - Base Access Recensement\Etats\Etat_prestations.doc")
 
            ' On utilise les signets du document pour inscrire certaines valeurs
            'caractéristique de l'agence
            oDoc.Bookmarks("res_lib").Range.Text = oRs.Fields("res_lib").Value
            oDoc.Bookmarks("agen_code").Range.Text = oRs.Fields("agen_code").Value
            oDoc.Bookmarks("agen_lib").Range.Text = oRs.Fields("agen_lib").Value
            oDoc.Bookmarks("cont_nom").Range.Text = oRs.Fields("cont_nom").Value
            oDoc.Bookmarks("cont_tel").Range.Text = oRs.Fields("cont_tel").Value
            oDoc.Bookmarks("cont_fax").Range.Text = oRs.Fields("cont_fax").Value
            oDoc.Bookmarks("cont_mail").Range.Text = oRs.Fields("cont_mail").Value
            oDoc.Bookmarks("cont_remplacant").Range.Text = oRs.Fields("cont_remplacant").Value
            oDoc.Bookmarks("agen_adresse_TC_dest").Range.Text = oRs.Fields("agen_adresse_TC_dest").Value
            oDoc.Bookmarks("agen_adresse").Range.Text = oRs.Fields("agen_adresse").Value
            oDoc.Bookmarks("agen_cp").Range.Text = oRs.Fields("agen_cp").Value
            oDoc.Bookmarks("agen_bureau").Range.Text = oRs.Fields("agen_bureau").Value
            oDoc.Bookmarks("agen_raison").Range.Text = oRs.Fields("agen_raison").Value
            oDoc.Bookmarks("agen_num_voirie").Range.Text = oRs.Fields("agen_num_voirie").Value
            oDoc.Bookmarks("agen_lib_voirie").Range.Text = oRs.Fields("agen_lib_voirie").Value
            oDoc.Bookmarks("agen_commune").Range.Text = oRs.Fields("agen_commune").Value
            oDoc.Bookmarks("agen_siret").Range.Text = oRs.Fields("agen_siret").Value
 
            'Après les signets, on attaque la table, on va y ajouter une ligne et y inscrire des valeurs.
            If oRs!agen_code <> "" Then
                With oDoc.Tables(2).Rows 'enregistrement de l'ensemble des prestations
                    .Add
                    .Last.Cells(1).Range.Text = oRs.Fields("prest_lib")
                    .Last.Cells(2).Range.Text = oRs.Fields("trait_lib")
                    .Last.Cells(3).Range.Text = oRs.Fields("ss_trait_lib")
                    .Last.Cells(4).Range.Text = oRs.Fields("prod_destinataire")
                    .Last.Cells(5).Range.Text = oRs.Fields("prod_nb_exemplaire")
                    .Last.Cells(6).Range.Text = "*"
                    .Last.Cells(6).Range.Font.Name = "Wingdings 2"
                    .Last.Cells(6).Range.Font.Size = 20
                 End With
             Else
                  Debug.Print "erreur 1"
             End If
             'enregistrer le doc
             oDoc.SaveAs "P:\DDG TFA 2007\20 - Relations clients\20 - Base Access Recensement\Etats\Extractions Etat Prestations\" & oRs.Fields("agen_lib") & ".doc"
 
         Else
 
             With oDoc.Tables(2).Rows 'enregistrement de l'ensemble des prestations
                    .Add
                    .Last.Cells(1).Range.Text = oRs.Fields("prest_lib")
                    .Last.Cells(2).Range.Text = oRs.Fields("trait_lib")
                    .Last.Cells(3).Range.Text = oRs.Fields("ss_trait_lib")
                    .Last.Cells(4).Range.Text = oRs.Fields("prod_destinataire")
                    .Last.Cells(5).Range.Text = oRs.Fields("prod_nb_exemplaire")
                    .Last.Cells(6).Range.Text = "*"
                    .Last.Cells(6).Range.Font.Name = "Wingdings 2"
                    .Last.Cells(6).Range.Font.Size = 20
              End With
           End If
 
        stTemp = oRs![agen_code]
        oRs.MoveNext
    Wend
 
    oDoc.Save
    oDoc.Close
    Set db = Nothing
    Set oRs = Nothing
    Word.Application.Documents("Etat_prestations.doc").Close
End Sub
vavou 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 02h43.


 
 
 
 
Partenaires

Hébergement Web