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 27/01/2011, 15h32   #1
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 56
Points : 14
Points : 14
Par défaut Point à la fin du paragraphe

Bonjour,
Si je place systématiquement un point à la fin d'une phrase, il m'arrive d'en oublier à la fin des paragraphes. Je cherche à créer une petite macro de vérification qui constaterait la présence ou l'absence de ce point à la fin de chaque paragraphe et qui l'ajouterait si nécessaire...
Je connais l'architecture mais tous les éléments du code

ActiveDocument. début du document
Pour chaque paragraphe, vérifiez si le dernier caractère est "." : S'il y est passez au paragraphe suivant sinon insérez "."

une base trouvé dans l'aide VBA de word 2010 :

Code :
1
2
3
4
5
6
Set doc = ActiveDocument
Set rngRange = _
    doc.Range(doc.Paragraphs(1).Start, _
    doc.Paragraphs(1).End - 1)
rngRange.InsertAfter _
    "."
Comment faire pour chaque paragraphe ( For each.... next)

Ce code pourrait s'insérer dans une autre macro juste avant l'enregistrement



Merci de votre aide
sanfric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h36   #2
Responsable Word

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

On peut faire une boucle sur les paragraphes, mais elle va contenir les sauts de paragraphes.
Donc, on va travailler sur un morceau du paragraphe.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
'Déclaration des variables
Dim pAra As Paragraph
 
'Boucle sur les paragraphes
For Each pAra In ActiveDocument.Paragraphs
'Test sur le dernier caractère du paragraphe
'Si ce n'est pas un point, on l'ajoute
If Mid(pAra.Range.Text, Len(pAra.Range.Text) - 1, 1) <> "." Then
pAra.Range.Select
'On se déplace juste derrière le saut de paragraphe
Selection.Collapse direction:=wdCollapseEnd
'On recule d'un caractère pour être devant le saut de paragraphe
Selection.MoveLeft unit:=wdCharacter, Count:=1
'On ajoute le point
Selection.TypeText "."
End If
Next pAra
__________________
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 28/01/2011, 00h18   #3
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 377
Points : 3 377
Salut Sanfric,

Analyse ta demande et regarde ce que Word peut faire pour toi avec un simple remplacement global (cf. Tuto sur Rechercher/Remplacer) : tu demandes à Word d'ajoute des points à tous les paragraphes qui se terminent par un mot et pas par un signe de ponctuation.

Le remplacement global à effectuer est le suivant :
Critère de recherche = ">^p"
Critère de remplacement = ".^&"
Option "Utiliser les caractères génériques" cochée

Mais comme Word ne sait pas traiter les retours chariot avec l'option "Utiliser les caractères génériques" cochée ==> tu dois faire un pré-traitement (et donc un post-traitement )

Pré-traitement : on remplace les retours chariot par un truc que tu n'as pas dans ton document par exemple "$$$"
Critère de recherche = "^p"
Critère de remplacement = "$$$^&"
Option "Utiliser les caractères génériques" non cochée

Remplacement : on ajoute des points à tous les paragraphes qui se terminent par un mot et pas par un signe de ponctuation
Critère de recherche = ">$$$"
Critère de remplacement = ".$$$"
Option "Utiliser les caractères génériques" cochée

Post-traitement : on remplace le truc que tu n'as pas dans ton document initial (ici "$$$") par des retours chariot
Critère de recherche = "$$$^p"
Critère de remplacement = "^p"
Option "Utiliser les caractères génériques" non cochée

Voilà c'est fait. Tu ajoutes si tu n'as pas de signes de ponctuation, de tirets...
En fait sur les documents correctement écrits en français.

Maintenant si tu veux en plus traiter les cas qui ne sont pas correctement écrits en français comme ceux des paragraphes qui finissent par des espaces, des tabulations... tu dois ajouter dans le pré-traitement

Critère de recherche = "^w^p"
Critère de remplacement = "^p"
Option "Utiliser les caractères génériques" non cochée

Évidemment toutes ses commandes peuvent grouper dans une macro puisqu'il s'agit de fonctions standards Word. Le plus simple pour cela est alors d'enregistrer une fois les remplacements dans une macro puis d'associer cette macro à un bouton (du ruban puisque tu es en Word 2010).

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 09h08   #4
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 56
Points : 14
Points : 14
Par défaut pb lignes vides

Bonjour,

La macro de Heureux-Oli fonctionne bien s'il n'y a pas de ligne vierge(retour chariot uniquement) dans le texte et/ou à la fin du texte. Sinon on a erreur 5 : argument ou appel de procédure incorrect.
Il manquerait,à mon avis,un If... Then précisant que si le paragraphe est vide, il faut passer au suivant.
Autre anomalie pour la dernière ligne: si le retour chariot est juste après le dernier mot, le "." se met évidemment avant la dernière lettre.

Quant à la méthode de Sépia, je n'arrive pour l'instant qu'à faire fonctionner que la première partie (sans les guillemets).Mais je vais réessayer !
sanfric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 09h33   #5
Responsable Word

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

On peut toujours faire un test sur la longueur de la chaîne avant de traiter le paragraphe.
__________________
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 28/01/2011, 14h35   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 11
Points : 10
Points : 10
Par défaut Ne compliquons pas une chose simple

Bonjour à toutes et tous
Je pense que vous donnez de la complexité à une solution simple. La macro a écrire (ou à enregistrer bêtement avec l’enregistreur de macro) est la suivante :
Remplacer ¶ par . ¶
Remplacer .. par .
C’est tout.
On peut ensuite traiter si nécessaire les paragraphes vides que l’on souhaite conserver par :
Remplacer ¶.¶ par ¶¶
Et si l’on ne souhaite pas les conserver :
Remplacer ¶.¶ par ¶
Bonne journée
Histoire orale
histoire orale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 16h34   #7
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 56
Points : 14
Points : 14
Par défaut début de solution simple basée sur le post précédent

Ci-joint un code à tester

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub point2()
'
'point à la fin des paragraphes
   ' Aller au début du texte
    Selection.HomeKey Unit:=wdStory
 
 '  mettre des points
    Selection.Find.ClearFormatting
    Selection.Find.Highlight = False
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Highlight = True
    With Selection.Find
        .TEXT = "^p"
        .Replacement.TEXT = ".^p"
        .Forward = False
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
 
 ' supprimer les points en double en remontant
    With Selection.Find
        .TEXT = ".."
        .Replacement.TEXT = "."
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
NB :
-Il faut que la marque de paragraphe soit juste après le dernier mot.
-Évidemment les éventuels points de suspension subissent le 2e traitement aussi!
-Encore à résoudre: supprimez le point des paragraphes vides (en rouge). Comme dans l'exemple ci-dessous ( Titre d'un texte, puis à la ligne, puis première ligne du texte). Un connaisseur peut-il me rajouter un bout de code?

Citation:
Un éducateur sportif pour encadrer les jeunes.
.
Mardi soir,......
sanfric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 23h37   #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 377
Points : 3 377
Citation:
Envoyé par histoire orale Voir le message
Bonjour à toutes et tous
Je pense que vous donnez de la complexité à une solution simple. La macro a écrire (ou à enregistrer bêtement avec l’enregistreur de macro) est la suivante :
Remplacer ¶ par . ¶
Remplacer .. par .
C’est tout.
On peut ensuite traiter si nécessaire les paragraphes vides que l’on souhaite conserver par :
Remplacer ¶.¶ par ¶¶
Et si l’on ne souhaite pas les conserver :
Remplacer ¶.¶ par ¶
Bonne journée
Histoire orale
Salut Histoire orale,

En effet, comme ça c'est plus simple mais ça ne traite que les points après un point. Bien que Sanfric ne nous l'ai pas indiqué, tu penses vraiment que si ton traitement ajoute un "." derrière des signes de ponctuation comme la virgule, le point-virgule, ça correspond à un usage réel. L'intérêt de ma méthode c'est que tous les signes de ponctuation sont traité en une seule opération. Certes c'est plus que Sanfric a décrit mais surtout ça correspond à ce qu'il a demandé et ce que ça fait en plus (pour le même code), je suis convaincu que c'est ce qu'il a voulu dire. Donc pour faire que les points et supprimer les ".." ta méthode est bonne mais elle se limite par exemple à la simple expression ".." et "¶.¶" mais si tu as 2 espaces devant le ¶ ou une tabulation, alors qu'avec ce que j'ai proposé c'est aussi pris en compte.

Maintenant nous on propose. Avec Heureux-Oli on essaie que les gens progressent dans l'usage de l'outil pour mieux se débrouiller seul , voire promouvoir auprès de leurs petits camarades de jeu des solutions/astuces ou à défaut leur conseiller le site de DVP.com . On espère (mais bon on reste réaliste) qu'ils pourront même un jour conseiller d'autres utilisateurs sur Word

Donc comme souvent il y a plusieurs solutions, tant mieux. Elles sont plus ou moins simples et couvrent plus ou moins de fonctionnels. Donc Sanfric pourra toujours choisir en fonction de son niveau initial, de sa volonté de progresser et son urgence pour résoudre le problème. Et en plus avec un pseudo comme le sien, nos conseils/solutions que les DVPnautes lui proposent sont gratuits, tu penses bien qu'il est content.

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 09h02   #9
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 56
Points : 14
Points : 14
Par défaut Happy end

Bonjour,
Merci pour vos conseils à tous. Mon codage est basique de chez basique et je progresse de façon empirique, résolvant les questions par des conseils glanés à gauche et à droite, sans prétention.
Ce matin, j'ai rajouté ce bout de code qui résout le problème des points inutiles dans ce modèle de présentation de texte que j'utilise fréquemment.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 ' Pas de point final pour le Titre et l'interligne
' à rajouter au code ci-dessus
 
      Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Highlight = False
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Highlight = True
    With Selection.Find
        .TEXT = ".^p"
        .Replacement.TEXT = "^p"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    With Selection
        If .Find.Forward = True Then
            .Collapse Direction:=wdCollapseStart
        Else
            .Collapse Direction:=wdCollapseEnd
        End If
        .Find.Execute Replace:=wdReplaceOne
        If .Find.Forward = True Then
            .Collapse Direction:=wdCollapseEnd
        Else
            .Collapse Direction:=wdCollapseStart
        End If
        .Find.Execute
    End With
    With Selection
        If .Find.Forward = True Then
            .Collapse Direction:=wdCollapseStart
        Else
            .Collapse Direction:=wdCollapseEnd
        End If
        .Find.Execute Replace:=wdReplaceOne
        If .Find.Forward = True Then
            .Collapse Direction:=wdCollapseEnd
        Else
            .Collapse Direction:=wdCollapseStart
        End If
        .Find.Execute
    End With
L'ensemble est un peu long mais simple et efficace. Je pense l'intégrer dans une macro d'enregistrement via Application.run
Mais si un lecteur a d'autres suggestions pour un code plus élaboré ou plus élégant, je suis preneur néanmoins.
sanfric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 10h53   #10
Responsable Word

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

Dans le code que j'ai donné, il y a 9 lignes.
Si c'est plus complexe que 46 dans le dernier message
Possible !
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h29.


 
 
 
 
Partenaires

Hébergement Web