Extraire le résultat d'un formulaire Word vers Excel

Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012 - 16 mars 2012 à 17:24
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012 - 26 mars 2012 à 09:44
Bonjour,

Je dois faire une enquête de satisfaction clients, l'envoyer aux intéressés afin qu'ils la remplissent et me la renvoie. Cette enquête est un formulaire sous Word : j'ai inséré un certain nombre de champs de différents types (Cases à cocher, Cases d'option et zones de texte). Je souhaite pouvoir exploiter les résultats en automatisant une extraction depuis Word vers Excel.

J'ai un début de code VBA sur Excel qui me permet de recherché le fichier Word que je souhaite importer vers ce fichier Excel:


---------------------------------------------------------------------------
Sub TEST()

'Nécessite d'activer la référence "Microsoft Word xx.x Object Library"

Dim WordAps As Object
'ouvre session word
Set WordAps = CreateObject("Word.Application")
'Rendre l'application Word visible pendant l'opération
WordAps.Visible = True


'-------------CHOIX DU NOUVEAU FICHIER------------------------------

Dim Repertoire As FileDialog
Dim LeNouveauSondage As String
'Ouverture de la boite de dialogue permettant de sélectionner le fichier où se trouvent les données à importer
Set Repertoire = WordAps.FileDialog(msoFileDialogFilePicker)

With Repertoire
'Emplacement où la boite de dialogue doit s'ouvrir par défaut
.InitialFileName = "C:\Documents and Settings\All Users"
'L'utilisateur n'est pas autorisé à sélectionner plusieurs fichiers
.AllowMultiSelect = False
'Titre de la boite de dialogue
.Title = "Choisissez le fichier à importer"
'Ouvrir la boite de dialogue
.Show
End With


'-------------------Ouverture du document Word --------------------------



LeNouveauSondage = Repertoire.SelectedItems(1)
WordAps.Documents.Open LeNouveauSondage


'--------------------Récupère le contenu d'un champ-----------------------



'------------------QUITTER TOUT --------------------------

Set WordDoc = Nothing
WordAps.Quit

Set WordAps = Nothing

End Sub


---------------------------------------------------------------------------


Voilà mon problème, malgré de nombreuses recherches, je ne parviens pas à récupérer la valeur des champs de mon formulaire pour les copier dans Excel.

Auriez-vous des pistes pour m'orienter ??

(Précision non utile, mais je suis débutante sous VBA)

Merci d'avance,

Coralie

18 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 mars 2012 à 17:54
Bonjour,

Toute premère question :
tu es ici dans la section
Forum > Visual Basic 6 > Divers > Débutants

Ton code montres que tu veux piloter Word (ceci est clair)
Mais à partir de quoi ?
- de VB6 (cette section) ? mais on ne voit aucune instanciation de Excel dans ton code !
ou
- de VBA/Excel ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
19 mars 2012 à 08:50
Pardon pour cette réponse tardive, je souhaite piloter Word depuis Excel : je souhaite que les résultats de mes sondages (qui se trouvent dans Word) soient transférés sur une feuille de calcul Excel.
Coralie
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 mars 2012 à 09:24
Tu aurais donc du ouvrir la présente discussion dans la section Langages dérivés > VBA. Veille dorénavant, s'il te plait, à choisir la section adéquate.
Ta question relève principalement de tes connaissances en VBA/Word.
Or, je ne vois, dans ton code, aucune tentative d'extraction correspondant à :
j'ai inséré un certain nombre de champs de différents types (Cases à cocher, Cases d'option et zones de texte). Je souhaite pouvoir exploiter les résultats en automatisant une extraction depuis Word vers Excel.

Question, donc :
Oublions que tu pilotes depuis Excel
Quel code utiliserais-tu sous VBA/Word (directement) pour effectuer ces extractions ?

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 mars 2012 à 10:32
Bon...
Ta demande restant assez vague et vaste, je t'ai trouvé ce lien
Tapez le texte de l'url ici.
qui me parait être un bon exemple.
Inspire-t-en (dépend de ton formulaire Word).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
19 mars 2012 à 15:36
ucfoutu,

Merci pour ton lien, je regarde cette après midi et tente de l'adapter à mon cas.
Bonne journée
Coralie
0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
19 mars 2012 à 17:04
Je reste bloquée. Voici mon nouveau code :

Sub TEST()

 'Nécessite d'activer la référence "Microsoft Word xx.x Object Library"
 
    Dim WordAps As Object
    'ouvre session word
    Set WordAps = CreateObject("Word.Application")
    'Rendre l'application Word visible pendant l'opération
    WordAps.Visible = True
    
    
'-------------CHOIX DU NOUVEAU FICHIER----------------------------------


    Dim Repertoire As FileDialog
    
    Dim LeNouveauSondage As String
    'Ouverture de la boite de dialogue permettant de sélectionner le fichier où se trouvent les données à importer
    Set Repertoire = WordAps.FileDialog(msoFileDialogFilePicker)
    
    With Repertoire
        'Emplacement où la boite de dialogue doit s'ouvrir par défaut
        .InitialFileName = "C:\Documents and Settings\All Users"
        'L'utilisateur n'est pas autorisé à sélectionner plusieurs fichiers
        .AllowMultiSelect = False
        'Titre de la boite de dialogue
        .Title = "Choisissez le fichier à importer"
        'Ouvrir la boite de dialogue
        .Show
    End With
    
    
'-------------------Ouverture du document Word --------------------------


    LeNouveauSondage = Repertoire.SelectedItems(1)
    WordAps.Documents.Open LeNouveauSondage
    
    
'--------------------Récupère le contenu d'un champ-----------------------
 
 
    Dim Fich As Worksheet
    Dim nb_Champs As Integer  'nb_Champs = nombre de champs dans le document Word
    Dim i As Variant
    Dim Champ As Field
    Set Fich ThisWorkbook.Worksheets("Résultat du sondage")   'Résultat du sondage nom de la feuille de calcul
    
    nb_Champs = 116 'Il y a 116 champs
    i = 0   'initialisation
    
    For i = 0 To nb_Champs - 1
      LeNouveauSondage.Field("i") Fich.Cells(i + 1, ActiveCell.col) 'ActiveCell.col index de la colonne de la cellule active
      i = i + 1
    Next i
    
     
'------------------QUITTER TOUT --------------------------
    
    
    Set WordDoc = Nothing
    WordAps.Quit
     
    Set WordAps = Nothing
    
End Sub





J'ai donc rajouté le passage suivant:


Dim Fich As Worksheet
Dim nb_Champs As Integer 'nb_Champs = nombre de champs dans le document Word
Dim i As Variant
Dim Champ As Field
Set Fich ThisWorkbook.Worksheets("Résultat du sondage") 'Résultat du sondage nom de la feuille de calcul

nb_Champs = 116 'Il y a 116 champs
i = 0 'initialisation

For i = 0 To nb_Champs - 1
LeNouveauSondage.Field("i") Fich.Cells(i + 1, ActiveCell.col) 'ActiveCell.col index de la colonne de la cellule active
i = i + 1
Next i


Lorsque je veux exécuter mon code, l'éditeur d'Excel me dit : "Erreur de compilation : Qualificateur incorrect" au sujet du passage écrit ici en rouge. Je n'arrive pas à comprendre comment appeler le champs portant l'index i du document LeNouveauSondage.

Aurais-tu une piste ?

Coralie
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 mars 2012 à 17:23
Je ne connais pas Word, mais plusieurs choses appelles mon attention, dans ton code :
1) Field n'est pas une collection, mais un objet (champ). Field("i") ne peut que renvouer une erreur.
2) La collection des champs devrait probablement s'appeler Fields. On peut se référer à un membre d'une collection que de deux manières :
--- Fields(index) où index est un numérique
--- Fields("nom_champ")
Je doute assez que tu aies nommé un champ par i
Je devine donc (à voir) que tu aurais du écrire Fields(i)
3) ta variable nb_champs (que tu as mise à 116) ne serait-elle pas simplement LeNouveauSondage.Fields.count ?
4) Si, comme je le pense, LeNouveauSondage est le document Word, c'est un objet. Si oui, il doit être initialisé par un Set ... ... et non par un simple
5) Tu dis plus haut vouloir importer dans excel.
Or (même erroné) cette ligne :
LeNouveauSondage.Field("i") = Fich.Cells(i + 1, ActiveCell.col)
Ferait exactement le contraire (après correction) !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
20 mars 2012 à 11:22
Bonjour,
En effet, j'aurai dû écrire Fields(i).
nb_champs est bien le compte du nombre de champs du document. Le fait d'écrire LeNouveauSondage.Fields.count pourra me permettre, si je rajoute une question, de ne pas avoir a recompter le nombre de champs, ce qui sera bien pratique :)

Voilà ce que ça donne:


    Dim Fich As Worksheet
    Dim nb_Champs As Integer  'nb_Champs = nombre de champs dans le document Word
    Dim i As Variant
    'Dim Champ As Field
    Set Fich ThisWorkbook.Worksheets("Résultat du sondage")   'Résultat du sondage nom de la feuille de calcul
    
    nb_Champs = 116
    'nb_Champs = LeNouveauSondage.Fields.Count
    
    i = 1   'initialisation
    
    For i = 1 To nb_Champs

        Fich.Cells(i + 1, ActiveCell.col) LeNouveauSondage.Fields(i)   'ActiveCell.col index de la colonne de la cellule active
        i = i + 1
    Next i
    


j'ai commenté la ligne "nb_Champs = LeNouveauSondage.Fields.Count" car l'erreur : Propriété ou méthode non géré par cet objet apparaît

De même, la ligne "Fich.Cells(i + 1, ActiveCell.col) = LeNouveauSondage.Fields(i)" me renvoi la même erreur.
J'ai essayé de remplacer "ActiveCell.col" par une constante, puis "LeNouveauSondage.Fields(i)" également par une constante. l'éditeur VBA ne me signal par d'erreur uniquement quand je remplace les deux variables ("ActiveCell.col" et "LeNouveauSondage.Fields(i)") par une constante mais en même temps. Je ne sais pas si je suis bien claire !?! Si une des deux variable est remplacée par une constante, mais que l'autre reste telle quelle, j'ai une erreur. Si je remplace les 2 par des constantes, ça marche :

Fich.Cells(i + 1, 5) = 5


Le problème est que ce code n'a aucun intérêt (mis à part celui de vérifier que la boucle fonctionne)!

Le quatrième message du forum :
http://www.developpez.net/forums/d848296/logiciels/microsoft-office/excel/macros-vba-excel/exporter-resultats-cases-cocher-formulaire-word-excel/

semble exposer le même problème. La syntaxe proposée comme correcte est la suivante :
Cells(4, Ligne_Nr).Value = .ActiveDocument.Fields(i).Result


Je ne comprend pas bien le point juste avant ActiveDocument, mais mis à part ce point, la syntaxe est la même!?!

Est-ce la proposition de ce site qui est mauvaise ? ou y-a t-il, d'après toi, une explication qui ferait que cet exemple ne peut pas s'adapter à mon problème car là, je ne vois pas :s

Merci d'avance
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 mars 2012 à 11:27
Relis le point 4 de mon message précédent (tu ne sembles pas en avoir tenu compte)
Et ouvre ton aide VBA sur le mot Set (instruction) ! Cela devrait faire "tilt"


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
20 mars 2012 à 11:32
Pardon, je n'y ai pas répondu, mais je l'ai bien pris en compte :



[..]
Set LeNouveauSondage = Repertoire.SelectedItems
'WordAps.Documents.Open LeNouveauSondage


'--------------------Récupère le contenu d'un champ-----------------------


Dim Fich As Worksheet
Dim nb_Champs As Integer 'nb_Champs = nombre de champs dans le document Word
Dim i As Variant
'Dim Champ As Field
Set Fich ThisWorkbook.Worksheets("Résultat du sondage") 'Résultat du sondage nom de la feuille de calcul

nb_Champs = 116
'nb_Champs = LeNouveauSondage.Fields.Count

i = 1 'initialisation

For i = 1 To nb_Champs

Fich.Cells(4, i).Value .ActiveDocument.Fields(i).Result 'ActiveCell.col index de la colonne de la cellule active
i = i + 1
Next i


[...]


0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
20 mars 2012 à 11:34
Je consulte l'aide ...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 mars 2012 à 11:35
Là va devoir s'arrêter mon apport/aide.
Car le reste me semble dépendre de connaissances (insuffisantes chez moi) en VBA/Word


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
20 mars 2012 à 11:40
En tout cas, merci beaucoup pour tous ces conseils ;)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 mars 2012 à 21:01
Bon, Coralier7566,

J'avais espéré qu'un wordiste passe par là pour te donner un coup de main.
Cela n'a pas été le cas.

Je reprends donc le flambeau pour tenter de t'aider, mais ce sera quelque peu en aveugle.

Essaye ceci :
Option Explicit
Private Sub CommandButton1_Click()
  Dim WordApp As Object, LeNouveauSondage As Object, feuille As Worksheet, nb_champs As Integer
  Dim i As Integer, j As Integer, Repertoire As FileDialog, derlig As Long, nbfics As Long
  Set WordApp = CreateObject("Word.Application")
  Set feuille = ThisWorkbook.Worksheets("Feuil1")
  WordApp.Visible = True
  With Application.FileDialog(msoFileDialogOpen)
    .Filters.Add "documents Word", "*.doc", 1
    .InitialFileName = "C:\Documents and Settings\All Users"
    .AllowMultiSelect = True
    .Title = "Choisissez le fichier à importer"
    .Show
    nbfics = .SelectedItems.Count
  End With
    For i = 1 To nbfics
      Set LeNouveauSondage = WordApp.Documents.Open(Application.FileDialog(msoFileDialogOpen).SelectedItems(i))
      nb_champs = LeNouveauSondage.fields.Count
      derlig = feuille.Cells.SpecialCells(xlCellTypeLastCell).Row + 1
      For j = 1 To nb_champs
         feuille.Cells(derlig, j) = LeNouveauSondage.fields(j).result
      Next j
      LeNouveauSondage.Close
   Next i
  Set LeNouveauSondage = Nothing
End Sub

Le seul vrai doute que j'ai, c'est en ce qui concerne le contenu du champ. J'ai mis, mais n'en suis pas certain : la propriété result. (?)
Regarde comment je traite la boîte de dialogue :
- je le fais en n'affichant que des .doc (filtre)
- je permets une sélection multiple de fichiers (ils devraient nortmalement être ensuite traités automatiquement l'un après l'autre).

Voilà ... en croisant les doigts...(mais je devrais être très proche).
Bonne chance.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mars 2012 à 07:28
En lisant le lien que je t'ai montré plus haut, je réalise que tu utilises peut-être un formulaire word et que (selon ce lien),
feuille.Cells(derlig, j) = LeNouveauSondage.fields(j).result
serait peut-être alors, pour toi :
feuille.Cells(derlig, j) = LeNouveauSondage.formfields(j).result

Essaye toujours le second, si le premier ne va pas
Je ne peux essayer moi-même (sans Word et sans vraiment le connaître)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
21 mars 2012 à 12:07
Bonjour

Ton code fonctionne avec fields. Par contre il récupère un caractère inconnu de nos claviers (ça ressemble à un F mais sans la barre du milieu)
Je fais des recherches et te tiens au courant ...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mars 2012 à 13:11
Cela est probablement du à l'interprétation de cases à cocher en champs de ton formulaire. C'est de ce côté là, que je chercherais, à ta place.
Je regrette tellement de ne pas avoir Word sous la main


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Coralie7566 Messages postés 10 Date d'inscription vendredi 16 mars 2012 Statut Membre Dernière intervention 26 mars 2012
26 mars 2012 à 09:44
Bonjour,

Après quelques jours de recherches, de tests et de prise de tête (oui, il faut le dire !) Excel ne parvient toujours pas à interpréter les résultats dans Word. J'ai fait un test :
MsgBox ("La valeur du champs 1 est : " & LeNouveauSondage.Fields(1).Result)


Le résultat est le suivant : "La valeur du champs 1 est : " suivi du même caractère inconnu qui ressemblait à un F sans la fameuse barre du milieu(cf. mon message de mercredi 12H07).

Je songe de plus en plus sérieusement à arrêter de diffuser mon questionnaire sous Word.

En tout cas, merci pour le temps que tu as passé à m'aider.
Bonne continuation

Coralie
0
Rejoignez-nous