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.
Lors de chaque création, nous aurons l'affichage du UserForm.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Document_New() UserForm1.Show End Sub
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.
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 Private Sub UserForm_Initialize() 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
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
Dans cette fonction, nous utilisons deux fonctions VBA : Left et Len.
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
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 :
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.
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
Enfin, un dernier bouton pour fermer ou cacher le formulaire.
L'exemple se trouve ici : http://heureuxoli.developpez.com/fichiers/yeyette.zip
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub cmdClose_Click() UserForm1.Hide End Sub
Partager