Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Word > Contribuez

Réponse
 
Outils de la discussion
Vieux 10/08/2008, 19h05   #1 (permalink)
Responsable Word
 
Avatar de Heureux-oli
 
Date d'inscription: février 2006
Localisation: Morlanwelz (Carnières)
Âge: 44
Messages: 10 115
Par défaut Comment récupérer des données d'un document pour les insérer dans un userform

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 :
 
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 :
 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 :
 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 :
 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 :
 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 :
 
Private Sub cmdClose_Click()
UserForm1.Hide
End Sub
L'exemple se trouve ici : http://heureuxoli.developpez.com/fichiers/yeyette.zip
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Ne posez pas de question par MP, c'est inutile.
Les rubriques Office recrutent.
Ma page d'accueil
Consultez nos FAQ !! Word ; Access ; Outlook ; Excel ; PowerPoint ; SharePoint
Si vous pensez que certains sujets manquent dans la FAQ, aidez nous !
Des images
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation
NEWS MS-OFFICEFAQs OFFICETUTORIELS OFFICELIVRES OFFICESOURCES VBAACCESS

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Word > Contribuez

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide