J’ai essayé, mais malheureusement son code ne fonctionne pas ^^’
Tant pis j’abandonne ce serait trop compliqué de toutes manières, je passerai autant de temps à compter à la main
Merci quand même pour ton aide, j’ai tout de même appris des choses grâce à toi !
Bonne soirée,
Gilles
Sub Main
' Macro permettant de calculer un nombre de mots pour un texte en la langue française (France) (lang code = fr-FR).
' Elle prend en charge tous les caractères de la norme "ANSI Europe de l'ouest" (= "Windows-1252" = "CP1252") (qui englobe la norme "ASCII").
' Si vous sélectionnez du texte, la fonction ne considèrera que le texte sélectionné.
' Si vous ne sélectionnez pas de texte, la fonction considèrera tout le document.
' Par convention :
' - On compte un mot comme étant un groupe de caractères séparé des autres groupes par un espace (isolables typographiquement).
' - Tous les caractères qui ne sont pas des chiffres ou des lettres comptent pour rien.
' Ce qui signifie :
' - Les chiffres ou nombres isolés comptent pour 1 mot.
' (Exemple : "Cette phrase contient 5 mots.")
' - Les mots courts comme "le", "la", "de", "à", "a", "où", "y", etc. comptent pour 1 mot.
' - Les mots élidés comme "c'", "d'", "j'", "l'", "m'", "n'", "s'", "t'" comptent pour un mot.
' (Exemple : "C'est ainsi." = 3 mots)
' - Les mots composés comptent pour plusieurs mots si chaque terme est un mot indépendant.
' (Exemple : "grand-mère" = 2 mots, "c'est-à-dire" = 4 mots, "tout-à-l'égout" = 4 mots)
' - Les mots composés contenant des mots qui n'existent pas de manière indépendante ne comptent pas.
' (Exemple : "socio-économique = 1 mot, car "socio" est l'abrégé de "social" et ne s'emploi pas seul)
' (Exemple : "sociologico-économique = 1 mot, car "sociologico" est l'abrégé de "sociologique" et ne s'emploi pas seul)
' (Exemple : "sociologique-économique = 2 mots)
' - Le "t" présent dans "a-t-il" ou "prend-t-il" est une notation purement euphonique, il ne compte pas.
' - Les caractères abrégés comme l'esperluette (& = et) ou les caractères de monnaie (€, ¢, $, £, ¤, ¥, etc.) comptent pour 1 mot.
' - Les autres caractères (type # (dièse), _ (underscore), % (pourcent), etc.) ne comptent pas.
' Dans les algorithmes habituel de comptage des mots, on considère forcément qu'un mot est précédé d'un espace.
' Les espaces insécables ne sont pas pris en compte.
' Cette méthode de calcul fonctionne pour les anglo-saxons qui ne séparent pas leur ponctuation,
' mais pas pour les français qui séparent les caractères de type deux-points, point-virgule, point d'exclamation, etc.
' Cette macro propose un nouvel algorithme qui corrige ces erreurs.
' ATTENTION :
' Cette macro compte forcément les mots composés (séparés par un ou des tirets) comme plusieurs mots.
' Elle n'est pas capable de reconnaître les mots qui composent un mot-composé comme étant indépendants ou non.
' Vous devrez donc réajuster le résultat en fonction. Le nombre de mots composés est affiché dans le résultat.
objet_texte = ThisComponent.CurrentController.getViewCursor
if (objet_texte.IsCollapsed = TRUE) then
string_texte = ThisComponent.Text.String ' On récupère le texte de tout le document (sans les cadres).
else
string_texte = objet_texte.String ' On récupère le texte sélectionné (sans les cadres).
end if
i_longueur_texte = len(string_texte) ' On calcule le nombre total de caractères.
i = 0 ' On initialise une variable d'itération de boucle.
i_nombre_mot = 0 ' On initialise une variable pour compter le nombre de mots.
i_nombre_mot_compose = 0 ' On initialise une variable pour compter le nombre de mots composés.
i_nombre_mot_coupe = 0 ' On initialise une variable pour compter le nombre de mots coupés par un retour à la ligne.
b_premier_mot = TRUE ' On initialise une variable pour compter le premier mot.
b_compter_le_mot_apres = FALSE ' On initialise une variable pour savoir s'il faut ou non compter un mot qui est après.
c_caractere = "" ' On initialise une variable pour travailler sur un caractère.
i_nombre_retour_chariot = 0 ' On initialise une variable pour compter le nombre de retours chariot (= CR = Carriage return = 0D).
i_nombre_saut_de_ligne = 0 ' On initialise une variable pour compter le nombre de sauts de ligne (= LF = Line feed = 0A).
i_nombre_retour_a_la_ligne = 0 ' On initialise une variable pour compter le nombre de retours à la ligne.
' Remarque sur le retour à la ligne :
' - Sous Windows = 0D 0A = CR LF = chr(13) chr(10) (Norme standard)
' - Sous Linux = 0D = CR = chr(13)
' - Sous MacOSX = 0A = LF = chr(10)
for i = 1 to i_longueur_texte step 1 ' Boucle allant du premier au dernier caractère du texte récupéré.
c_caractere = mid(string_texte, i, 1) ' On récupère un caractère.
select case c_caractere
case " ", chr(160) ' Si ce caractère est un espace ou un espace insécable...
b_compter_le_mot_apres = TRUE
case chr(9) ' Si ce caractère est une tabulation...
b_compter_le_mot_apres = TRUE
case chr(13) ' Si ce caractère est un retour chariot...
i_nombre_retour_chariot = i_nombre_retour_chariot + 1
b_compter_le_mot_apres = TRUE
if (i >= 2) then
if (mid(string_texte, i - 1, 1) = "-") then ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
b_compter_le_mot_apres = FALSE
end if
end if
case chr(10) ' Si ce caractère est un saut de ligne...
i_nombre_saut_de_ligne = i_nombre_saut_de_ligne + 1
b_compter_le_mot_apres = TRUE
if (i >= 3) then
if (mid(string_texte, i - 2, 2) = "-" & chr(13)) then ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
b_compter_le_mot_apres = FALSE
else
if (mid(string_texte, i - 1, 1) = "-") then
b_compter_le_mot_apres = FALSE
end if
end if
end if
case ":", ";", "!", "¡", "?", "¿", chr(34), chr(171), chr(187) ' Si ce caractère est un signe de ponctuation double... (qui nécessite un espace avant)
b_compter_le_mot_apres = TRUE ' (34 = ") (171 = «) (187 = »)
case ".", "," ' Si ce caractère est un signe de ponctuation simple... (qui ne nécessite pas un espace avant)
b_compter_le_mot_apres = TRUE
if (i >= 2) then ' Pour ne pas compter comme plusieurs mots les chiffres séparés par des points ou des virgules.
if (isnumeric(mid(string_texte, i - 1, 1)) = TRUE) then
if (i <= i_longueur_texte - 1) then
if (isnumeric(mid(string_texte, i + 1, 1)) = TRUE) then
b_compter_le_mot_apres = FALSE
end if
end if
end if
end if
case chr(39), chr(146) ' Pour ne pas compter les apostrophes, qu'ils soient ou non séparés du mot.
b_compter_le_mot_apres = TRUE ' (39 = ', 146 = ’)
case "-"
i_nombre_mot_compose = i_nombre_mot_compose + 1
b_compter_le_mot_apres = TRUE
if (i <= i_longueur_texte - 2) then
if (mid(string_texte, i, 3) = "-t-") then ' Pour ne pas compter le "t" d'un "-t-".
i_nombre_mot_compose = i_nombre_mot_compose - 1
b_compter_le_mot_apres = FALSE
end if
end if
if (i <= i_longueur_texte - 1) then
c_caractere = mid(string_texte, i + 1, 1)
if (c_caractere = chr(13)) OR (c_caractere = chr(10)) then ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
i_nombre_mot_compose = i_nombre_mot_compose - 1
i_nombre_mot_coupe = i_nombre_mot_coupe + 1
b_compter_le_mot_apres = FALSE
end if
end if
case "(", ")", "[", "]", "{", "}" ' Pour ne pas compter les parenthèses, qu'elles soient ou non séparées du mot.
b_compter_le_mot_apres = TRUE
case "+", "×", "/", "\", "%", "‰", "=", "<", ">" ' Pour ne pas compter ces signes comme un mot s'ils sont isolés.
b_compter_le_mot_apres = TRUE
case "_", "–", "—", "¬", "¯", "•", "#", "*", "`", "´", "~", "˜ ", "|", "¦"
b_compter_le_mot_apres = TRUE
case "@", "‚", "ƒ", "„", "…", "†","‡", "^", "¨", "Š", "‹", "›", "º", "ª"
b_compter_le_mot_apres = TRUE
case "‘", "“", "”", "§", "©", "®", "™", "ª", "°", "§", "µ", "¶", "·", "¸"
b_compter_le_mot_apres = TRUE
case "±", "¹", "²", "³"
b_compter_le_mot_apres = TRUE
case else
if (b_compter_le_mot_apres = TRUE) then
i_nombre_mot = i_nombre_mot + 1
else
if (b_premier_mot = TRUE) then
i_nombre_mot = i_nombre_mot + 1
b_premier_mot = FALSE
end if
end if
b_compter_le_mot_apres = FALSE
end select
next i
if (i_nombre_retour_chariot = i_nombre_saut_de_ligne) then
i_nombre_retour_a_la_ligne = i_nombre_retour_chariot
else
if (i_nombre_retour_chariot > i_nombre_saut_de_ligne) then
i_nombre_retour_a_la_ligne = i_nombre_retour_chariot
else
i_nombre_retour_a_la_ligne = i_nombre_saut_de_ligne
end if
end if
msgbox "Statistiques :" & chr(13) & _
chr(13) & _
"- " & "Nombre de mots = " & i_nombre_mot & " (" & i_nombre_mot - i_nombre_mot_compose & " à " & i_nombre_mot & ")" & chr(13) & _
chr(13) & _
" " & "(Incertitude de " & i_nombre_mot_compose & " mot(s) car il y a " & i_nombre_mot_compose & " mot(s) composé(s)." & chr(13) & _
" " & " Dans un mot composé, on compte seulement les" & chr(13) & _
" " & " mots qui peuvent exister de manière indépendante :" & chr(13) & _
" " & " - grand-mère = 2 mots" & chr(13) & _
" " & " - c'est-à-dire = 4 mots" & chr(13) & _
" " & " - tout-à-l'égout = 4 mots" & chr(13) & _
" " & " - socio-économique = 1 mot (économique)" & chr(13) & _
" " & " - anti-inflammatoire = 1 mot (inflammatoire)" & chr(13) & _
" " & " - delta-4-epi-androstène-di-one = 3 mots (delta, 4, androstène)" & chr(13) & _
" " & " Cette macro n'est pas capable de faire cette différence," & chr(13) & _
" " & " elle compte tous les mots composés comme plusieurs mots)" & chr(13) & _
chr(13) & _
" " & "(Pour connaître le nombre exacte de mots," & chr(13) & _
" " & " il vous faut lancer une recherche sur le caractère tiret (""-"")," & chr(13) & _
" " & " et compter les mots composés un par un)" & chr(13) & _
chr(13) & _
"- " & "Nombre de mots coupés = " & i_nombre_mot_coupe & chr(13) & _
" " & "(Mots coupés par un tiret puis un retour à la ligne)" & chr(13) & _
chr(13) & _
"- " & "Nombre de retours à la ligne = " & i_nombre_retour_a_la_ligne & chr(13) & _
" " & "(Dont " & i_nombre_retour_chariot & " retour(s) chariot et " & i_nombre_saut_de_ligne & " saut(s) de ligne)" & chr(13) & _
chr(13) & _
"- " & "Nombre de caractères = " & i_longueur_texte
End Sub