Voici comment récupérer les données d'un document pour les utiliser dans un userform et les réutiliser ensuite dans un document neuf.
Ce post fait suite au fil de discussion suivant : http://www.developpez.net/forums/sho...d.php?t=587891

Le principe de base est le suivant :
1. nous allons stocker les données dans les tableaux d'un document situé dans le répertoire Mes Documents. Dans ce répertoire, nous aurons un sous répertoire Z_Sources, et un fichier SourceDeDonnees.docx.
Le document contenant les tableaux possède trois (3) tableaux avec les données, ce nombre peut être augmenté à souhait, l'adressage se faisant par l'index des tableaux.
2. Nous allons créer un document qui va servir de modèle .dotm et lors de la création d'un nouveau document basé sur ce modèle, nous allons afficher un UserForm pour faciliter le remplissage du document avec des tâches répétitives.
3. Dans ce modèle, nous devons inclure un UserForm. Alt + F11 pour afficher le VBE (Visual Basic Editor). Pour insérer un UserForm, Insertion UserForm. Pour afficher le UserForm lors de la création d'un nouveau document, il suffit d'utiliser le code suivant qui va réagir aux évènement pouvant survenir sur un document.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
Private Sub Document_New()
UserForm1.Show
End Sub
Lors de chaque création, nous aurons l'affichage du UserForm.
4. L'étape suivante est le remplissage des différents ComboBox avec des données fixes ou des données issues du document contenant nos données. Il est plus facile de modifier des données dans des tableaux de document que dans le code.
Nous allons utiliser l'évènement Initialize du UserFom.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 Private Sub UserForm_Initialize() 
 
End Sub
C'est dans cette partie que nous allons charger les données dans nos ComboBox situés sur le UserForm.
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
 Private Sub UserForm_Initialize()
'******************************************************************************
' Code s'éxécutant lors du chargement de l'UserForm
' Utilisé pour remplir les différentes listes
'******************************************************************************
'déclaration d'une variable texte qui va contenir le chemin du fichier source de données
Dim UserMyDoc As String
 
' Utilisation de la bibliothèque pour récupérer le nom du répertoire "Mes Documents"
' Il faut ajouter la référence à  : Windows Scritp Host Object Model
Dim oWsh As New WshShell
 
'Déclaration d'une variable pourle document contenant les tables
Dim oDocSour As Document
 
'Déclaration de variables pour les tables
Dim oTblComp As Table   'Table contenant les compétences
Dim oTblMod As Table    'Table contenant les modalités
Dim oTblMat As Table    'Table contenant les matières
Dim oCell As Cell
 
'Récupération du répertoire MesDocuments
UserMyDoc = oWsh.SpecialFolders("MyDocuments") & "\Z-Source\SourceDeDonnees.docx"
 
'Affectation des tables aux variables.
Set oDocSour = Documents.Open(UserMyDoc)
Set oTblComp = oDocSour.Tables(1)
Set oTblMod = oDocSour.Tables(2)
Set oTblMat = oDocSour.Tables(3)
 
'Remplissage de la première liste contenant les périodes de la journée
'avec des données préétablies dans le code.
With Me.ListHrs
    .AddItem "Période 1"
    .AddItem "Période 2"
    .AddItem "Période 3"
    .AddItem "Période 4"
    .AddItem "Période 5"
    .AddItem "Période 6"
    .AddItem "Période 7"
    .AddItem "Période 8"
End With
 
For Each oCell In oTblComp.Columns(1).Cells
    Me.Comp1.AddItem NetText(oCell.Range.Text)
    Me.Comp2.AddItem NetText(oCell.Range.Text)
    Me.Comp3.AddItem NetText(oCell.Range.Text)
Next oCell
 
For Each oCell In oTblMod.Columns(1).Cells
    Me.ComboMod1.AddItem NetText(oCell.Range.Text)
    Me.ComboMod2.AddItem NetText(oCell.Range.Text)
Next oCell
 
For Each oCell In oTblMat.Columns(1).Cells
    Me.ComboMatiere.AddItem NetText(oCell.Range.Text)
Next oCell
 
oDocSour.Close
 
Set oWsh = Nothing
Set oDocSour = Nothing
Set oTblComp = Nothing
Set oTblMod = Nothing
Set oTblMat = Nothing
 
End Sub
Voilà le code en entier, dans ce code, vous trouvez la trace d'une fonction qui a pour but le nettoyage du texte récupéré dans la cellule d'un tableau. En effet, lorsque vous récupérez le texte d'un tableau, vous avez deux caractères supplémentaires qui sont inutiles et vont gêner le processus. Cette fonction s'appelle NetText() et renvoie une variable de type String.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 Function NetText(stTemp As String) As String
'******************************************************************************
'Fonction pour extraire le texte d'une cellule
'******************************************************************************
NetText = Left(stTemp, Len(stTemp) - 2)
 
End Function
Dans cette fonction, nous utilisons deux fonctions VBA : Left et Len.
5. La dernière partie est la récupération des données du UserForm pour les injecter dans le document. Pour cette action, nous allons utiliser un simple bouton avec le code suivant :
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
 Private Sub cmdAdd_Click()
'******************************************************************************
' L'utilisation de cette commande va transférer les données du formulaire
' dans le document en focntion de la période choisie
'******************************************************************************
Dim bT As Byte
 
'Structure décisionnelle pour l'adressage du tableau correspondant à l'heure
Select Case Me.ListHrs
Case "Période 1"
    bT = 1
Case "Période 2"
    bT = 2
Case "Période 3"
    bT = 3
Case "Période 4"
    bT = 4
Case "Période 5"
    bT = 5
Case "Période 6"
    bT = 6
Case "Période 7"
    bT = 7
Case "Période 8"
    bT = 8
End Select
 
With ActiveDocument.Tables(bT)
    .Cell(1, 1).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.ComboMatiere.Value
    .Cell(1, 2).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.TextSujet.Value
    .Cell(2, 1).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.Comp1.Value
    .Cell(3, 1).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.Comp2.Value
    .Cell(4, 1).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.Comp3.Value
    .Cell(5, 1).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.TextObj.Value
    .Cell(5, 2).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.ComboMod1.Value
    .Cell(6, 2).Select
    Selection.EndKey unit:=wdLine
    Selection.TypeText Me.ComboMod2.Value
 
End With
End Sub
Ce code comporte un structure décisionnelle (Select Case) base sur le choix d'une liste. En fonction du résultat obtenu, nous allons adresser l'une ou l'autre table de notre document final pour le remplir.
Enfin, un dernier bouton pour fermer ou cacher le formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
Private Sub cmdClose_Click()
UserForm1.Hide
End Sub
L'exemple se trouve ici : http://heureuxoli.developpez.com/fichiers/yeyette.zip