formateur informatique

Parcourir tous les contrôles ActiveX en VBA Word

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Parcourir tous les contrôles ActiveX en VBA Word
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Parcourir tous les contrôles d'un document

Dans ce nouveau volet VBA Word, nous proposons de développer une solution en deux étapes. Il est question de valider un formulaire. Ce formulaire peut être utilisé pour réaliser des sondages, des inscriptions ou encore des identifications. Mais avant de le valider pour archiver les informations en base de données Access, encore faut-il s'assurer que tous les champs sont bien renseignés. Et pour cela, cette nouvelle astuce montre comment parcourir tous les contrôles ActiveX d'un document Word, pour vérifier leurs contenus.

Document source et formulaire
Pour le développement du code VBA, nous proposons d'appuyer l'étude sur un document offrant déjà ces contrôles ActiveX pour former un formulaire. Contrôles ActiveX sur document pour formulaire VBA Word

Nous découvrons effectivement un formulaire organisé par des contrôles ActiveX. Nous dénombrons la présence de trois listes déroulantes mais aussi de deux zones de texte ainsi que d'un bouton pour procéder à la validation des informations saisies.

Les listes déroulantes offrent des choix. Vous pouvez le constater en les déployant tour à tour. Elles se remplissent automatiquement à l'ouverture du document grâce à un code VBA placé dans une judicieuse procédure événementielle. Et nous proposons de le constater.
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
  • Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément ThisDocument,
Nous découvrons ainsi le code VBA déjà présent et attaché au document actif. Il est inscrit dans la procédure événementielle Document_Open. Il s'exécute donc à chaque ouverture du document. Les listes déroulantes sont reconnues par leurs noms respectifs : civilite, tAge et logiciel. Et c'est leur méthode AddItem qui permet de leur injecter les informations souhaitées.

Procédure VBA sur ouverture du document Word pour remplir automatiquement des listes déroulantes

Au clic sur le bouton
Pour débuter, nous devons commencer par créer la procédure événementielle attachée au bouton Valider. Le code VBA de cette procédure doit se déclencher au clic sur ce dernier.
  • Revenir sur le document Word (ALT + Tab),
  • En haut de la fenêtre, cliquer sur l'onglet Développeur pour activer son ruban,
S'il n'est pas visible dans votre environnement, vous devez le rendre disponible. Pour cela, vous devez réaliser premièrement un clic droit, n'importe où sur le ruban Actif. Dans le menu contextuel, vous devez choisir la commande Personnaliser le ruban. Dans la liste de droite de la boîte de dialogue qui suit, vous devez cocher la case Développeur et valider par le bouton Ok.

Contrôle ActiveX du ruban Développeur pour formulaire Word

Pour information, les contrôles que nous avons exploités sont des contrôles ActiveX. Ils offrent en effet de riches propriétés et méthodes. C'est ainsi que nous pouvons les paramétrer et les piloter facilement par le code VBA. Vous pouvez accéder à ces contrôles en déployant l'affichage du bouton Outils hérités, en bas de la section Contrôles du ruban Développeur.
  • Dans cette section Contrôles, cliquer maintenant sur le bouton Mode création,
Grâce à lui, nous pouvons atteindre chacun des contrôles du document en mode conception.
  • Dès lors, double cliquer sur le bouton Valider,
Comme vous pouvez le voir, nous basculons aussitôt dans l'éditeur VBA Word, entre les bornes de la procédure événementielle valider_Click. Son code VBA se déclenchera donc au clic sur le bouton Valider.

Variables et contrôles
Maintenant, nous devons déclarer les variables nécessaires au traitement. Elles ne sont que deux. La première doit être une variable objet. Elle doit représenter un contrôle au sens large. C'est grâce à elle, encapsulée dans une boucle For Each, que nous pourrons passer toutes les zones de texte et listes déroulantes en revue. En effet, il n'est pas question de les énumérer tour à tour pour vérifier leurs contenus. Le code serait fastidieux et ne s'ajusterait pas automatiquement si de nouveaux contrôles venaient à prendre place. La seconde variable doit être une variable de test. Elle doit basculer son indicateur dès qu'un champ vide est détecté. C'est grâce à son indicateur que nous saurons prendre la bonne décision à la validation du formulaire.
  • Dans les bornes de la procédure événementielle, ajouter les deux déclarations suivantes :
...
Dim controle As InlineShape
Dim test As Boolean
...


Aussi surprenant que cela puisse paraître, un contrôle ActiveX est considéré en effet comme une vulgaire forme géométrique (InlineShape) comme le sont les formes de dessin, accessibles depuis le ruban insertion. Mais nous le verrons, ce type d'objet généraliste permet de descendre dans la hiérarchie pour préciser la nature de la forme et ainsi désigner chaque contrôle. De son côté, la variable test est déclarée comme un booléen. Elle ne peut prendre que deux valeurs (True ou False soit Vrai ou Faux). Et justement, nous devons initialiser l'état de départ de cette variable.
  • A la suite du code VBA, ajouter l'affectation suivante :
...
test = True
...


C'est plutôt original mais nous partons du principe que tous les champs du formulaire sont correctement renseignés. C'est la boucle parcourant chaque contrôle qui doit apporter la preuve du contraire. Et dans cette boucle, nous devons être en mesure d'accéder au contenu de chaque champ pour vérifier s'il est vide ou non.

Boucle For Each sur les contrôles du document
Nous l'avons déjà évoqué, maintenant que la variable représentant une forme au sens large existe, nous devons engager une boucle capable de les parcourir toutes. L'avantage d'une boucle For Each est qu'elle s'adapte automatiquement au nombre des contrôles présents.
  • Toujours à la suite du code VBA, créer désormais la boucle For Each suivante :
...
For Each controle In ActiveDocument.InlineShapes

Next controle
...


Vous le savez, dans une boucle For Each, l'objet utilisé (controle) doit être du même type que le groupe d'éléments qu'il parcourt. C'est donc le cas avec la collection InlineShapes de l'objet ActiveDocument. Désormais, cette boucle parcourt toutes les formes recensées dans le document actif.

Tester le contenu des contrôles ActiveX
Maintenant et nous l'avons annoncé, nous devons atteindre le contenu textuel de chaque forme ainsi parcourue. Une instruction conditionnelle est donc nécessaire pour réaliser le test. Mais ces objets de forme ne proposent pas de propriété permettant d'atteindre leurs contenus. En revanche, elles offrent des propriétés et objets enfants qui permettent d'y descendre.
  • Toujours à la suite du code et dans la boucle, ajouter l'instruction conditionnelle suivante :
...
If (controle.OLEFormat.Object.Value = "") Then
test = False
Exit For
End If
...


Nous descendons donc dans la hiérarchie grâce à la propriété OLEFormat qui permet de désigner l'objet ActiveX (Object) pour atteindre sa propriété Value, soit son contenu. Nous testons s'il est vide. Si cette condition est vérifiée, nous basculons l'état de la variable booléenne à False et nous quittons la boucle (Exit For). En effet, il ne nous en faut pas plus. Nous savons d'ores et déjà qu'au moins l'un des champs n'a pas été renseigné. Nous devons donc stopper le traitement et en informer l'utilisateur.

Valider ou invalider l'inscription
L'issue de ce premier volet est toute trouvée pour cette application. Si le booléen répond favorablement (True), nous devons engager l'inscription des informations fournies en base de données. Et ce morceau, nous l'aborderons dans la prochaine partie. Le cas échéant (False), le traitement doit être avorté et l'utilisateur doit en être informé pour renseigner les informations manquantes.
  • Après la boucle, ajouter l'instruction conditionnelle suivante :
...
If (test = False) Then
MsgBox "Tous les champs doivent être renseignés pour valider l'inscription"
Else
MsgBox "Les réponses sont acceptées - Le formulaire est prêt à être validé"
End If
...


C'est donc une simple fonction MsgBox qui signe le verdict à ce stade. Mais elle concrétise bien le cas dans la mesure où elle confirme que nous avons bien réussi à parcourir tous les contrôles ActiveX du document. Et c'est ce que nous entendons vérifier.
  • Basculer sur le document Word (ALT + Tab),
  • Dans le ruban Développeur, cliquer sur le bouton Mode Création,
Ainsi, nous désactivons le mode conception pour exploiter le formulaire en production.
  • Renseigner quelques zones et listes déroulantes, mais pas complètement,
  • Puis, cliquer sur le bouton Valider,
Inscription sur formulaire Word refusée car certains champs ne sont pas renseignés

Comme vous pouvez le constater, la sentence est sans appel. Des informations manquantes ont été décelées grâce à notre boucle permettant de parcourir tous les contrôles ActiveX du document. En conséquence, la route est barrée et l'exécution est stoppée.

En revanche, si vous remplissez les champs manquants et que vous validez l'inscription, cette fois le message est beaucoup plus accueillant. Il annonce le traitement à suivre pour l'injection en base de données. C'est un sujet à part entière. C'est la raison pour laquelle nous le développerons dans le volet suivant.

Le code complet de la procédure VBA que nous avons construite est le suivant :

Private Sub valider_Click()
Dim controle As InlineShape
Dim test As Boolean

test = True

For Each controle In ActiveDocument.InlineShapes
If (controle.OLEFormat.Object.Value = "") Then
test = False
Exit For
End If
Next controle

If (test = False) Then
MsgBox "Tous les champs doivent être renseignés pour valider l'inscription"
Else
MsgBox "Les réponses sont acceptées - Le formulaire est prêt à être validé"
End If

End Sub


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn