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

Problème macro de suppression d'espaces

3 réponses
Avatar
Jean-François Colas
Bonjour,

En espérant être bien sur un forum adéquat...

Je rencontre un problème étrange dans Word 2010. J'ai voulu écrire une
macro dont le but est d'enlever sur chaque paragraphe en style normal,
les premières espaces ou la première tab éventuelles.

Dans le cas d'espaces, la macro doit en enlever jusqu'à concurrence de
trois (si je trouve 1, 2 ou 3 espaces, je les enlève; Au-delà, j'enlève
juste les 3 premières).

Ce que j'ai écrit semble pas mal marcher: si j'ai une, deux ou trois
espaces, elles disparaissent; si j'ai cinq espaces, il ne m'en reste
bien que deux. Sauf que... si j'ai quatre espaces, les quatre sont
enlevées, alors que je m'attendais à ce qu'il m'en reste une. Je ne
comprends pas. Ci-dessous donc, code, puis proposition de fichier
échantillon. A noter: je pars d'un fichier txt.

Si vous avez des pistes, elles seront les bienvenues. De même, si
certaines écritures peuvent être améliorées, je suis preneur également.


Merci,
J.-F.



Sub BSSupprIndentations()
For Each parag In ActiveDocument.Paragraphs
If parag.Range.Style = "Normal" Then
debut = parag.Range.Start
fin = debut
nbcar = parag.Range.Characters.Count
supprimer = False
If nbcar > 0 And parag.Range.Characters(1) = Chr(9) Then
supprimer = True
fin = fin + 1
End If
If nbcar > 0 And parag.Range.Characters(1) = Chr(32) Then
supprimer = True
fin = fin + 1
If nbcar > 1 And parag.Range.Characters(2) = Chr(32) Then
fin = fin + 1
If nbcar > 2 And parag.Range.Characters(3) =
Chr(32) Then
fin = fin + 1
End If
End If
End If
If supprimer Then
Set r = ActiveDocument.Range(Start:=debut, End:=fin)
r.Delete
End If
End If
Next
End Sub


Echantillon de test:

Ce parag n'a pad d'indentation
Une tab
Deux tabs
Une tab
Pas d'indentation
Une espace
Deux espaces
Trois espaces
Quatre espaces
Cinq espaces
Six espaces
Cinq espaces
Quatre espaces
Trois espaces
Deux espaces
Une espace
Une espace et une tab
Ce parag n'a pas d'indentations.

3 réponses

Avatar
Geo
Bonjour
La macro est correcte, j'ai ajouté un debug.print fin -debut pour
vérifier.
Le pb vient d'une option :
Fichier / Options / Options avancées
dans la partie Couper / coller
Décocher l'option de gestion des espaces.
Si vous voulez la conserver, il faudrait préparer le texte restant du
paragraphe dans un string et remplacer en bloc le texte du paragraphe.
Si certaines
écritures peuvent être améliorées, je suis preneur également.

On peut toujours trouver d'autres modes d'écriture, je trouve la vôtre
originale et pas si simple que ça à programmer.
Un débutant aurait travaillé tout autrement.
Histoire d'alimenter la conversation :
Au lieu de chr(9) on peut mettre vbtab
Pour l'espace au lieu de chr(32) : " ", là je suis curieux de connaître
les raisons de votre choix.
Pour parag.Range.Characters(1), j'aurais utilisé
left(parag.range.text,1)
Pour le 2-ème, j'aurais utilisé mid.
Sont-ce des améliorations ? pas vraiment, des manies plutôt.
Une autre démarche serait d'utiliser un do while avec comptage des
espaces ou tabulation supprimées en tête du texte du paragraphe avec
comme conditions de sortie :
Ce n'est pas forcément plus simple, par contre plus facile à faire
évoluer si vous décidez de changer les règles.
Avatar
Jean-François Colas
Bonjour,
Le 13/09/2016 15:51, Geo a écrit :
Bonjour
Le pb vient d'une option :
Fichier / Options / Options avancées
dans la partie Couper / coller
Décocher l'option de gestion des espaces.

Oui ! Merci, ça change tout en effet. Ca reste quasiment tout aussi
mystérieux mais au moins en pratique l'obstacle est franchi.
Si vous voulez la conserver, il faudrait préparer le texte restant du
paragraphe dans un string et remplacer en bloc le texte du paragraphe.

J'ai opté pour régler l'option à faux au début de la macro et restaurer
sa valeur à la fin, ne sachant pas sur combien d'ordinateurs différents
cette macro est vouée à être utilisée (au minimum 1, au maximum...
quelques-uns).
Histoire d'alimenter la conversation :
Au lieu de chr(9) on peut mettre vbtab

Oui ça me va bien, je ne suis pas toujours familier des constantes comme
celle-ci ou les nombreuses wdQuelqueChose.
Pour l'espace au lieu de chr(32) : " ", là je suis curieux de connaître
les raisons de votre choix.

On dira que c'est par symétrie avec chr(9), j'ai écrit cela ainsi au
début et je ne suis pas revenu là-dsssus... Puis je n'aime pas tellement
les guillemets, surtout s'ils se multiplient sur une ligne, mais ce
n'était pas le cas ici.
Pour parag.Range.Characters(1), j'aurais utilisé left(parag.range.text,1)
Pour le 2-ème, j'aurais utilisé mid.

C'est vrai que j'ai parfois un peu de mal à faire la jonction entre les
écritures "ob jet" et les instructions plus "Basic". En l'occurrence,
characters(1) et characters(2) ou (3) me donnaient une idée plus directe
de ce sur quoi je travaillais aussi.
Une autre démarche serait d'utiliser un do while avec comptage des
espaces ou tabulation supprimées en tête du texte du paragraphe avec
comme conditions de sortie :
Ce n'est pas forcément plus simple, par contre plus facile à faire
évoluer si vous décidez de changer les règles.

Oui, ça finira d'ailleurs sûrement comme ça en effet.
Merci encore.
J.-F.
Avatar
Geo
Bonjour
Ca reste quasiment tout aussi mystérieux

Sans cette option on peut se retrouver avec deux espaces consécutifs,
ou aucun quand on colle un mot à la place d'un autre.
Word gère les espaces en double ou manquants comme on souhaite qu'il le
fasse dans la très grande majorité des cas.
Dans ce cas particulier, ça reste un peu mystérieux en effet.
Vous avez choisi une solution simple et élégante.