Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Statistiques sur les longues lignes
A des fins de statistiques, cette nouvelle
astuce VBA Word montre comment
comptabiliser les lignes riches d'un document. Et pour cela, il est question de dénombrer celles qui possèdent au moins le même
nombre de caractères que celui renseigné par l'utilisateur par le biais d'une boîte de dialogue.
Document source à télécharger
Pour le développement de cette nouvelle
astuce , nous suggérons d'appuyer l'étude sur un
document offrant quelques
lignes de texte , dont certaines sont suffisamment garnies.
Nous découvrons effectivement un
petit document composé de
quelques lignes . Il s'agit de l'amorce d'une
formation sur le publipostage avec Word . C'est précisément parce que ses lignes ne sont pas nombreuses que nous pourrons vérifier facilement la cohérence des
statistiques que nous livrerons par le
code VBA . Pour information, ce document est composé de 11 lignes.
Pour le vérifier, vous pouvez certes les compter. Mais il existe un moyen encore plus simple. Il suffit de cliquer sur l'indication sur le
nombre de mots , en bas à gauche de la fenêtre.
Dès lors, une boîte de dialogue offrant des statistiques sur le document en cours apparaît. Et l'information sur le
nombre de lignes y est effectivement offerte.
La déclaration des variables
Pour débuter conventionnellement, nous avons besoin de
déclarer des variables , notamment pour connaître le
nombre de caractères minimum imposé par l'utilisateur mais aussi pour savoir
combien de lignes sont à parcourir dans le document. Et comme ce traitement peut s'avérer utile, nous proposons de développer sa procédure dans le
modèle Word , le
normal.dotm .
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word ,
Dans l'explorateur de projet sur la gauche, cliquer droit sur le modèle nommé Normal ,
Dans le menu contextuel, pointer sur le menu Insertion puis choisir l'option Module ,
Cette action a pour effet de créer un nouveau dossier dans l'arborescence. Il est nommé Module et il abrite un module nommé
Module1 . Sa feuille de code s'affiche instantanément au centre de l'écran. Elle est fort naturellement vierge pour l'instant.
Dans cette feuille de code , créer la procédure lignesSup comme suit :
Sub lignesSup()
End Sub
Maintenant qu'elle existe, son développement peut commencer. C'est elle que nous associerons à un bouton de ruban en faisant la liaison par son nom.
Dans les bornes de cette procédure, ajouter les déclarations de variables suivantes :
Dim nbCar As Integer: Dim nbLignes As Integer
Dim compteLignes As Integer: Dim pourcentage As Double: Dim compteur As Integer
Dim nbOk As String
La
variable nbCar est déclarée comme un entier (Integer). Dans une
boucle destinée à passer en revue tour à tour
toutes les lignes du document , son rôle est de prélever le
nombre de caractères pour chacune. Bien sûr, pour organiser cette
boucle , nous avons besoin d'une
variable dans laquelle l'information sur le
nombre total de lignes est stockée. C'est le rôle de la
variable nbLignes que nous typons elle aussi comme un entier. La
variable compteLignes doit incrémenter un compteur dès que l'une de ces lignes possède au moins le
nombre de caractères demandés. C'est elle qui livrera la statistique finale à l'issue de la boucle, soit une fois que toutes les lignes du document auront été étudiées. La
variable compteur doit être utilisée comme
variable de boucle pour débuter l'étude à partir de la première ligne (1) jusqu'à la dernière (nbLignes). La
variable pourcentage est typée comme un réel double. Elle porte bien son nom. Par un petit calcul, elle doit indiquer quel est le
pourcentage de lignes répondant favorablement au critère du
nombre de caractères . Enfin, la
variable nbOk est typée comme un
String , soit comme un texte. En effet, nous allons y stocker la saisie de l'utilisateur par le biais d'une boîte de dialogue. Nous évitons ainsi toute incompatibilité de type. Mais nous le savons, le
VBA est permissif. Lors de la comparaison numérique, il s'adaptera automatiquement.
Nombre minimum de caractères
Ensuite, nous devons communiquer avec l'utilisateur pour connaître le
nombre minimum de caractères qu'une
ligne doit porter pour être considérée comme "qualifiée". En
VBA , c'est la
fonction InputBox qui offre une
boîte de dialogue avec une
zone de saisie . L'information qu'elle retourne est la donnée tapée par l'utilisateur. Et cette donnée doit être stockée dans la variable dédiée, la
variable nbOk .
Après la déclaration des variables , ajouter l'instruction VBA suivante :
...
nbOk = InputBox("Nb. caractères minimum que chaque ligne analysée doit comporter : ", "Nb. car.")
...
En premier paramètre de la fonction, nous inscrivons l'indication destinée à l'utilisateur. En second paramètre, nous fournissons un titre à cette boîte de dialogue. Lorsque l'utilisateur cliquera sur le bouton Ok, sa saisie sera stockée dans la
variable nbOk .
Nombre de lignes dans le document
Ensuite, il est question de connaître le
nombre de lignes à étudier pour savoir si elles comportent bien le
nombre de caractères requis. L'
objet ActiveDocument offre des collections comme la
collection des paragraphes . Cette dernière retourne un
tableau de tous les paragraphes contenus dans le document en cours. De fait, elle permet de connaître leur nombre. Mais cet
objet ActiveDocument n'offre pas une collection similaire pour renseigner sur les
lignes du document . Par contre, il offre une
méthode qui se nomme
ComputeStatistics . Et cette dernière, comme son nom l'indique, permet d'accéder à des statistiques comme celle du
nombre de lignes dans le document en cours.
A la suite du code VBA, ajouter les deux instructions suivantes :
...
nbLignes = ActiveDocument.ComputeStatistics(wdStatisticLines)
MsgBox nbLignes & " lignes au total - nb caractères minimum : "& nbOk
...
C'est donc avec le
paramètre wdStatisticLines , proposé par IntelliSense, que cette
méthode renseigne sur le
nombre de lignes , désormais stocké dans la
variable nbLignes . Ensuite, à titre de vérification et par concaténation, nous affichons temporairement ces deux valeurs récoltées dans une boîte de dialogue, grâce à la
fonction VBA MsgBox .
Enregistrer les modifications (CTRL + S) et exécuter le code (F5),
Dans la boîte de dialogue qui apparaît, taper par exemple la valeur 100 ,
Nous indiquons ainsi que nous souhaitons compter les lignes composées d'au moins cent caractères.
Valider en cliquant sur le bouton Ok,
Comme vous pouvez le voir, une seconde boîte de dialogue apparaît. Elle n'autorise pas la saisie. Mais elle fournit l'indication sur le
nombre de lignes composant le document et elle confirme que la donnée sur le
nombre de caractères minimum a bien été enregistrée.
Cliquer sur le bouton Ok de cette seconde boîte de dialogue pour revenir dans l'éditeur VBA ,
Parcourir les lignes du document
Maintenant que ces informations sont récoltées, nous disposons de la donnée nécessaire pour
parcourir toutes les lignes du document actif . Pour cela, il suffit d'engager une
boucle For Next débutant l'analyse à partir de la première ligne (compteur = 1) et la poursuivant jusqu'à la dernière (nbLignes).
Tout d'abord, passer la ligne du MsgBox en commentaire en la préfixant d'une apostrophe ('),
Puis, Ã la suite du code, ajouter les instructions VBA suivantes :
...
Selection.HomeKey wdStory
For compteur = 1 To nbLignes
Next compteur
...
Tout d'abord et
avant d'initialiser la boucle , nous exploitons une
méthode désormais bien connue de l'
objet VBA Selection . Il s'agit de la
méthode HomeKey . Avec la
valeur wdStory en paramètre, elle permet de replacer le
point d'insertion au
tout début du document . C'est ainsi que nous allons pouvoir
parcourir toutes ses lignes sans en omettre une. C'est alors que nous initialisons la
boucle For avec la
variable compteur qui doit partir de la première ligne (1) pour rejoindre la dernière (nbLignes).
Nombre de caractères ligne à ligne
Maintenant que la
boucle existe, Ã chaque passage, donc pour
chaque ligne , nous devons
compter les caractères qu'elle recèle. Grâce à de nombreuses astuces précédentes, nous avons appris que le précieux
objet Selection offrait de nombreux
objets enfants ,
propriétés et
méthodes . Cet objet représente la
sélection active . Et l'une des
propriétés de l'un de ses
objets enfants renseigne sur le
nombre de caractères contenus dans la sélection. En d'autres termes, à chaque passage dans la
boucle , nous devons commencer par sélectionner la ligne en cours pour dénombrer ses lettres. Et comme nous l'avons appris, puisque l'
objet VBA Selection va largement être mis à contribution, nous allons optimiser les instructions de code dans un
bloc With .
Dans la boucle , créer le bloc With suivant :
...
With Selection
.EndKey wdLine, wdExtend
nbCar = .Characters.Count
End With
...
L'
objet Selection est ainsi désigné comme l'
objet parent . Dans le
bloc With , il faut bien veiller à préfixer les
propriétés ,
objets enfants et
méthodes d'un point pour les appeler. La
méthode EndKey permet d'
atteindre la fin d'un élément à désigner. Avec la
valeur wdLine en premier paramètre, nous demandons d'atteindre la
fin de la ligne en cours d'analyse, mais pas n'importe comment. Avec la
valeur wdExtend en second paramètre, nous englobons dans la sélection tous les caractères du premier jusqu'au dernier. C'est ainsi que nous allons pouvoir les compter. Et c'est bien ce que nous faisons dans l'enchaînement. La
propriété Characters de l'
objet Selection représente la
collection des caractères contenus dans la sélection ainsi générée. Sa
propriété Count renvoie leur nombre que nous stockons dans la
variable nbCar .
Compter les grandes lignes
A chaque passage dans cette boucle, nous devons désormais confronter ce
nombre de caractères à celui défini par l'utilisateur. S'il est au moins aussi grand, nous devons considérer la ligne en cours d'analyse comme une grande ligne en incrémentant le compteur de décombrement (compteLignes). Et pour vérifier un critère, nous avons besoin d'une
instruction conditionnelle .
A la suite et toujours dans le bloc With , créer l'instruction conditionnelle suivante :
...
If nbCar >= nbOk Then
compteLignes = compteLignes + 1
End If
...
C'est bien cette
variable compteLignes qui fournira la statistique attendue à l'issue du traitement récursif organisé par la boucle.
Replacer la sélection en début de ligne
Ensuite et avant d'accepter que la boucle focalise son attention sur la
ligne suivante , nous devons tout d'abord
déplacer le point d'insertion au
tout début de cette prochaine ligne . C'est alors que la
méthode EndKey utilisée en début de boucle sera capable de la sélectionner pour poursuivre cette analyse récursive des lignes, les unes à la suite des autres.
Après l'instruction conditionnelle et toujours dans le With, ajouter les instructions suivantes :
...
.MoveLeft wdCharacter, 1
.MoveDown wdLine, 1 'Début de la ligne suivante
Application.ScreenUpdating = False
...
Avec la
méthode MoveLeft appliquée sur la sélection active, nous engageons un déplacement d'une unité sur les caractères (wdCharacter). De cette manière, nous replaçons le point d'insertion au tout début de la ligne qui vient d'être analysée. Puis, avec la
méthode MoveDown , nous engageons un déplacement d'une ligne (wdLine) vers le bas. De fait, le point d'insertion est prêt. Il est désormais placé au tout début de la prochaine ligne à analyser. C'est ainsi que la
méthode EndKey en début de boucle pourra la sélectionner pour compter ses caractères. Ensuite, la
méthode ScreenUpdating de l'
objet VBA Application impose à l'écran de ne pas se rafraîchir tant que le traitement n'est pas terminé. Grâce à elle, nous ne verrons pas l'écran défiler.
Avant de poursuivre, nous proposons de réaliser des tests visuels. Nous souhaitons afficher les informations récoltées au fur et à mesure de l'analyse des lignes par la boucle.
Toujours dans le bloc With et à la suite, ajouter l'instruction VBA suivante :
...
MsgBox "Numéro de ligne : " & compteur & Chr(13) & "Nb. Car. Ligne en cours : " & nbCar & Chr(13) & "Nb. Lignes Ok : " & compteLignes
...
Nous exploitons donc de nouveau la
fonction MsgBox pour restituer des informations à l'écran. Et nous les affichons ligne à ligne grâce à la
fonction Chr qui permet de réaliser un retour chariot lorsque la
valeur 13 lui est passée en paramètre. Ainsi, nous indiquons le numéro de la ligne en cours d'analyse (compteur), son nombre de caractères (nbCar) ainsi que le nombre de lignes ayant passé le test à ce stade (compteLignes).
Enregistrer les modifications (CTRL + S) et exécuter le code (F5),
A la première invite, taper le nombre 100 pour la quantité de caractères à honorer,
Puis, valider en cliquant sur le bouton Ok de la boîte de dialogue InputBox ,
Comme vous pouvez le voir et désormais, à chaque fois que vous cliquez sur le bouton Ok de la boîte de dialogue, la boucle poursuit son analyse. Les informations s'actualisent. Et fort logiquement, le compteur de la ligne en cours progresse plus vite que le compteur des lignes répondant favorablement au critère sur le
nombre minimum de caractères .
Valider ces boîtes de dialogue jusqu'à la dernière pour revenir dans l'éditeur VBA Word ,
Puis, passer la ligne du précédent MsgBox en commentaire en la préfixant d'une apostrophe,
Afficher la synthèse des lignes
Pour
terminer le code VBA , nous devons rendre compte de l'analyse engagée par la boucle. Nous proposons de livrer la synthèse encore une fois dans une boîte de dialogue.
Après la boucle, donc juste avant le End Sub, ajouter les instructions suivantes :
...
Selection.HomeKey wdStory
pourcentage = Math.Round((compteLignes / nbLignes) * 100, 0)
MsgBox compteLignes & " lignes possèdent au moins cette longueur dans le document, soit : " & pourcentage & "% du document."
...
Tout d'abord, nous replaçons le point d'insertion tout en haut du document grâce à la
méthode HomeKey de l'
objet Selection . Ensuite, nous calculons le pourcentage de lignes répondant favorablement au critère, sur l'ensemble du document analysé. Cette division, nous la multiplions par Cent et nous ne conservons pas les décimales grâce à la
fonction Round de l'
objet VBA Math . Puis, nous restituons les informations dans une boîte de dialogue, toujours grâce à la
fonction MsgBox .
Enregistrer les modifications et exécuter le code VBA ,
A l'invite de la première boîte de dialogue, taper le nombre 100 comme précédemment,
Puis, lancer l'analyse en validant par le bouton Ok,
Comme vous pouvez l'apprécier, la synthèse est aussitôt livrée.
Dans ce petit document, elle indique sans équivoque qu'un peu plus de la moitié des lignes (55%) sont composées d'au moins cent caractères, espaces compris.
Bien sûr, pour chapoter la solution il convient d'
exécuter ce code VBA au
clic sur un bouton placé dans un ruban personnalisé. Mais nous ne reviendrons pas sur ces notions dans la mesure où nous les avons largement démontrées à l'occasion de nombreuses astuces, notamment à l'issue de la première sur l'
injection automatique de texte dans un document .
Le code complet de la
procédure VBA que nous avons construite est le suivant :
Sub lignesSup()
Dim nbCar As Integer: Dim nbLignes As Integer
Dim compteLignes As Integer: Dim pourcentage As Double: Dim compteur As Integer
Dim nbOk As String
nbOk = InputBox("Nb. caractères minimum que chaque ligne analysée doit comporter : ", "Nb. car.")
nbLignes = ActiveDocument.ComputeStatistics(wdStatisticLines)
'MsgBox nbLignes & " lignes au total - nb caractères minimum : " & nbOk
Selection.HomeKey wdStory
For compteur = 1 To nbLignes
With Selection
.EndKey wdLine, wdExtend
nbCar = .Characters.Count
If nbCar >= nbOk Then
compteLignes = compteLignes + 1
End If
.MoveLeft wdCharacter, 1
.MoveDown wdLine, 1 'Début de la ligne suivante
Application.ScreenUpdating = False
'MsgBox "Numéro de ligne : " & compteur & Chr(13) & "Nb. Car. Ligne en cours : " & nbCar & Chr(13) & "Nb. Lignes Ok : " & compteLignes
End With
Next compteur
Selection.HomeKey wdStory
pourcentage = Math.Round((compteLignes / nbLignes) * 100, 0)
MsgBox compteLignes & " lignes possèdent au moins cette longueur dans le document, soit : " & pourcentage & "% du document."
End Sub