Comment tester si un texte déborde d'une cellule de tableau Word ?

Résolu
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009 - 2 déc. 2009 à 10:59
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009 - 8 déc. 2009 à 20:27
Bonjour,

Voilà mon (petit) problème.
J'ai un tableau dans Word, avec des cellules de taille fixe. Du texte est inséré automatiquement dans les cellules (par une macro), et il peut arriver que le texte déborde et ne s'affiche donc pas entièrement.
Est-il possible en VBA de tester le débordement, et de modifier la taille de la police de caractères afin que le texte soit entièrement visible, même s'il est écrit plus petit ?

Pour le moment, je n'ai rien trouvé sur ce sujet.
Merci d'avance à ceux qui pourront m'aider.

16 réponses

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
2 déc. 2009 à 13:19
en cellule fixe sur plusieurs ligne je ne sais pas.

Mais tu peux essayer de
- mettre la hauteur à "au moins"
- placer ton texte
- vérifier la hauteur de la cellule
- réduire la police
- répeter les 2 précédentes jusqu'à la bonne valeur.
- remettre en fixe avec la bonne hauteur

thip
3
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
2 déc. 2009 à 11:27
bonjour,

Sélectionne le texte et utilise Selection.FitTextWidth


thip
0
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
2 déc. 2009 à 12:06
Merci pour la réponse.

Mon texte est écrit dans la cellule sur plusieurs lignes (une dizaine).
Selection.FitTextWidth en donnant la largeur de la cellule va me ramener le texte sur une seule ligne, en serrant les caractères. Ce n'est pas exactement ce que je voudrais.
Il faudrait que je puisse simplement réduire la taille de la police de un point par exemple, et re-tester si le texte tient, quitte à rediminuer encore la taille de la police d'un nouveau point, jusqu'à ce que ça tienne.
En pratique, le texte est en Calibri 11, et quand ça dépasse c'est généralement de très peu, et passer en Calibri 10 suffit à remettre tout visible.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
2 déc. 2009 à 12:13
moi je mettrai systèmatiquement en Calibri 10, comme ça ce serait homogène. Et plus simple, non ?

thip
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
2 déc. 2009 à 12:32
Ce serait plus simple, mais ce n'est pas ce que je veux.
Pour les cellules où le Calibri 11 serait trop grand, il faudrait les mettre en Calibri 10, voire 9 si besoin. Mais je ne veux pas que tout le document soit en Calibri 9, juste pour le cas où le texte déborderait dans une seule malheureuse cellule. Je préfère réduire la taille dans cette cellule seule, et laisser le reste du texte bien lisible.
0
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
2 déc. 2009 à 13:52
Riche idée !
Je viens d'essayer. Mais le problème est que je n'arrive pas à mesurer la hauteur de la cellule. La propriété "Height" de la cellule me renvoie la hauteur qui a été fixée au départ (en la mettant à "au moins"). Bien que la taille de la cellule s'ajuste si le texte est trop grand, "Height" me renvoie toujours la hauteur de départ, et pas la hauteur réelle après l'ajustement automatique.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
3 déc. 2009 à 10:50
Je suis désolé de ne pas pouvoir t'aider. J'ai imaginé regarder la position par rapport au haut de page, mais je trouve un décalage (peut-être à cause de l'unité métrique) et ça ne fonctionne plus en changeant de page. Sans parler que ça nécessite une ligne supplémentaire au tableau.
Tu peux tenter l'API Windows (GetTextExtent et autres), mais cela t'oblige à connaître l'interligne.
Si tu finis par trouver, je suis interessé.

thip
0
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
3 déc. 2009 à 18:43
Pas grave, j'ai trouvé.
La propriété "Height" ne contient pas la valeur réelle, et apparemment, il n'y a aucun moyen simple de connaître la hauteur actuelle de la cellule. Mais je ne suis pas le seul à tomber sur le problème. En fouillant sur Internet, j'ai trouvé un autre forum (en anglais), où un type se plaignait du même problème. Quelqu'un a écrit une fonction en VBA qui permet de contourner ce point en calculant la hauteur de la cellule à la main. Si ça t'intéresse, c'est ici. J'ai essayé, ça marche nickel.
L'auteur de la routine indique tout de même que ça ne marche pas si une cellule est à cheval sur deux pages, mais ce n'est pas mon cas, donc ça ne me gêne pas.

En tout cas, merci pour ton aide !

Accessoirement, mon tableau est en fait le résultat d'un publipostage fait avec Word, pour imprimer des étiquettes. Chaque étiquette contient le fameux texte que je veux remettre à la bonne taille, pour que ça ne déborde pas de l'étiquette. Le problème qui me reste, c'est qu'au moment où on visualise le résultat du publipostage, Word n'affiche que la première page d'étiquette, et que ma macro de remise en forme ne remet donc en forme que les étiquettes de la première page, pas les suivantes. C'est ennuyeux. Y a-t-il moyen de s'en sortir ?
J'ai toujours une solution de contournement, je peux demander à modifier toutes les étiquettes, Word me crée alors un nouveau document où toutes les étiquettes sont bien visibles. Mais je ne peux pas lancer ma macro, je ne sais pas trop pourquoi elle ne démarre pas. Je peux quand même m'en sortir, mais c'est laborieux : lance l'éditeur VBA, je mets le curseur dans la macro, et je la lance à la main en faisant F5. Pas joli joli, je sais, mais j'en suis là.

Bref, j'ai quand même déjà une solution, peu élégante certes mais qui marche. Si tu peux encore m'aider, super, sinon, de toute façon un grand MERCI à toi déjà pour la bonne idée que tu m'as donnée.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
3 déc. 2009 à 19:35
ok, j'ai vu ce code, il correspond à ce que je disais (mais là tu as le code complet, moi je ne l'ai pas fait).
Il regarde les distances de la rangée suivante et de la rangée en cours par rapport au haut de page, et il traite bien les changement de page. Je n'ai pas vu ce qu'il faisait en fin de document (la rangée supplémentaire dont je parlais).

Quand tu visualises les données de fusion, tu n'as qu'une page. Mais fais-tu une fusion vers un nouveau document ?
Et dans ce cas, combien as-tu de pages ? peut-être une seule (page logique) si tu n'as que des sauts de sections.

thip
0
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
3 déc. 2009 à 23:36
Je ne comprends pas bien tes questions.

J'utilise l'assistant de fusion et publipostage. A l'étape 1, je lui indique que je veux des étiquettes. A l'étape 3, je vais chercher la liste des destinataires, un fichier Excel qui contient notamment les textes à insérer dans les étiquettes. A l'étape 5 ("Aperçu de vos étiquettes"), le document Word n'affiche qu'une seule page, ma première fournée d'étiquettes, alors qu'il devrait y en avoir beaucoup plus. Les autres pages existent aussi, je peux les faire défiler avec les flèches de l'assistant. Mais tout ça défile toujours dans une seule feuille de document : en demandant la suivante, la première étiquette disparaît de la feuille, toutes les étiquettes remontent d'un cran et une nouvelle apparaît en bas, comme si on scrollait dans une fenêtre continue. Mais à l'écran, il n'y a toujours qu'une seule feuille visible. D'ailleurs, dans la barre d'état, il y a marqué "Page : 1 sur 1", alors que je devrais avoir plein de pages en réalité.
Si je passe à l'étape 6, je peux imprimer (et toutes les pages s'impriment correctement). Mais si je lance ma macro, elle ne voit que les étiquettes qui sont à l'écran, sur une seule page, et ne traite donc que celles-là.
Seule solution trouvée pour le moment, au lieu d'imprimer, à l'étape 6, je clique sur "Modifier les étiquettes individuelles...", et ça me crée un nouveau document, avec toutes les étiquettes dedans, sur plusieurs pages. Il n'y a plus de champs { MERGEFIELD }, tous les textes sont en dur. Mais je ne peux plus lancer ma macro, sauf comme je l'ai indiqué (éditeur VBA puis F5, c'est pas beau, je sais). C'est ce que je fais, et une fois que tout est en forme, là, je peux enfin imprimer.

Voilà. Je ne sais pas si j'ai été clair.
Mais bon, encore une fois, même si c'est pas terrible, j'ai déjà une solution qui marche. Ça peut suffire, même si intellectuellement ça me gêne toujours d'avoir un truc pas fini alors que ça va servir souvent.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
4 déc. 2009 à 08:03
Quand tu fais une fusion, tu commence par modifier le "document principal de fusion", avec un bouton "<<>>" bascule pour faire apparaitre soit les champs, soit les valeurs de l'enregistrement en cours.
A ce stade tu es encore en mode "design", avec un seul exemplaire de ton document, même si tu as des milliards d'enregistrements à fusionner.
Puis tu vas effectuer la fusion = faire autant de copie de ton document qu nécessaire pour écluser tes enregistrements.
Et tu as le choix, d'effectuer ta fusion vers un nouveau document ou vers l'imprimante. C'est à ce moment que les codes s'activent tous comme il faut.
L'avantage du "nouveau document" est de conserver le résultat de la fusion, voire d'y apporter quelques modifications mineures.

thip
0
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
4 déc. 2009 à 20:55
OK. J'ai compris le mécanisme, mais je ne maîtrise pas bien tout le vocabulaire. Bref, avant la fusion, la macro ne s'applique que sur la seule page visible, ce qui est gênant. Et après la fusion vers un nouveau document, la macro ne s'exécute plus. En fait, mes macros sont dans un modèle de document, et le nouveau document après fusion est pourtant bien attaché au même modèle. Donc je vois bien mes macros dans la liste des macros disponibles, mais si je lance l'exécution, rien ne se passe. Seule parade trouvée pour le moment, lancer la macro à la main, en faisant F5 dans le code VBA. J'en suis là, mais bon, même si ça ne fait pas très "produit fini", ça marche.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
7 déc. 2009 à 10:35
finalement, comment déclenches-tu l'exécution de la macro à partir de ton code ? à la fin de chaque case ?


thip
0
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
7 déc. 2009 à 20:00
Ben finalement, je fais comme j'ai dit, même si ce n'est pas très beau :
- je fusionne vers un nouveau document
- je vais dans le nouveau document, et je lance d'éditeur VBA
- je place le curseur dans le code de la macro et je la lance par F5
Etant dans le document fusionné, le tableau d'étiquettes est entièrement visible, et la macro n'a pas de problème à balayer toutes les cellules du tableau. Ensuite, je fais comme tu me l'avais suggéré :
- je fixe la hauteur de chaque cellule à "au moins"
- je mesure la hauteur de la cellule
- si ça dépasse la taille mini, je diminue la taille de la police du texte contenu dans la cellule d'un demi point et je retourne à l'étape précédente, sinon je remets la hauteur de la cellule à "fixe" et je passe à la cellule suivante.

Le lancement n'est pas très orthodoxe, mais ça marche comme ça. Sinon, j'ai remarqué que si je ne pouvais pas lancer directement ma macro dans le document fusionné, je pouvais tout de même l'enregistrer (ce dont je n'ai pas vraiment besoin), quitter Word, réouvrir le document sauvegardé, et là, bizarrement, la macro veut bien se lancer de manière classique. Je ne comprends pas tout, mais bon... Si tu as une explication, je suis preneur. Sinon, ça va rester comme ça, même si le problème va me tourner dans la tête jusqu'à ce que je trouve une vraie solution.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
8 déc. 2009 à 09:38
Non, je parlais de l'exécution du code par programme, sans manipulation. Si tu n'en as pas, prévois un appel à ta fonction,
du style { $n = maFonction() } quelque part. En dessous du tableau, dans le bas de page ...


thip
0
zoubinou2 Messages postés 9 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 8 décembre 2009
8 déc. 2009 à 20:27
Je vais le faire. Merci encore.
0
Rejoignez-nous