Nombre de ligne dans un tableau

Le
Demokos
Bonjour à toutes et à tous

Dans un tableau Word de 4 colonnes et 15 lignes, il y a dans la première
colonne sur chaque ligne un champ formulaire texte. Chaque champ
formulaire texte à un nom incrémenté (par exemple TClient01, Tclient02,
etc).

Comment déterminer, en VBA, le nombre de lignes remplies, sachant qu'il
n'y a pas de lignes vides intercalées admises.

Par avance merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Geo
Le #20054691
Bonjour
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ]
Bonjour à toutes et à tous

Dans un tableau Word de 4 colonnes et 15 lignes, il y a dans la première colonne sur
chaque ligne un champ formulaire texte. Chaque champ formulaire texte à un nom
incrémenté (par exemple TClient01, Tclient02, etc...).

Comment déterminer, en VBA, le nombre de lignes remplies, sachant qu'il n'y a pas de
lignes vides intercalées admises.



Je ne vois pas d'autre solution que de les compter, ou plutôt en
partant du bas, s'arrêter à la première cellule non vide.
Par exemple avec deux boucles imbriquées du genre (écrit à la volée,
pas testé)
for i = NbLignes to 1 step -1
for i = 1 to NbColonnes
if len(MonTableau.Cell(i,j).text) >2 then goto Suite
next i
next j
Suite :
' i est la 1-ère ligne remplie
' si le tableau est vide i = 0

C'est de la programmation dont on doit avoir honte, mais c'est
efficace.
Pour faire plus académique utiliser un booléen qui indique qu'on a
trouvé du texte et tester la valeur du booléen pour sortir proprement
des deux for.

--
A+
Demokos
Le #20054911
Merci Geo pour ta réponse. Elle me donne un début de solution.
Mais :
1) je ne veux vérifier que la première colonne, pour moi c'est
suffisant. Donc pas besoin de for j = 1 to NbColonnes.
2) Dans chaque cellule, il y a un champ de formulaire, et non
directement du texte. Là je bloque pour savoir s'il y a un texte dans le
champ ou non.
3) L'idée de partir du bas (j'avoue ne je l'ai pas eue) me paraît très
intéressante.

Geo a écrit :
Bonjour
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ] Bonjour à
toutes et à tous

Dans un tableau Word de 4 colonnes et 15 lignes, il y a dans la
première colonne sur chaque ligne un champ formulaire texte. Chaque
champ formulaire texte à un nom incrémenté (par exemple TClient01,
Tclient02, etc...).

Comment déterminer, en VBA, le nombre de lignes remplies, sachant
qu'il n'y a pas de lignes vides intercalées admises.



Je ne vois pas d'autre solution que de les compter, ou plutôt en partant
du bas, s'arrêter à la première cellule non vide.
Par exemple avec deux boucles imbriquées du genre (écrit à la volée, pas
testé)
for i = NbLignes to 1 step -1
for i = 1 to NbColonnes
if len(MonTableau.Cell(i,j).text) >2 then goto Suite
next i
next j
Suite :
' i est la 1-ère ligne remplie
' si le tableau est vide i = 0

C'est de la programmation dont on doit avoir honte, mais c'est efficace.
Pour faire plus académique utiliser un booléen qui indique qu'on a
trouvé du texte et tester la valeur du booléen pour sortir proprement
des deux for.



Geo
Le #20055261
Bonjour
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ]
Merci Geo pour ta réponse. Elle me donne un début de solution.
Mais :
1) je ne veux vérifier que la première colonne, pour moi c'est suffisant. Donc pas
besoin de for j = 1 to NbColonnes.



Super, on va faire de la programmation propre, remplacer le goto Suite
par exit for
2) Dans chaque cellule, il y a un champ de formulaire, et non directement du texte. Là
je bloque pour savoir s'il y a un texte dans le champ ou non.



Là il faudrait un petit exemple, mais la valeur d'un champ s'obtient
par la propriété result :
Je verrais bien : MonTexte = MaCellule.Range.Fields(1).Result
If len(montexte) > 0 then 'rempli

--
A+
Demokos
Le #20056031
En combinant ta réponse (et le .Result qui m'a intéressé) et une
(nouvelle) recherche dans l'aide VBA, j'ai trouvé qu'en utilisant
quelque chose comme :
ActiveDocument.FormFields("TClien01").Result = "",
Je peux tester si le champ texte est vide ou non.
Est-il possible dans une boucle de tester TClien15, TClien14, etc., ou
dois-je tester les champs un par un ?

Geo a écrit :
Bonjour
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ] Merci Geo pour
ta réponse. Elle me donne un début de solution.
Mais :
1) je ne veux vérifier que la première colonne, pour moi c'est
suffisant. Donc pas besoin de for j = 1 to NbColonnes.



Super, on va faire de la programmation propre, remplacer le goto Suite
par exit for
2) Dans chaque cellule, il y a un champ de formulaire, et non
directement du texte. Là je bloque pour savoir s'il y a un texte dans
le champ ou non.



Là il faudrait un petit exemple, mais la valeur d'un champ s'obtient par
la propriété result :
Je verrais bien : MonTexte = MaCellule.Range.Fields(1).Result
If len(montexte) > 0 then 'rempli



Lotre
Le #20056021
Bonsoir,

Geo wrote:
Bonjour


(...)
Là il faudrait un petit exemple, mais la valeur d'un champ s'obtient
par la propriété result :
Je verrais bien : MonTexte = MaCellule.Range.Fields(1).Result
If len(montexte) > 0 then 'rempli




... En plus je ne suis pas sûr d'avoir compris la situation ;o)

S'agit-il de champs du type
{ ASK TClient37 "Texte de l'invite : " } ?

Si c'est ça et donc si j'ai compris la question
le contenu saisi est tout simplement dans

ActiveDocument.Bookmarks("TClient37").Range.Text

Sinon , ActiveDocument.Fields(37).Result.Text
donnera la même chose si le champs TClient37
a été le 37-ième champs créé dans le document ...
( ce qui n'est pas obligatoire ;o)

Et ... il n'est pas utile de faire référence au tableau
qui contient ces champs...

HB
Demokos
Le #20056131
Il est vrai que le tableau est utilisé pour des raisons de présentation
et que le champ texte de formulaire pourrait être hors du tableau.

Lotre a écrit :

Bonsoir,

Geo wrote:
Bonjour


(...)
Là il faudrait un petit exemple, mais la valeur d'un champ s'obtient
par la propriété result :
Je verrais bien : MonTexte = MaCellule.Range.Fields(1).Result
If len(montexte) > 0 then 'rempli




... En plus je ne suis pas sûr d'avoir compris la situation ;o)

S'agit-il de champs du type
{ ASK TClient37 "Texte de l'invite : " } ?

Si c'est ça et donc si j'ai compris la question
le contenu saisi est tout simplement dans

ActiveDocument.Bookmarks("TClient37").Range.Text

Sinon , ActiveDocument.Fields(37).Result.Text
donnera la même chose si le champs TClient37
a été le 37-ième champs créé dans le document ...
( ce qui n'est pas obligatoire ;o)

Et ... il n'est pas utile de faire référence au tableau
qui contient ces champs...

HB


Lotre
Le #20056121
Bonsoir,


Demokos wrote:
En combinant ta réponse (et le .Result qui m'a intéressé) et une
(nouvelle) recherche dans l'aide VBA, j'ai trouvé qu'en utilisant
quelque chose comme :
ActiveDocument.FormFields("TClien01").Result = "",
Je peux tester si le champ texte est vide ou non.



Tient ... Chez moi c'est ....Result.text
mais peut-être Text est-elle la propriété par défaut de Result
ce qui expliquerait le truc ...



Est-il possible dans une boucle de tester TClien15, TClien14, etc.,
ou
dois-je tester les champs un par un ?




bien sûr puisque l'argument de FormFields
est une chaîne tu peux la fabriquer...

Qqchose du genre
=============================================== NbVide = 0
for i = 0 to 37
Nom = "TClient" & Right("00" & CStr(i),2)
' pour bien avoir 01 , 02 puis 10, 11, ..., ... jusqu'à 37

Contenu = ActiveDocument.FormFields(Nom).Result

If Contenu ="" Then
' traitement éventuel si vide
NbVide = NbVide + 1
Else
' traitement éventuel si pas vide
End If

' NbVide contient, comme son nom l'indique, ...
===============================================
HB.
Geo
Le #20056271
Re

ActiveDocument.FormFields("TClien01").Result = "",



MaCellule.FormFields(1) doit aussi marcher.

--
A+
Geo
Le #20056261
Re

Et ... il n'est pas utile de faire référence au tableau
qui contient ces champs...



Sauf que la question était :
"Comment déterminer, en VBA, le nombre de lignes remplies"

Mais peut-être n'était-ce pas le but exact, mais un moyen ?

--
A+
Demokos
Le #20056251
Super, je vais tester tout ça demain au boulot et je posterai mon code.
Merci à vous pour vos réponses qui m'orientent vers la solution.

Lotre a écrit :
Bonsoir,


Demokos wrote:
En combinant ta réponse (et le .Result qui m'a intéressé) et une
(nouvelle) recherche dans l'aide VBA, j'ai trouvé qu'en utilisant
quelque chose comme :
ActiveDocument.FormFields("TClien01").Result = "",
Je peux tester si le champ texte est vide ou non.



Tient ... Chez moi c'est ....Result.text
mais peut-être Text est-elle la propriété par défaut de Result
ce qui expliquerait le truc ...



Est-il possible dans une boucle de tester TClien15, TClien14, etc., ou
dois-je tester les champs un par un ?




bien sûr puisque l'argument de FormFields
est une chaîne tu peux la fabriquer...

Qqchose du genre
=============================================== > NbVide = 0
for i = 0 to 37
Nom = "TClient" & Right("00" & CStr(i),2)
' pour bien avoir 01 , 02 puis 10, 11, ..., ... jusqu'à 37

Contenu = ActiveDocument.FormFields(Nom).Result

If Contenu ="" Then
' traitement éventuel si vide
NbVide = NbVide + 1
Else
' traitement éventuel si pas vide
End If

' NbVide contient, comme son nom l'indique, ...
=============================================== >
HB.


Publicité
Poster une réponse
Anonyme