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 20/12/2011, 14h31   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Par défaut Repérer les textes débordant d'une colonne

Bonjour,

J'ai un un gros document disposé en colonnes et je voudrais repérer les textes qui sont trop longs pour tenir dans une colonne (en affichant une boîte de dialogue ou en les surlignant en jaune).

Est-ce que quelqu'un aurait une idée pour faire ça simplement ?

Avec mes remerciements anticipés.
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 17h35   #2
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut superfetatoire,

C'est possible de détecter les mots qui dépassent une certaine longueur dans Word.

Mais le problème est-ce que c'est ce qu'il te faut ? Je ne peux pas dire sans plus d'infos. Comment tu estimes que tes mots sont trop longs uniquement sur le nombre de caractères ou avec les ajustements de texte (gras, police à chasse fixe/variable, kerning & son petit frère, tracking...). Deuxième question : est-ce que tes colonnes sont identiques entre elles et identiques sur tout le document ?

Tous ces questions peuvent se résoudre mais cela peut complexifier/simplifier la macro si tu es dans ces cas évoqués.

Pour une base très très bête (le nombre de caractères), voici le code
Code :
1
2
3
4
5
   For aI = 1 To ActiveDocument.Words.Count
        If Len(ActiveDocument.Words(aI).Text) > 12 Then
            MsgBox "Ben tiens en voilà un qui est trop grand : " & ActiveDocument.Words(aI).Text & " qui est situé en " & aI & "ième position"
        End If
    Next
@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2011, 11h25   #3
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Merci pour ta réponse.

Ma question n'était effectivement pas assez précise.

Toutes mes colonnes sont identiques (entre elles et sur tout le document).
Le document est en police proportionnelle (Verdana), donc on ne peut pas se baser sur la longueur du texte.

Exemple :

J'ai la liste suivante :
texte
texte ok
texte long
mottroplong


Voici ce que ça donne une fois mis en colonne :
texte
texte ok
texte
long
mottropl
ong

Je voudrais que la macro me détecte que "texte long" et "mottroplong" ne rentrent pas dans la colonne.

J'ai pensé à me placer au début de chaque ligne et à tester le caractère de fin (qui devrait être une marque de paragraphe si c'est c'est bon), mais je ne sais pas trop faire ça.
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2011, 21h21   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 338
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 338
Points : 29 246
Points : 29 246
Salut,

Sans vouloir être rabat joie

Citation:
donc on ne peut pas se baser sur la longueur du texte
Sur quoi se baser dans ce cas ?
__________________
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 22/12/2011, 02h18   #5
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut superfetatoire,

Citation:
Merci pour ta réponse.
De rien

Citation:
Ma question n'était effectivement pas assez précise.

Toutes mes colonnes sont identiques (entre elles et sur tout le document).
Le document est en police proportionnelle (Verdana), donc on ne peut pas se baser sur la longueur du texte.

Exemple :

J'ai la liste suivante :
texte
texte ok
texte long
mottroplong


Voici ce que ça donne une fois mis en colonne :
texte
texte ok
texte
long
mottropl
ong

Je voudrais que la macro me détecte que "texte long" et "mottroplong" ne rentrent pas dans la colonne.

J'ai pensé à me placer au début de chaque ligne et à tester le caractère de fin (qui devrait être une marque de paragraphe si c'est c'est bon), mais je ne sais pas trop faire ça.
Heureux-Oli a raison (en partie) avec sa remarque sur la longueur du texte mais il n'y a pas que la longueur qui joue dans le cas (très restreint) que tu donnes comme base : on peut jouer sur le nb de lignes. Voilà le principe :
  1. Tu "sélectionnes" tes "textes"
    • via la méthode Range pour aller plus vite que le déplacement de l'objet Sélection
    • ici j'ai l'impression que tes textes sont des paragraphes
  2. Tu utilises la méthode "Information" du n° de ligne de ton début de ton Range et tu le compares à celui de la fin
Attention, tu dois ne pas utiliser la pagination en arrière-plan dans Word ni le mode brouillon (sinon la méthode "Information" du n° de ligne de ton début de ton Range vaut -1)
Voilà le code correspondant (Attention, il s'agit d'une macro assez longue car elle doit calculée le n° de ligne, ce qui est long dans Word) ==> vois si tu as besoin dans la restreindre à une section ou par blocs de 100 paragraphes, voire sur ta sélection courante en fonction de tes besoins. Mais le principe est le même. Comme tu n'avais pas précisé, j'ai mis les paragraphes en surligné jaune, tu adapteras en fonction de tes besoins

Code :
1
2
3
4
5
6
7
8
9
Sub DVP_DetecterMotTropLong()
    For aI = 1 To ActiveDocument.Paragraphs.Count
        If ActiveDocument.Paragraphs(aI).Range.Characters.Count > 1 Then
            If (ActiveDocument.Paragraphs(aI).Range.Information(wdFirstCharacterLineNumber) <> ActiveDocument.Paragraphs(aI).Range.Characters(ActiveDocument.Paragraphs(aI).Range.Characters.Count - 1).Information(wdFirstCharacterLineNumber)) Then
                ActiveDocument.Paragraphs(aI).Range.HighlightColorIndex = wdYellow
            End If
        End If
    Next
End Sub
texte
texte ok
texte
long
mottropl
ong

Je n'ai pas trouver le surligné dans l'éditeur de DVP.com et j'ai mis le rouge (car le jaune ne se voit pas)

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/12/2011, 16h18   #6
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Citation:
Envoyé par Heureux-oli Voir le message
Salut,

Sans vouloir être rabat joie



Sur quoi se baser dans ce cas ?
Oui, à la place de "on ne peut pas se baser sur la longueur du texte", j'aurais dû dire "on ne peut pas se baser sur le nombre de caractères du texte".
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 16h25   #7
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Sepia,

Merci beaucoup pour cette solution qui fonctionne très bien !

Le problème, c'est que c'est effectivement très lent. J'ai fait un essai avec un document d'environ mille lignes et obtenu le résultat dans un délai acceptable. Par contre, avec mon fichier de 100.000 lignes, j'ai laissé tourner pendant quatre heures sans que la macro ne rende la main. Je vais relancer cette nuit pour voir.
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 00h10   #8
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut superfetatoire,

Si tu as des documents de cette taille (100 000 lignes), c'est beaucoup trop lent, il va falloir absolument voir pour une optimisation de cette macro.

Je pensais que tu aurais eu une taille "raisonnable" et c'est pour cela que je t'ai averti du temps de traitement. Dis-moi si cela te semble OK (avec la contrainte d'une limite raisonnable) ou si tu veux que l'on voit comment faire pour améliorer (quitte à devoir tout refaire car en termes de code, on aura du mal à vraiment gagner sans repenser autrement la macro ).

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 11h32   #9
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Bonjour,

J'ai laissé tourner la macro pendant environ 16 heures sans récupérer la main.

J'ai pensé à une solution :

Pour chaque paragraphe du document
Se positionner au début du paragraphe
Se positionner en fin de ligne
Si le caractère suivant n'est pas une marque de paragraphe
Surligner le paragraphe en jaune
FinSi
FinPour

mais je n'arrive pas à la mettre en oeuvre.
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 13h57   #10
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 338
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 338
Points : 29 246
Points : 29 246
Salut,


Le passage par une sélection ne sera pas bon en terme de vitesse.
Pour gagner du temps, il faut travailler avec des ranges.
__________________
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 24/12/2011, 01h12   #11
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut superfetatoire,

Citation:
Le passage par une sélection ne sera pas bon en terme de vitesse.
Pour gagner du temps, il faut travailler avec des ranges.
Comme d'hab, Heureux-Oli a raison, c'est d'ailleurs pour ça que nous avons utilisé des ranges.

Il faut revoir l'algo. Je viens d'utiliser "wdVerticalPositionRelativeToPage" au lieu de "wdFirstCharacterLineNumber" comme propriétés. C'est mieux mais on reste dans le même ordre de temps. A titre de tests, j'ai pris ton exemple et j'ai fait un paragraphe de 3 cm avec une police "Verdana" de 20 points, et j'ai fait plein de copier-coller ==> 10 pages, 125 paragraphs et 63 détections en tout. Le 1er algo (avec wdFirstCharacterLineNumber) prend sur mon vieux Mac 23 sec. et le 2nd (avec wdVerticalPositionRelativeToPage) prend 21 sec.

Je cherche.

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 01h23   #12
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut superfetatoire

L'utilisation du mode Normal de Word et d'un Application.ScreenUpdating = False fait passer de 21 sec à 13, on avance mais c'est quand même long.

Voici le nouvel algo (attention, il faut passer en mode Normal)

Code :
1
2
3
4
5
6
7
8
9
10
 
    Application.ScreenUpdating = False
    For aI = 1 To ActiveDocument.Paragraphs.Count
        If ActiveDocument.Paragraphs(aI).Range.Characters.Count > 1 Then
            If (ActiveDocument.Paragraphs(aI).Range.Information(wdVerticalPositionRelativeToPage) <> ActiveDocument.Paragraphs(aI).Range.Characters(ActiveDocument.Paragraphs(aI).Range.Characters.Count - 1).Information(wdVerticalPositionRelativeToPage)) Then
                ActiveDocument.Paragraphs(aI).Range.HighlightColorIndex = wdYellow
            End If
        End If
    Next
    Application.ScreenUpdating = True
@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/12/2011, 22h35   #13
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Bonjour,

Merci de plancher sur mon problème !

Je vais laisser tourner cette nuit avec cette nouvelle version pour voir.

@+
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2011, 12h41   #14
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Bonjour,

J'ai laissé tourner la macro pendant 9 heures et environ 15-20% du document a été traité.

@+
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 01h40   #15
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut superfetatoire,

alors cette macro, elle finit par passer Noël ?

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h35   #16
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 1
Points : 1
Bonjour,

En lançant sur plusieurs nuits, j'ai pu traiter tout mon fichier (en ajoutant des "marqueurs" toutes les 1000 lignes pour repérer la partie déjà traitée, et en supprimant celle-ci avant un nouveau lancement de la macro).

Merci beaucoup pour tes recherches et la solution proposée.

Bonne année 2012 !

@+
superfetatoire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 02h58   #17
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut superfetatoire,

Bonne année aussi. J'ai essayé d'autres méthodes mais je n'ai pas eu mieux en temps de réponse. J'ai regardé à utiliser des bibliothèques Java de manipulation de fichier Office (POI en l'occurrence) mais les fonctions ne sont disponibles pour manipuler ce type d'éléments avec Word 2003.

Cela signifie que la solution est bonne mais à limiter à des fichiers de taille raisonnable ou que l'on soit patient

@+
Sepia 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 20h34.


 
 
 
 
Partenaires

Hébergement Web