VBA Word : comment récupérer le nom ou l'index du champ d'un formulaire sur lequ

Signaler
Messages postés
64
Date d'inscription
vendredi 21 décembre 2001
Statut
Membre
Dernière intervention
16 janvier 2009
-
Messages postés
2
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
25 février 2010
-
Bonjour,

Voici mon problème :
Je souhaite à partir d'un document word contenant des champs de formulaires, ouvrir un userform contenant un richtext lorsque je clique sur un des champs. Ceci afin de pouvoir ensuite, renvoyer dans le champs, le contenu de mon richtext.
Donc ouvrir le userform sur un clic dans un champs, pas de problème : je lance une macro qui ouvre le userform.
Ce qui me bloque bêtement c'est que je voudrais savoir une fois dans mon userform et que j'ai saisi mon texte dans mon "richtext", quel est le nom du champs (son signet, ou même son formfield(index) ) sur lequel j'avais cliqué afin de remplir comme il se doit, le bon champs.
Merci à vous si vous pouvez m'apporter la réponse. Je sens que ça ne doit pas être bien compliqué mais..; je sèche franchement bêtement là...
POur résumer : "comment, une fois dans mon userform, savoir quel est le champ de formulaire qui a lancé la macro..."

8 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Voilà comment je ferai :
Dans le champ dans lequel tu cliques, tu ouvres ton UserForm (UF).
En utilisant cette méthode propre d'appel, tu en profite pour glisser une variable :
-1- Dans ta UF, dans la partie Déclarations, tu définis une variable déclarée en Public
Cette variable servira de passerelle entre ton doc et ta UF
   Public maVariable As String
-2- L'appel dans ta Sub "Click" :
   Dim maForme As monUserForm
   Set maForme = New monUserForm
   Load maForme   ' On ne fait que la charger
   maForme.maVariable = "Le texte actuel de mon champ, si besoin"
   maForme.Show vbModal   ' Affiche la forme et reste là
         ' tant que la forme n'est pas déchargée
Dans ta UF, avant de sortir (*), tu renvoies le texte de ta RichTextBox dans maVariable :
   maVariable = monRichTextBox.Text (ou TextRTF)
(*) Sortir = Me.Hide et surtout pas End (à bannir)
Ensuite, dans la Sub "Click", tu continues avec la récupération du texte et la fermeture de la UF
   monChampDansLeDoc = maForme.maVariable
   Set maForme = Nothing

Donc, le repérage de ton champ n'intervient que dans ton Doc, pas dans ta UF.
Avantage : Tu peux réutiliser la UF pour plusieurs champs sans difficulté.
Si tu as besoin de personnaliser la UF, il te suffit de créer autant de variable Public que de paramètres et de les affecter, par exemple à la Caption de la UF, dans le Form_Load

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
64
Date d'inscription
vendredi 21 décembre 2001
Statut
Membre
Dernière intervention
16 janvier 2009

well well
déjà, merci de te pencher sur mon problème.

Ensuite, je pense qu'il faut que je détaille le fonctionnement voulu :
les utilisateurs du document word (document verrouillé sauf les champs du formulaire)clique dans un champ du formulaire. cela se passe partie word, pas déja sur une userform)

il n'y a pas à ma connaissance (faible car je ne connais que peu vba) de Sub "Click" pour les champs d'un doc word.
Il est possible de demander l'execution d'une macro soit à l'entrée, soit à la sortie du champs. cela se paramètre dans les options des champs.

Donc mon problème est de récupérer le signet du champs dans lequel je suis pour ensuite le remplir avec le contenu du champ richtext que j'aurai ouvert via la userform.
je ne vaux pas coder le nom du champs en dur car les utilisateurs doivent pouvoir ajouter eux même ou enlever des champs texte à leur convenance (ce sont eux qui verouillent le doc ensuite)

Je ne suis pas sûr d'être clair...

En tout cas merci d'avance
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
Je vois poindre des difficultes 
Un champ dans word ex signet cest maxi 128 car sans mise en forme alors un richtextbox cest du luxe
sinon sans formulaire il existe un champ qui ouvre une entree de saisie je narrive plus a le retrouver dans INsertion CHamp dommage
Messages postés
64
Date d'inscription
vendredi 21 décembre 2001
Statut
Membre
Dernière intervention
16 janvier 2009

en fait il ne me manque plus qu'un détail... mais ce détail devient essentiel :
une façon de savoir sur quel champs j'ai cliqué.
si à partir de ma macro, je peux retrouver le champs d'ou je viens via un truc du style : activedocument.formfields.selected (malheureusement, ça n'existe pas...) j'ai tout le reste déjà ok
Il n'y a pas l'air d'y avoir de fonction de genre permettant de savoir quel objet avait le  "focus" dans le doc word avant d'ouvrir le userform...

c'est quand meme fou cette histoire...

Donc... HELP !
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
"Il n'y a pas l'air d'y avoir de fonction de genre permettant de savoir quel objet avait le  "focus" dans le doc word" : Déjà, au sein même du document ce n'est pas évident qu'on le puisse, à forciori depuis un autre objet.

Maintenant, comment se passe l'ajout de champ ? (je ne vois pas trop à quoi ça ressemble)
Est-ce que ça se fait au travers d'une macro qui s'occupe de créer une nouvelle TextBox de saisie ?
Si c'est le cas, à cet instant là, la maco connait le nom de l'objet.
Il y a peut-être moyen qu'elle stocke quequepart le nom de l'objet (dans propriété Tag de l'objet si ça existe sur ces objets là)
Messages postés
2
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
25 février 2010

Sub quelSignets()
Dim signet, index,X
Select Case Selection.Bookmarks.Count
Case 1
signet = Selection.Bookmarks(1).name
For X = 1 To ActiveDocument.FormFields.Count
If ActiveDocument.FormFields(X).name = signet Then
index = X
Exit For
End If
Next X
' accès au contenu
MsgBox "Le nom du signet est: " & signet & Chr(13) & "Le numéro d'index est:" & index & Chr(13) & " le contenu est: " & ActiveDocument.FormFields(signet).Result
Case Else
Rem pas de sélection
End Select
End Sub
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
11
Bonjour,

oui il est posible de detecter un click sur un signet. En fait cela passe par un evenement de l'application word appeler : WindowSelectionChange

Mais cet evenement n'est pas accessible en direct il faudra donc passer par un module de classe.

gastonprogram:

il y a plus simple pour recupérer l'ID d'un signet:

Msgbox Selection.BookmarkID




Donc LeDesassembleur, voici la methode proposée :

dans un module (n'importe quel module)

Option Explicit

Public WdApply As New ClasseEvenementSelectionChange '<---cette ligne est mettre en haut du module
Sub Register_EvenementSelectionChange_Handler()
    Set WdApply.WdApplyEvents = Word.Application
End Sub


Dans un module de classe appelé : ClasseEvenementSelectionChange
(?) le module de classe comme le module ou le userform s'ajoute au projet par un click droit sur ton projet dans la zone "explorateur de projets" du VBE
(?) VBE => Visual Basic Editor

' Created by 3ddI7IHd
' Creation date: 24-02-2010
' Code Reason: Cette classe permet de detecter un changement de selection
' Ici le changement permet en particulier de detecter un click sur un signet
Option Explicit

Public WithEvents WdApplyEvents As Word.Application

Private Sub WdApplyEvents_WindowSelectionChange(ByVal Sel As Selection)
    If Sel.BookmarkID > 0 Then MsgBox Sel.BookmarkID 'ici vous pouvez remplacer la MsgBox par l'ouverture d'une form ou l'execution d'une macro
End Sub


enfin pour que la classe soit charger à l'ouverture du fichier il faut ajouter dans le code de ThisDocument

Private Sub Document_Open()
    Call Register_EvenementSelectionChange_Handler
End Sub


une fois que tout cela est en place sauve ton fichier et pour charger la classe sans fermer et ouvrir le fichier il suffit d'executer la macro:

Register_EvenementSelectionChange_Handler

Note que lors des bidouilles que tu effecturas sur ton code et notament dans le code du module de classe, cette classe aura tendance à se decharger.
Il te faudra alors pour prendre en compte les changements recharger la classe en executant la macro Register_EvenementSelectionChange_Handler.

A+
Messages postés
2
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
25 février 2010

Bonjours,
Je ne sais pas si je procède de la bonne façon car c'est la deuxième fois que je participe sur le forum.
bigfish_le vrai:
il y a plus simple pour recupérer l'ID d'un signet:

Code Visual Basic :Msgbox Selection.BookmarkID

Msgbox Selection.BookmarkID
Merci de ta réponse
au sujet de detecter un click sur un signet
J'ai essayer le code et j'en suis ravi ça marche.

c'est super.
je ne travaillait pas avec les classes.
Y'a t'il d'autres évènements que l'on peut récupérer comme
mouse_up ect..