Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2008, 15h18   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 3
Points : 1
Points : 1
Par défaut Statistiques dans une cellule donnée d'un tableau Word

Bonjour,

Dans le cadre de mon travail, je me suis mis depuis peu à VBA, essentiellement sous Word 2003 dans un premier temps. Issu du monde 'grand système', j'ai quelque fois un peu de mal!!!

Ma problématique actuelle: je voudrais réaliser une macro pour pouvoir établir des statistiques (nombre de mots et de caractères) sur une cellule donnée d'un tableau Word.
Les statistisques sont ensuites reportées dans un autre tableau.

J'ai d'abord effectué ce codage, portant sur l'ensemble du tableau (le n° 1)à analyser, avec écriture du résultat dans le tableau n° 2:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
With ActiveDocument.Tables(1).Range 
  wordCount = .ComputeStatistics(Statistic:=wdStatisticWords) 
  charCount = .ComputeStatistics(Statistic:=wdStatisticCharacters) 
End With 
If ActiveDocument.Tables.Count >= 1 Then 
   With ActiveDocument.Tables(2).Cell(Row:=3, Column:=2).Range 
     .Delete 
     .InsertAfter Text:="Mots: " & wordCount2 
End With 
With ActiveDocument.Tables(2).Cell(Row:=3, Column:=3).Range 
     .Delete 
     .InsertAfter Text:="Chars: " & charCount2 
End With 
End If
-> Joie: ça marche...

J'ai ensuite voulu réduire la portée du 'range' à une cellule donnée (la 2° de la deuxième colonne du 1° tableau):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
With ActiveDocument.Tables(1).Cell(Row:=2, Column:=2).Range 
  wordCount = .ComputeStatistics(Statistic:=wdStatisticWords) 
  charCount = .ComputeStatistics(Statistic:=wdStatisticCharacters) 
End With 
If ActiveDocument.Tables.Count >= 1 Then 
  With ActiveDocument.Tables(2).Cell(Row:=2, Column:=2).Range 
    .Delete 
    .InsertAfter Text:="Mots: " & wordCount1 
End With 
With ActiveDocument.Tables(2).Cell(Row:=2, Column:=3).Range 
    .Delete 
    .InsertAfter Text:="Chars: " & charCount1 
End With 
End If
-> Quel que soit le contenu de la cellule, j'ai en retour:
Mots: 0
Chars: 0

J'ai pu vérifier (par .Select) que la cellule 'attaquée' était bien celle que je désirais, mais pas de résultat tout de même...

J'ai essayé une autre solution, trouvée sur le net:
Code :
1
2
3
4
5
6
ActiveDocument.Tables(1).Cell(Row:=2, Column:=2).Select 
    Selection.Find.Execute Replace:=wdReplaceAll 
    -> Ca (au dessus), je ne vois pas franchement à quoi ça sert!! 
  ActiveDocument.Tables(1).Cell(Row:=2, Column:=2).Select 
    wordCount = Selection.Words.Count 
    charCount = Selection.Characters.Count
Mais le comptage des mots prend en compte la marque de fin de cellule (pas trop grave, à la limite: il suffit de retrancher 1 et le tour est joué...)
Et le comptage des caractères prend en compte les espaces entre mots et la marque de fin de cellule, ce qui est plus génant pour moi (comment compter le nombre d'espaces, sinon??)....

Mes questions:
1. Quelqu'un a-t'il une solution???
2. Comme j'aime bien comprendre ce que je fais (et surtout ce que je n'arrive pas à faire!!): pourquoi les statistiques marchent quand le 'range' est défini sur tout le tableau, et pas quand il est défini sur une portion du tableau (cellule donnée, ligne entière ou colonne, j'ai testé les 3 avec le même résultats!!)... J'y perds mon VBA!! (Ce qui m'allège assez peu, je l'avoue, vu la faible étendue de mes connaissances !!).

En vous remerciant par avance!!!
Mijeaq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 15h42   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 354
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 354
Points : 29 270
Points : 29 270
Ça me semble bien compliqué


Code :
1
2
3
4
5
6
7
Sub test()
Dim stTemp As String
 
ActiveDocument.Tables(1).Cell(3, 1).Select
MsgBox Selection.Words.Count - 1
 
End Sub
Pour les caractères

Code :
1
2
3
4
5
6
7
8
9
10
11
Sub test()
Dim stTemp As String
Dim i As Integer
 
ActiveDocument.Tables(1).Cell(3, 1).Select
MsgBox Selection.Characters.Count - 1
For i = 1 To Selection.Characters.Count - 1
    Debug.Print i & " - " & Selection.Characters(i)
Next i
 
End Sub
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2008, 10h34   #3
Invité de passage
 
Inscription : janvier 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 3
Points : 1
Points : 1
Merci beaucoup pour votre réponse.

Effectivement, la syntaxe proposée est beaucoup plus simple.

J'ai toutefois encore un léger problème avec la partie comptage des caractères:
Pour exemple, j'ai mis dans la cellule cible le texte suivant: "Je suis beau" (ce n'est un exemple, pas une certitude, malheureusement pour moi!! ;-)))
Le comptage des mots me donne bien 3 mots, en revanche, la msgbox me livre 12 caractères, y compris donc les 2 espaces...
Mais je pense que je n'ai pas tout à fait compris l'utilité de la boucle qui suit l'affichage de la msgbox; pouvez-vous éclairer la lanterne d'un malheureux bleu en la matière (dieu qu'il est loin, mon cher Cobol-CICS-DB2!!)???

Code :
1
2
3
4
5
ActiveDocument.Tables(1).Cell(2, 2).Select
MsgBox Selection.Characters.Count - 1
For i = 1 To Selection.Characters.Count - 1
    Debug.Print i & " - " & Selection.Characters(i)
Next i
Et bravo pour ce site et ses contributeurs!!! (si vous ouvrez un jour des rubriques 'gros système', je pourrais y apporter un peu je pense!)
Mijeaq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2008, 10h45   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 354
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 354
Points : 29 270
Points : 29 270
La boucle, peut servir pour compter certains caractères.
Je n'avais pas beaucoup de temps et je n'ai pas codé la boucle pour éliminer les espaces.
Mais il suffit d'une variable en plus et d'une condition, si le caractère est différent d'un espace, on ajoute 1 à la variable.

Ne pas oublier de réinitialiser la variable.


Code :
1
2
3
4
j = 0
For i = 1 To Selection.Characters.Count - 1
    If Selection.Characters(i) <> Chr(32) Then j = j + 1
Next i
Je pense que l'espace possède les code ASCII 32.

La variable j contiendra le nombre de caractère sans les espaces.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2008, 11h14   #5
Invité de passage
 
Inscription : janvier 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 3
Points : 1
Points : 1
Simple et efficace: comme j'aime!
Ce coup-çi, cela fonctionne à merveille.

Merci beaucoup.

PS: désolé pour l'absence de balises de code, je n'avais pas remarqué l'option; je ne le ferais plus, c'est promis!!
Mijeaq est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h23.


 
 
 
 
Partenaires

Hébergement Web