OVH Cloud OVH Cloud

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

9 réponses

1 2
Avatar
Raymond Poulain
Bonjour Guy,

Désolé de ne pas avoir été clair.

Il s'agit de mettre en 2 colonnes une sélection de texte entre 2 bornes (les
2 mots clé) qui représente moins de 10% d'un fichier Word, il y a plus de 600
de ces fichiers qui se ressemblent tous par leur structure mais bien sûr sont
différents par le contenu.

A+

Ray


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 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.


Bien compris, mais quand on sait faire à la main, c'est d'autant plus
facile pour le faire en vba puisque l'enregistreur de macro fait le trvail.

Le bout de macro ne marche pas, mais le bug doit pouvoir être
corrigé, non ?


La première proposition que je t'ai faite focntionne, j'ai vérifié.

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.


Oui, bof, les deux se défendent.
Perso j'aurais plutôt traité le gros fichier et carrément à la main tant
que c'est possible, ça permet d'affiner si nécessaire, voire d'intervenir
sur le texte si nécessaire.
Par contre 600 pages (au moins) c'est un peu lourd, il faut une bonne
bécane et du temps.

--

A+

Avatar
Raymond Poulain
Bonjour Geo,

Cela ne marche pas chez moi (j'ai essayé tes 2 propositions).
Veux-tu que je t'envoie par e-mail sous format txt l'ensemble de la macro ?
Note accessoire : avec macro automatique Word, je n'arrive pas à
sélectionner le texte avec la souris, alors...
Traitement manuel: je te comprend, mais si tu veux faire une edition
periodique (annuelle), est-tu toujours prêt?

A+

Merci

Ray


Bonjour 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.


Bien compris, mais quand on sait faire à la main, c'est d'autant plus
facile pour le faire en vba puisque l'enregistreur de macro fait le trvail.

Le bout de macro ne marche pas, mais le bug doit pouvoir être
corrigé, non ?


La première proposition que je t'ai faite focntionne, j'ai vérifié.

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.


Oui, bof, les deux se défendent.
Perso j'aurais plutôt traité le gros fichier et carrément à la main tant
que c'est possible, ça permet d'affiner si nécessaire, voire d'intervenir
sur le texte si nécessaire.
Par contre 600 pages (au moins) c'est un peu lourd, il faut une bonne
bécane et du temps.

--

A+





Avatar
Bonsoir et bonne fin de semaine à tous,
Bon, je suis pas très sur, j'avoue avoir eu pas mal de mal à bricoler ça.
De plus j'espère vraiement que c'est ce dont tu a besoin.
Donc à condition que ça fonctionne aussi pour toi, je pense que d'aucun pourront critiquer ça positivement ;-).
--------------------------------
Sub TestRechercheTexteEtMiseEnTableauEpure()
With ActiveDocument.Content.Find
Selection.HomeKey Unit:=wdStory
Selection.Collapse Direction:=wdCollapseEnd
Selection.Find.ClearFormatting
Do While .Execute(FindText:="(Naissance:)(*)(Voyages)", MatchWildcards:=True, Wrap:=wdFindContinue) = True
Selection.Find.Text = "(Naissance:)(*)(Voyages)" ', MatchWildcards:=True, Wrap:=wdFindContinue) = True

Selection.Find.Replacement.Text = "^p1^t2^t3"
Selection.Find.Execute Replace:=wdReplaceOne
Selection.Move wdCharacter
Selection.Expand wdParagraph
Selection.ConvertToTable Separator:=wdSeparateByTabs, NumColumns:=3, _
NumRows:=1, AutoFitBehavior:=wdAutoFitFixed
With Selection.Tables(1)
.Style = "Grille du tableau"
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
Selection.Move wdCharacter

Loop
End With
End Sub
----------------------
Espérant t'avoir été utile.
Merci d'avoir lu jusque là.


"Raymond Poulain" a écrit dans le message de news:

Bonjour Geo,

Cela ne marche pas chez moi (j'ai essayé tes 2 propositions).
Veux-tu que je t'envoie par e-mail sous format txt l'ensemble de la macro ?
Note accessoire : avec macro automatique Word, je n'arrive pas à
sélectionner le texte avec la souris, alors...
Traitement manuel: je te comprend, mais si tu veux faire une edition
periodique (annuelle), est-tu toujours prêt?

A+

Merci

Ray


Bonjour 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.


Bien compris, mais quand on sait faire à la main, c'est d'autant plus
facile pour le faire en vba puisque l'enregistreur de macro fait le trvail.

Le bout de macro ne marche pas, mais le bug doit pouvoir être
corrigé, non ?


La première proposition que je t'ai faite focntionne, j'ai vérifié.

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.


Oui, bof, les deux se défendent.
Perso j'aurais plutôt traité le gros fichier et carrément à la main tant
que c'est possible, ça permet d'affiner si nécessaire, voire d'intervenir
sur le texte si nécessaire.
Par contre 600 pages (au moins) c'est un peu lourd, il faut une bonne
bécane et du temps.

--

A+







Avatar
Geo
Bonjour Raymond Poulain


Bonjour Geo,

Cela ne marche pas chez moi (j'ai essayé tes 2 propositions).
Veux-tu que je t'envoie par e-mail sous format txt l'ensemble de la
macro ?


Tu peux utiliser http://www.cjoint.com pour la macro et un exemple de
texte, comme ça tous ceux qui veulent t'aider le pourront.

Note accessoire : avec macro automatique Word, je n'arrive
pas à sélectionner le texte avec la souris, alors...


Exact et là on replonge dans l'aide pour utiliser le clavier, or cette aide
n'est pas évidente du tout.
Le plus simple à mon avis :
Positionner le point d'insertion en début du texte à sélectionner avec les
flèches)
appuyer sur F8 : on passe en mode extension, ça se voit dans les petites
cases en bas,
déplacer le point d'insertion avec les flèches.
Ceci dit, dans le cas indiqué je ne pense pas que cela te donne la
solution.

Traitement manuel: je te comprend, mais si tu veux faire une edition
periodique (annuelle), est-tu toujours prêt?


C'est une question de choix, il vaut mieux parfois retranscrire sur un
papier un mode opératoire manuel qui prend quelques heures que passer des
journées à écrire des macros. Mais c'est un choix personnel que je ne
critique(rais) pas, surtout quand on n'a pas toutes les données en main.
Mais il arrive souvent qu'on s'en-tête à faire marcher des trucs compliqués
alors qu'il y en a de plus simples, c'est un des intérêts de ces forums,
justement, que d'autres proposent des alternatives.
--

A+

Avatar
Raymond Poulain
Bonsoir @pollo

Merci beaucoup.
Même si ta réponse ne cadre pas complètement, ta réponse m'a beaucoup aidé.
Pour la seconde balise, j'ai dû modifier mes fichiers avec $$ (avant
"voyages", que j'effacerai ensuite), mais maintenant c'est bon, merci
encore.
Pour le newsgroup, voici la macro:

With Selection.Find
.Text = "(NAISSANCE:)(*)($$)"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute
If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
ActiveWindow.Panes(2).Close
End If
If ActiveWindow.ActivePane.View.Type <> wdPrintView Then
ActiveWindow.ActivePane.View.Type = wdPrintView
End If
ActiveDocument.Range(Start:=Selection.Start, End:=Selection.Start). _
InsertBreak Type:=wdSectionBreakContinuous
Selection.Start = Selection.Start + 1
ActiveDocument.Range(Start:=Selection.End,
End:=Selection.End).InsertBreak _
Type:=wdSectionBreakContinuous
With Selection.PageSetup.TextColumns
.SetCount NumColumns:=2
.EvenlySpaced = True
.LineBetween = True
.Width = CentimetersToPoints(9.2)
.Spacing = CentimetersToPoints(0.6)
End With

Bon courage à tous

Ray


Bonsoir et bonne fin de semaine à tous,
Bon, je suis pas très sur, j'avoue avoir eu pas mal de mal à bricoler ça.
De plus j'espère vraiement que c'est ce dont tu a besoin.
Donc à condition que ça fonctionne aussi pour toi, je pense que d'aucun pourront critiquer ça positivement ;-).
--------------------------------
Sub TestRechercheTexteEtMiseEnTableauEpure()
With ActiveDocument.Content.Find
Selection.HomeKey Unit:=wdStory
Selection.Collapse Direction:=wdCollapseEnd
Selection.Find.ClearFormatting
Do While .Execute(FindText:="(Naissance:)(*)(Voyages)", MatchWildcards:=True, Wrap:=wdFindContinue) = True
Selection.Find.Text = "(Naissance:)(*)(Voyages)" ', MatchWildcards:=True, Wrap:=wdFindContinue) = True

Selection.Find.Replacement.Text = "^p1^t2^t3"
Selection.Find.Execute Replace:=wdReplaceOne
Selection.Move wdCharacter
Selection.Expand wdParagraph
Selection.ConvertToTable Separator:=wdSeparateByTabs, NumColumns:=3, _
NumRows:=1, AutoFitBehavior:=wdAutoFitFixed
With Selection.Tables(1)
.Style = "Grille du tableau"
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
Selection.Move wdCharacter

Loop
End With
End Sub
----------------------
Espérant t'avoir été utile.
Merci d'avoir lu jusque là.


"Raymond Poulain" a écrit dans le message de news:

Bonjour Geo,

Cela ne marche pas chez moi (j'ai essayé tes 2 propositions).
Veux-tu que je t'envoie par e-mail sous format txt l'ensemble de la macro ?
Note accessoire : avec macro automatique Word, je n'arrive pas à
sélectionner le texte avec la souris, alors...
Traitement manuel: je te comprend, mais si tu veux faire une edition
periodique (annuelle), est-tu toujours prêt?

A+

Merci

Ray


Bonjour 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.


Bien compris, mais quand on sait faire à la main, c'est d'autant plus
facile pour le faire en vba puisque l'enregistreur de macro fait le trvail.

Le bout de macro ne marche pas, mais le bug doit pouvoir être
corrigé, non ?


La première proposition que je t'ai faite focntionne, j'ai vérifié.

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.


Oui, bof, les deux se défendent.
Perso j'aurais plutôt traité le gros fichier et carrément à la main tant
que c'est possible, ça permet d'affiner si nécessaire, voire d'intervenir
sur le texte si nécessaire.
Par contre 600 pages (au moins) c'est un peu lourd, il faut une bonne
bécane et du temps.

--

A+












Avatar
Raymond Poulain
Bonsoir et merci beaucoup Géo,

Avec tes réponses et celle d'@pollo, j'y suis arrivé.

Voir le "bon" bout de macro dans la réponse à @pollo.

A+ (une autre fois)

Ray


Bonjour Raymond Poulain


Bonjour Geo,

Cela ne marche pas chez moi (j'ai essayé tes 2 propositions).
Veux-tu que je t'envoie par e-mail sous format txt l'ensemble de la
macro ?


Tu peux utiliser http://www.cjoint.com pour la macro et un exemple de
texte, comme ça tous ceux qui veulent t'aider le pourront.

Note accessoire : avec macro automatique Word, je n'arrive
pas à sélectionner le texte avec la souris, alors...


Exact et là on replonge dans l'aide pour utiliser le clavier, or cette aide
n'est pas évidente du tout.
Le plus simple à mon avis :
Positionner le point d'insertion en début du texte à sélectionner avec les
flèches)
appuyer sur F8 : on passe en mode extension, ça se voit dans les petites
cases en bas,
déplacer le point d'insertion avec les flèches.
Ceci dit, dans le cas indiqué je ne pense pas que cela te donne la
solution.

Traitement manuel: je te comprend, mais si tu veux faire une edition
periodique (annuelle), est-tu toujours prêt?


C'est une question de choix, il vaut mieux parfois retranscrire sur un
papier un mode opératoire manuel qui prend quelques heures que passer des
journées à écrire des macros. Mais c'est un choix personnel que je ne
critique(rais) pas, surtout quand on n'a pas toutes les données en main.
Mais il arrive souvent qu'on s'en-tête à faire marcher des trucs compliqués
alors qu'il y en a de plus simples, c'est un des intérêts de ces forums,
justement, que d'autres proposent des alternatives.
--

A+





Avatar
Geo
Bonjour Raymond Poulain


Bonsoir et merci beaucoup Géo,

Avec tes réponses et celle d'@pollo, j'y suis arrivé.

Voir le "bon" bout de macro dans la réponse à @pollo.


Vu :-)
Finalement la piste du rechercher remplacer était la bonne.
Merci pour le retour.

--

A+

Avatar
Bonsoir,
Merci de ce retour.
Merci beaucoup.
Même si ta réponse ne cadre pas complètement, ta réponse m'a beaucoup aidé.
Content que ça t'ai aidé et content de le savoir.

Pour ma part, je n'ai avec ta solution ni compris la solution ni mieux compris ton problème, notament les deux $ ?

Mais bref j'avais déjà eu du mal à bricoler ma macro.
Content que tu es eu ta solution.
Merci d'avoir lu jusque là.

"Raymond Poulain" a écrit dans le message de news:

Bonsoir @pollo

Merci beaucoup.
Même si ta réponse ne cadre pas complètement, ta réponse m'a beaucoup aidé.
Pour la seconde balise, j'ai dû modifier mes fichiers avec $$ (avant
"voyages", que j'effacerai ensuite), mais maintenant c'est bon, merci
encore.
Pour le newsgroup, voici la macro:

With Selection.Find
.Text = "(NAISSANCE:)(*)($$)"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute
If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
ActiveWindow.Panes(2).Close
End If
If ActiveWindow.ActivePane.View.Type <> wdPrintView Then
ActiveWindow.ActivePane.View.Type = wdPrintView
End If
ActiveDocument.Range(Start:=Selection.Start, End:=Selection.Start). _
InsertBreak Type:=wdSectionBreakContinuous
Selection.Start = Selection.Start + 1
ActiveDocument.Range(Start:=Selection.End,
End:=Selection.End).InsertBreak _
Type:=wdSectionBreakContinuous
With Selection.PageSetup.TextColumns
.SetCount NumColumns:=2
.EvenlySpaced = True
.LineBetween = True
.Width = CentimetersToPoints(9.2)
.Spacing = CentimetersToPoints(0.6)
End With

Bon courage à tous

Ray


Bonsoir et bonne fin de semaine à tous,
Bon, je suis pas très sur, j'avoue avoir eu pas mal de mal à bricoler ça.
De plus j'espère vraiement que c'est ce dont tu a besoin.
Donc à condition que ça fonctionne aussi pour toi, je pense que d'aucun pourront critiquer ça positivement ;-).
--------------------------------
Sub TestRechercheTexteEtMiseEnTableauEpure()
With ActiveDocument.Content.Find
Selection.HomeKey Unit:=wdStory
Selection.Collapse Direction:=wdCollapseEnd
Selection.Find.ClearFormatting
Do While .Execute(FindText:="(Naissance:)(*)(Voyages)", MatchWildcards:=True, Wrap:=wdFindContinue) = True
Selection.Find.Text = "(Naissance:)(*)(Voyages)" ', MatchWildcards:=True, Wrap:=wdFindContinue) = True

Selection.Find.Replacement.Text = "^p1^t2^t3"
Selection.Find.Execute Replace:=wdReplaceOne
Selection.Move wdCharacter
Selection.Expand wdParagraph
Selection.ConvertToTable Separator:=wdSeparateByTabs, NumColumns:=3, _
NumRows:=1, AutoFitBehavior:=wdAutoFitFixed
With Selection.Tables(1)
.Style = "Grille du tableau"
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
Selection.Move wdCharacter

Loop
End With
End Sub
----------------------
Espérant t'avoir été utile.
Merci d'avoir lu jusque là.


"Raymond Poulain" a écrit dans le message de news:

Bonjour Geo,

Cela ne marche pas chez moi (j'ai essayé tes 2 propositions).
Veux-tu que je t'envoie par e-mail sous format txt l'ensemble de la macro ?
Note accessoire : avec macro automatique Word, je n'arrive pas à
sélectionner le texte avec la souris, alors...
Traitement manuel: je te comprend, mais si tu veux faire une edition
periodique (annuelle), est-tu toujours prêt?

A+

Merci

Ray


Bonjour 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.


Bien compris, mais quand on sait faire à la main, c'est d'autant plus
facile pour le faire en vba puisque l'enregistreur de macro fait le trvail.

Le bout de macro ne marche pas, mais le bug doit pouvoir être
corrigé, non ?


La première proposition que je t'ai faite focntionne, j'ai vérifié.

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.


Oui, bof, les deux se défendent.
Perso j'aurais plutôt traité le gros fichier et carrément à la main tant
que c'est possible, ça permet d'affiner si nécessaire, voire d'intervenir
sur le texte si nécessaire.
Par contre 600 pages (au moins) c'est un peu lourd, il faut une bonne
bécane et du temps.

--

A+














1 2