Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Fréquence des lettres
A des fins statistiques, nous allons apprendre dans ce nouveau volet à calculer la
fréquence de répétition des caractères et plus précisément des
lettres présentes dans le document. Et pour cela, c'est une nouvelle
astuce VBA Word qui va nous permettre de
parcourir tout le document
caractère à caractère.
Document source
Pour la mise en place de cette nouvelle
astuce, nous proposons tout d'abord de récupérer un
document offrant quelques paragraphes.
Nous découvrons effectivement un
document constitué de
quelques paragraphes. Ils ont été
insérés automatiquement grâce à une
fonction de Word que nous avions démontrée à l'occasion de la toute
première astuce de cette série.
Procédure et variables
Pour entrer dans le vif du sujet, nous devons commencer par créer la
procédure pour accueillir le
code VBA destiné à livrer ces statistiques.
- 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,
Ainsi, nous affichons la
feuille de code attachée au
document en cours, au centre de l'écran. Bien entendu, elle est vierge pour l'instant. Pour une
macro utilisable par
tous les documents Word, nous devrions la coder dans un module de l'
élément Normal. Il s'agit du
modèle Word. C'est à vous de choisir.
- Dans la feuille de code, créer la procédure compterCar comme suit :
Sub compterCar()
End Sub
Maintenant qu'elle existe, nous pouvons initialiser les
variables nécessaires au développement.
- Dans les bornes de la procédure, ajouter les déclarations de variables suivantes :
Sub compterCar()
Dim tabCar(0 To 25) As Integer
Dim i As Byte: Dim chaqueCar As Variant
Dim retour As String
End Sub
Nous déclarons tout d'abord un
tableau de variables (tabCar) capable d'accueillir 26 éléments (0 To 25) pour les
26 lettres de l'alphabet. Il est déclaré comme un
tableau d'entiers car ce sont les
codes Ascii de ces lettres que nous allons y stocker. Ensuite, nous déclarons une variable (i) comme un
entier court. Son rôle est de prélever le
code Ascii de la lettre en cours d'analyse dans le document. Ce sont ces valeurs que nous devrons stocker dans le
tableau de variables. Puis, nous déclarons une variable (chaqueCar) que nous ne typons pas (As Variant). Elle doit servir à parcourir chaque caractère du document. Son type sera forcé par la
boucle For Each que nous devons engager. Enfin nous déclarons la
variable retour comme un
texte (As String). C'est elle qui doit consolider les
statistiques de fréquence des lettres pour les restituer sur un nouveau
document Word.
Parcourir les caractères du document
Il est maintenant question d'analyser
chaque caractère du document.
Sub compterCar()
Dim tabCar(0 To 25) As Integer
Dim i As Byte: Dim chaqueCar As Variant
Dim retour As String
For Each chaqueCar In ActiveDocument.Characters
i = Asc(chaqueCar)
Next chaqueCar
End Sub
La
propriété Characters de l'
objet VBA Word ActiveDocument renvoie la
collection de tous les caractères présents dans le document. C'est ainsi que dans cette
boucle For Each, la
variable chaqueCar est reconnue comme un
caractère, celui en cours d'analyse, en partant du premier jusqu'au dernier. A chaque passage dans la boucle, donc pour chaque caractère les uns après les autres, nous prélevons les
codes Ascii respectifs grâce à la
fonction VBA Asc.
Analyser les lettres de l'alphabet
Nous devons utiliser ces
codes Ascii identifiant les lettres pour incrémenter les répétitions dans le
tableau de variables, à chaque fois qu'une même lettre est rencontrée. Il est important de savoir que la première lettre de l'alphabet (la lettre a) correspond au
code Ascii 97 tandis que la dernière (la lettre z) correspond au
code Ascii 122. Elles sont toutes dans l'enchaînement. Il est donc question d'ignorer tous les caractères dont les
codes Ascii ne sont pas compris dans cette fourchette.
Sub compterCar()
Dim tabCar(0 To 25) As Integer
Dim i As Byte: Dim chaqueCar As Variant
Dim retour As String
For Each chaqueCar In ActiveDocument.Characters
i = Asc(chaqueCar)
If i >= 97 And i <= 122 Then
End If
Next
End Sub
C'est donc une
double vérification que nous engageons pour nous assurer que le code précédemment prélevé est bien compris dans la
fourchette des lettres de l'alphabet.
Comptabiliser les fréquences
S'il s'agit bien d'une
lettre de l'alphabet, à chaque fois qu'elle est rencontrée, il est question d'
incrémenter sa fréquence dans le
tableau de variables sur la position correspondante. Mais attention, le tableau de variables démarre à la rangée zéro pour terminer à la rangée 25. Pour réajuster les codes Ascii sur ces emplacements, nous devons donc les décrémenter de quatre vingt dix-sept (97) unités.
- Dans les bornes de l'instruction conditionnelle, ajouter la ligne VBA suivante :
Sub compterCar()
Dim tabCar(0 To 25) As Integer
Dim i As Byte: Dim chaqueCar As Variant
Dim retour As String
For Each chaqueCar In ActiveDocument.Characters
i = Asc(chaqueCar)
If i >= 97 And i <= 122 Then
tabCar(i - 97) = tabCar(i - 97) + 1
End If
Next
End Sub
Ainsi, à chaque fois qu'une même lettre est rencontrée, son
score de fréquence est incrémenté sur sa position réajustée de 97 unités dans le
tableau de variables.
Statistiques de fréquences
Maintenant, il est question de rendre compte de ces
résultats statistiques sur un nouveau document.
- Après la boucle For Each, ajouter les deux instructions VBA suivantes :
Sub compterCar()
Dim tabCar(0 To 25) As Integer
Dim i As Byte: Dim chaqueCar As Variant
Dim retour As String
For Each chaqueCar In ActiveDocument.Characters
i = Asc(chaqueCar)
If i >= 97 And i <= 122 Then
tabCar(i - 97) = tabCar(i - 97) + 1
End If
Next
Documents.Add
Selection.TypeText "Décompte des lettres en minuscules - Les majuscules ne sont pas comptées." & vbCrLf
End Sub
C'est tout simplement la
méthode Add de l'
objet VBA Word Documents qui permet de créer un nouveau document vierge. Dans l'enchaînement, nous exploitons la
méthode TypeText de l'
objet Selection pour inscrire un titre sur la première ligne de ce nouveau document.
Maintenant, nous devons passer en revue les 26 éléments du
tableau de variables pour restituer les
fréquences de répétition pour chacune des lettres de l'alphabet. Et pour cela,une
boucle bornée For Next est particulièrement dédiée.
- A la suite et fin de la procédure, ajouter la boucle For Next suivante :
Sub compterCar()
Dim tabCar(0 To 25) As Integer
Dim i As Byte: Dim chaqueCar As Variant
Dim retour As String
For Each chaqueCar In ActiveDocument.Characters
i = Asc(chaqueCar)
If i >= 97 And i <= 122 Then
tabCar(i - 97) = tabCar(i - 97) + 1
End If
Next
Documents.Add
Selection.TypeText "Décompte des lettres en minuscules - Les majuscules ne sont pas comptées." & vbCrLf
For i = 0 To 25
retour = Chr(i + 97) & " : " & tabCar(i) & vbCrLf
Selection.TypeText Text:=retour
Next i
End Sub
Nous parcourons donc les 26 éléments du
tableau de variables. Nous restituons la
lettre de l'alphabet associée au
code Ascii grâce à la
fonction VBA Chr (Chr(i + 97)). Puis, nous lui associons par concaténation (&) son
score de répétition (tabCar(i)) avec un retour à la ligne (& vbCrLf) pour les énumérer toutes les unes en dessous des autres. Dès lors, sur ce nouveau document, nous exploitons de nouveau la
méthode TypeText de l'
objet VBA Selection pour inscrire un à un les résultats en dessous du titre précédemment inscrit.
- Enregistrer les modifications (CTRL + S) puis exécuter le code (F5),
- Dès lors, basculer sur Word (ALT + Tab),
Comme vous pouvez le voir, vous débouchez sur un nouveau document livrant les
statistiques consolidées par le
code VBA. Chaque
lettre de l'alphabet est affichée avec sa
fréquence en regard.
Par exemple, la dernière lettre de l'alphabet, la lettre z, est recensée à 22 reprises dans le document original. Et si sur ce document d'origine, vous engagez une recherche (CTRL + F) de la lettre z, vous constatez que le résultat fourni par la fenêtre de recherche corrobore parfaitement cette donnée statistique.
Néanmoins, des dissonances peuvent être trouvées dans la mesure où notre
code VBA ne compte pas les
lettres en majuscule à ce stade.