formateur informatique

Compter les caractères de chaque ligne en VBA Word

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Compter les caractères de chaque ligne 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 :


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. Document Word pour compter le nombre de caractères de chaque ligne à parcourir en VBA

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.

Statistiques sur le nombre de lignes dans un document Word

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,
Créer un nouveau module de code dans le projet VBA Word

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,
Demander utilisateur nombre minimum de caractères que doivent proposer les lignes du document Word à compter

Nous indiquons ainsi que nous souhaitons compter les lignes composées d'au moins cent caractères.
  • Valider en cliquant sur le bouton Ok,
Compter les lignes de plus de 100 caractères en VBA Word

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,
Statistiques sur le nombre de grandes lignes dans le document Word en VBA

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.

Synthèse du nombre de grandes lignes en pourcentage en VBA Word

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


 
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