Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Nombre de ligne dans un tableau

15 réponses
Avatar
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

10 réponses

1 2
Avatar
Geo
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+
Avatar
Demokos
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.



Avatar
Geo
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+
Avatar
Demokos
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



Avatar
Lotre
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
Avatar
Demokos
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


Avatar
Lotre
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.
Avatar
Geo
Re

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



MaCellule.FormFields(1) doit aussi marcher.

--
A+
Avatar
Geo
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+
Avatar
Demokos
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.


1 2