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

Bout de Macro VBA Word qui plante

19 réponses
Avatar
Raymond Poulain
Bonjour,

Est-il possible dans une Macro Word de sélectionner un texte entre 2 mots,
le premier inclus, le second exclus de la sélection, comme NAISSANCE et
Voyages (avec la casse, ces 2 mots n'existent qu'une seule fois et entre les
deux le texte est de longueur variable et put même inclure des retour
clavier)?
Ce que je cherche: J'ai dans Word bla bla bla NAISSANCE: xbla bla bla blaz
Voyages: bla bla bla
C'est sélectionner seulement le texte suivant "NAISSANCE: xbla bla bla blaz
" de manière automatique pour ensuite lui appliquer un autre traitement (mise
en 2 colonnes, italiques).
C'est une macro qui traite des centaines de fichiers MSWord, chacun ayant
les deux mots clé, mais le bla bla bla n'est pas le même.


J'ai essayé :
dim debut as integer
dim fin as integer
dim MonTexte as string
dim result as string 'la chaine que tu veux obtenir
MonTexte = 'définis le texte dans lequel tu cherches

debut = InStr(1, MonTexte, "NAISSANCE: ")
fin = InStr(1, MonTexte, "Voyages")
Set maplage = ActiveDocument.Range(Start:=debut, End:=fin - 1)
maplage.Select


Mais cela plante

QQn peut aider, svp

Merci
Raymond

10 réponses

1 2
Avatar
Anacoluthe
Bonjour !

'Raymond Poulain' nous a écrit ...
Est-il possible dans une Macro Word de sélectionner un texte entre 2 mots,
le premier inclus, le second exclus de la sélection, comme NAISSANCE et
Voyages (avec la casse, ces 2 mots n'existent qu'une seule fois et entre les
deux le texte est de longueur variable et put même inclure des retour
clavier)?


RR (rechercher-remplacer) de Word fait ça très simplement sans macro.
Donc s'il faut une macro, utilisez dedans un simple RR !

Anacoluthe
« Ce n’est pas si simple que ça d’être simple. »
- Pierre REVERDY

Avatar
Geo
Bonjour Raymond


J'ai essayé :
dim debut as integer
dim fin as integer
dim MonTexte as string
dim result as string 'la chaine que tu veux obtenir
MonTexte = 'définis le texte dans lequel tu cherches

debut = InStr(1, MonTexte, "NAISSANCE: ")
fin = InStr(1, MonTexte, "Voyages")
Set maplage = ActiveDocument.Range(Start:Þbut, End:=fin - 1)
maplage.Select


Select s'applique a une partie de document, là tu veux l'appliquer à une
variable, ça se peut pas.
Il te faut choisir, soit tu travailles sur le docuement soit dans des
variables
Avec des variables, il faudrait par exemple faire :
debut = InStr(1, MonTexte, "NAISSANCE: ")
fin = InStr(1, MonTexte, "Voyages")
result = Mid(MonTexte, debut, fin - debut)

si c'est sur le document :
Dim MaPlage as Range
dim debut as integer
dim fin as integer
dim MonTexte as string
dim result as string 'la chaine que tu veux obtenir
MonTexte = ActiveDocument.text
debut = InStr(1, MonTexte, "NAISSANCE: ")
fin = InStr(1, MonTexte, "Voyages")
Set maplage = ActiveDocument.Range(Start:Þbut-1, End:=fin - 1)
maplage.Select

Pense à mettre
Option Explicit
en début de code, ça oblige à déclarer toutes les vairiables, c'est un gage
de fiabilité.

--

A+

Avatar
AB
Hello Anacoluthe !
T'es sûr, là ?
Pas de problème pour RR par du texte en italique (ou tout autre attribut),
mais les mots "balises" sont inclus dans le remplacement, ce que ne veut pas
notre ami.
Quant à mettre le texte en question en colonnes, simplement avec RR, sans
macro, je donne ma langue au matou...
A+
André

"Anacoluthe" a écrit dans le message de news:

Bonjour !

'Raymond Poulain' nous a écrit ...
Est-il possible dans une Macro Word de sélectionner un texte entre 2
mots, le premier inclus, le second exclus de la sélection, comme
NAISSANCE et Voyages (avec la casse, ces 2 mots n'existent qu'une seule
fois et entre les deux le texte est de longueur variable et put même
inclure des retour clavier)?


RR (rechercher-remplacer) de Word fait ça très simplement sans macro.
Donc s'il faut une macro, utilisez dedans un simple RR !

Anacoluthe
« Ce n’est pas si simple que ça d’être simple. »
- Pierre REVERDY



Avatar
Anacoluthe
Bonjour !

'AB' nous a écrit ...
T'es sûr, là ?
Si avec les caractères génériques tu cherches

(NAISSANCE:)(*)(VOYAGE)
le texte 'NAISSANCE: bla bla bla (jusqu'à VOYAGE)' est 12
À partir de là tu fais ce que tu veux avec : insérer une tabulation,
mettre en italique, copier dans un tableau. Du moment que la procédure
manuelle est faisable, il n'y a pas de difficulté dans une macro, non ?

Anacoluthe
« Ce n’est pas si simple que ça d’être simple. »
- Pierre REVERDY

Avatar
Raymond Poulain
Bonjour Geo

Je pense être, sauf erreur, dans le schéma "variables", car mon bout de
macro s'inscrit dans une macro plus grande (que je n'ai pas écrite et) qui
commence par option Base 0 (peut-on ajouter alors option explicit?)
Mon bout de macro est ajouté au moment où la grande macro se trouve dans
l'un des 600 documents word (qu'elle traite un par un) et où je fais des
transformations automatiques.
Si je modifie ma macro pour "result = Mid..." comme tu l'as écrit, j'obtiens
en pas à pas le message suivant, après "result..." :
erreur d'exécution 5. Argument ou appel de procédure incorrect

Après cette instruction "result...", je supposais avoir sélectionner le
texte entre les 2 bornes et j'ai donc ajouté les instructions de macro
automatique des 2 colonnes et de l'italique (facile)

Merci de ton aide

Ray


Bonjour Raymond


J'ai essayé :
dim debut as integer
dim fin as integer
dim MonTexte as string
dim result as string 'la chaine que tu veux obtenir
MonTexte = 'définis le texte dans lequel tu cherches

debut = InStr(1, MonTexte, "NAISSANCE: ")
fin = InStr(1, MonTexte, "Voyages")
Set maplage = ActiveDocument.Range(Start:Þbut, End:=fin - 1)
maplage.Select


Select s'applique a une partie de document, là tu veux l'appliquer à une
variable, ça se peut pas.
Il te faut choisir, soit tu travailles sur le docuement soit dans des
variables
Avec des variables, il faudrait par exemple faire :
debut = InStr(1, MonTexte, "NAISSANCE: ")
fin = InStr(1, MonTexte, "Voyages")
result = Mid(MonTexte, debut, fin - debut)

si c'est sur le document :
Dim MaPlage as Range
dim debut as integer
dim fin as integer
dim MonTexte as string
dim result as string 'la chaine que tu veux obtenir
MonTexte = ActiveDocument.text
debut = InStr(1, MonTexte, "NAISSANCE: ")
fin = InStr(1, MonTexte, "Voyages")
Set maplage = ActiveDocument.Range(Start:Þbut-1, End:=fin - 1)
maplage.Select

Pense à mettre
Option Explicit
en début de code, ça oblige à déclarer toutes les vairiables, c'est un gage
de fiabilité.

--

A+






Avatar
Guy Moncomble
Bonjour à tous,
dans le message ,

| Bonjour Geo
|
| Je pense être, sauf erreur, dans le schéma "variables", car mon bout
| de macro s'inscrit dans une macro plus grande (que je n'ai pas écrite
| et) qui commence par option Base 0 (peut-on ajouter alors option
| explicit?)
| Mon bout de macro est ajouté au moment où la grande macro se trouve
| dans l'un des 600 documents word (qu'elle traite un par un) et où je
| fais des transformations automatiques.
| Si je modifie ma macro pour "result = Mid..." comme tu l'as écrit,
| j'obtiens en pas à pas le message suivant, après "result..." :
| erreur d'exécution 5. Argument ou appel de procédure incorrect
|
| Après cette instruction "result...", je supposais avoir sélectionner
| le texte entre les 2 bornes et j'ai donc ajouté les instructions de
| macro automatique des 2 colonnes et de l'italique (facile)
|
| Merci de ton aide
|


Pour moi, le mieux c'est de croire Anacoluthe et de se servir du find :

Public Sub SelectEntreBornes(Borne1 As String, Borne2 As String)
Dim Long1 As Long, Long2 As Long
'Pour être sûr de trouver du premier coup
ActiveDocument.Bookmarks("StartOfDoc").Select
Long1 = Len(Borne1)
Long2 = Len(Borne2)
Selection.Find.ClearFormatting
With Selection.Find
.Text = Borne1 & "*" & Borne2
.Replacement.Text = ""
.Forward = True
.MatchCase = True
.MatchWildcards = True
.Execute
End With
Selection.SetRange Selection.Range.Start + Long1, Selection.Range.End -
Long2
End Sub

--
A+

G.M. MVP Word

P.-S. Je ne suis pas sûr d'avoir tout compris, mais est-ce la partie
entre bornes que tu veux passer en deux colonnes, ou est-ce tout le
texte ?
Avatar
Geo
Bonjour Guy

Je suppose qu'il s'agit d'un texte généré plus ou moins en vrac par un
logiciel de généalogie, que Raymond essaie de remettre en forme en séparant
les éléments tels que le lieu de naissance et les loisirs.

--

A+
Avatar
Raymond Poulain
Bonsoir à tous les 2,

C'est du vrac, qui demande à être formatté, mais cela vient d'une base de
données qui génére 600 fichiers word qui sont repris et transformés par la
macro.
Pour le bout de macro, c'est bien entre les 2 bornes que va se faire la
sélection, puis la mise en 2 colonnes, etc.

A+ Ray


Bonjour Guy

Je suppose qu'il s'agit d'un texte généré plus ou moins en vrac par un
logiciel de généalogie, que Raymond essaie de remettre en forme en séparant
les éléments tels que le lieu de naissance et les loisirs.

--

A+






Avatar
Geo
Bonjour Raymond


Bonsoir à tous les 2,

C'est du vrac, qui demande à être formatté, mais cela vient d'une
base de données qui génére 600 fichiers word qui sont repris et
transformés par la macro.
Pour le bout de macro, c'est bien entre les 2 bornes que va se faire
la sélection, puis la mise en 2 colonnes, etc.


Il y a d'autres pistes alors, comme remplacer "NAISSANCE " par
"^pNAISSAANCE " qui met un saut de paragrapgraphe avant chaque paragraphe
nassance etc. et après tu peux mettre ton etxte en deux colonnes (et non
tableau à deux colonnes).

--

A+

Avatar
Raymond Poulain
Bonjour Geo,

Oups, on dérive...

Il s'agit bien d'un bout de macro: car effectivement, je pouurai le faire à
la main.
Mais 600 fois et à chaque fois que je produis les fichiers par la base de
données, c'est surhumain !
Le bout de macro ne marche pas, mais le bug doit pouvoir être corrigé, non ?
J'ai préféré traiter le "formattage" au niveau de chacun des 600 fichiers
Word. Alternativement, la macro met -à la fin- les fichiers à la suite les
uns des autres dans un nouveau fichier Word (très gros) qui sera imprimé.
C'est possible aussi de faire le formattage au niveau du gros fichier Word,
sauf qu'alors il faudra x fois (600+) aller chercher le texte entre les 2
bornes (qui n'est jamais le même) et le formatter.

Merci de ton aide

A+

Ray

PS: réponse sur ton point "paragraphe": il y en a déjà un, avant
"NAISSANCE"... si cela peut t'aider !


Bonjour Raymond


Bonsoir à tous les 2,

C'est du vrac, qui demande à être formatté, mais cela vient d'une
base de données qui génére 600 fichiers word qui sont repris et
transformés par la macro.
Pour le bout de macro, c'est bien entre les 2 bornes que va se faire
la sélection, puis la mise en 2 colonnes, etc.


Il y a d'autres pistes alors, comme remplacer "NAISSANCE " par
"^pNAISSAANCE " qui met un saut de paragrapgraphe avant chaque paragraphe
nassance etc. et après tu peux mettre ton etxte en deux colonnes (et non
tableau à deux colonnes).

--

A+





1 2