OVH Cloud OVH Cloud

Macro VBA Word bancale

9 réponses
Avatar
Raymond Poulain
Bonjour,

Je veux faire une macro simple (ci-dessous) avec une boucle, mais je me
plante tout le temps.
Y-a-t-il quelqu'un pour me corriger ?
Merci... ce serait vraiment sympa (et dé-stressant)
Raymond

Le principe de la macro (située dans "1-Cumul-avantmodif.doc") est d'appeler
un autre fichier Word "1-List-taxa.doc" qui contient une liste de plus de
4500 mots séparés chacun par un paragraphe (pi), de sélectionner le premier
mot (qui devient la variable "NomF"), de revenir à "1-Cumul-avantmodif.doc"
et de remplacer ce mot variable par lui-même dans tout le fichier (en
respectant la casse, mot entier), mais en italique, et ainsi de suite jusqu'à
la fin de la liste de mots (chaque mot et chaque signe de paragraphe (pi)
sont éffacés au fur et à mesure).
Pour bien préciser, voici le début de "1-List-taxa.doc":
churchill(pi)
degaulle(pi)
eisenhower(pi)
pétain(pi)


Sub italiques_taxa()
'
' italiques_taxa Macro
' Macro enregistrée le 12/03/05
'
Dim NomF(5000) As String
Dim iMax As Integer

Windows("1-List-taxa.doc").Activate

i = 0
Do While True
NomF(0) = Dir
If NomF(0) = "" Then Exit Do
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
NomF(0) = Dir(Selection)
Selection.Cut
Selection.Delete Unit:=wdCharacter, Count:=1
Windows("1-Cumul-avantmodif.doc").Activate
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "NomF(0)"
.Replacement.Text = "NomF(0)"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.HomeKey Unit:=wdStory
i = i + 1
Loop
iMax = i
End Sub

9 réponses

Avatar
Geo
Bonjour Raymond


Bonjour,

Je veux faire une macro simple (ci-dessous) avec une boucle, mais je
me plante tout le temps.


Si tu pouvais dire où et avec quel message ?

Déjà :

Do While True


Do tout seul suffit

NomF(0) = Dir
If NomF(0) = "" Then Exit Do


Fait passer au répertoire suivant et tu sors s'il n'y en a plus.
Sauf erreur de ma part il faut aussi tester . et .. qui ne sont pas de
vrais répertoires.

Mais je comprends pas bien la logique

NB si tu as l'intention de remplacer De Gaulle par Pétain, ça va faire du
bruit !

--

A+

Avatar
Raymond Poulain
Bonjour Geo,

Les 2 fichiers Word sont dans le même répertoire, donc pas de souci.
Je ne remplace pas Degaulle par Pétain, mais Degaulle par le même mot, mais
en italiques, et Petain, idem par de l'italique. C'est du formatage. Cela me
prendrait des heures à la main, d'où le Vba (d'autant que le fichier "cumul"
s'actualise régulièrement et qu'il faudrait tout recommencer à la main
souvent).

J'espère que tu peux me piloter précisément, car je suis trop énervé (vener!).

A+

Ray





Bonjour Raymond


Bonjour,

Je veux faire une macro simple (ci-dessous) avec une boucle, mais je
me plante tout le temps.


Si tu pouvais dire où et avec quel message ?

Déjà :

Do While True


Do tout seul suffit

NomF(0) = Dir
If NomF(0) = "" Then Exit Do


Fait passer au répertoire suivant et tu sors s'il n'y en a plus.
Sauf erreur de ma part il faut aussi tester . et .. qui ne sont pas de
vrais répertoires.

Mais je comprends pas bien la logique

NB si tu as l'intention de remplacer De Gaulle par Pétain, ça va faire du
bruit !

--

A+





Avatar
Geo
Bonjour Raymond


J'espère que tu peux me piloter précisément, car je suis trop énervé


T'inquiète pas mais ne sois pas trop pressé,
ça dépend des gens qui sont devant leutr micro.
Tu as oublié de dire sur quelle ligne ça se plante et le message affiché !
--

A+

Avatar
Bonjour et merci Raymond,
Merci car je me suis bien amusé et j'ai fait quelque chose que je ne pensais pas pouvoir faire ! Donc MERCI.
J'espère que ça peut être utile, étant sur la raisonnance AMIS ce soir j'ai pensé que peut être on pourrait éviter la macro si j'ai
bien compris ce que tu veux faire.
Essayer édition rechercher remplacer, clique sur le bouton Plus coche "Utiliser les caractères génériques" dans rechercher tu mets :
<[!a-z]*> dans remplacer tu mets ^& et tu cliques sur le bouton Format/Police choix Italique.... Ca devrait faire, bon je vais voir
si je peux affiner parce qu'évidement ça trouve aussi les mots en majuscule en début de phrase ! Mais ça balaye tous les nom propres
en partant du principe que tu a mis une majuscule.

Espérant donc en plus que ça peut t'être utile.
Merci d'avoir lu jusque là.


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

Bonjour Geo,

Les 2 fichiers Word sont dans le même répertoire, donc pas de souci.
Je ne remplace pas Degaulle par Pétain, mais Degaulle par le même mot, mais
en italiques, et Petain, idem par de l'italique. C'est du formatage. Cela me
prendrait des heures à la main, d'où le Vba (d'autant que le fichier "cumul"
s'actualise régulièrement et qu'il faudrait tout recommencer à la main
souvent).

J'espère que tu peux me piloter précisément, car je suis trop énervé (vener!).

A+

Ray





Bonjour Raymond


Bonjour,

Je veux faire une macro simple (ci-dessous) avec une boucle, mais je
me plante tout le temps.


Si tu pouvais dire où et avec quel message ?

Déjà :

Do While True


Do tout seul suffit

NomF(0) = Dir
If NomF(0) = "" Then Exit Do


Fait passer au répertoire suivant et tu sors s'il n'y en a plus.
Sauf erreur de ma part il faut aussi tester . et .. qui ne sont pas de
vrais répertoires.

Mais je comprends pas bien la logique

NB si tu as l'intention de remplacer De Gaulle par Pétain, ça va faire du
bruit !

--

A+







Avatar
Raymond Poulain
Bonjour Geo

Merci de ces encouragements !
Le moteur de génération de Macro automatique marche très bien, mais pour les
boucles, c'est la galère (il faudrait suggérer à MS d'améliorer son moteur
avec un assistant qui propose d'aider à creér une boucle si on fait 2 fois,
par exemple, la même manip dans une macro...).

Bon pour le présent:

L'exécution pas à pas de ma macro (avec ou sans "while true") plante au même
endroit.
Nom F(0)= Dir (alors surligné en jaune)

avec le message : " Erreur d'exécution 5. Argument ou appel de procédure
incorrect".

Merci !

A+

Ray


Bonjour Raymond


J'espère que tu peux me piloter précisément, car je suis trop énervé


T'inquiète pas mais ne sois pas trop pressé,
ça dépend des gens qui sont devant leutr micro.
Tu as oublié de dire sur quelle ligne ça se plante et le message affiché !
--

A+





Avatar
Raymond Poulain
Bonjour @pollo,

Désolé, ce n'est pas mon blem. Je veux créer une macro c'est-à-dire un petit
programme qui fait la manip que tu as décrite automatiquement 4500 fois en
boucle à aprtit d'une liste dans un autre fichier, voilà le "trip".

Bon courage

Ray


Bonjour et merci Raymond,
Merci car je me suis bien amusé et j'ai fait quelque chose que je ne pensais pas pouvoir faire ! Donc MERCI.
J'espère que ça peut être utile, étant sur la raisonnance AMIS ce soir j'ai pensé que peut être on pourrait éviter la macro si j'ai
bien compris ce que tu veux faire.
Essayer édition rechercher remplacer, clique sur le bouton Plus coche "Utiliser les caractères génériques" dans rechercher tu mets :
<[!a-z]*> dans remplacer tu mets ^& et tu cliques sur le bouton Format/Police choix Italique.... Ca devrait faire, bon je vais voir
si je peux affiner parce qu'évidement ça trouve aussi les mots en majuscule en début de phrase ! Mais ça balaye tous les nom propres
en partant du principe que tu a mis une majuscule.

Espérant donc en plus que ça peut t'être utile.
Merci d'avoir lu jusque là.


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

Bonjour Geo,

Les 2 fichiers Word sont dans le même répertoire, donc pas de souci.
Je ne remplace pas Degaulle par Pétain, mais Degaulle par le même mot, mais
en italiques, et Petain, idem par de l'italique. C'est du formatage. Cela me
prendrait des heures à la main, d'où le Vba (d'autant que le fichier "cumul"
s'actualise régulièrement et qu'il faudrait tout recommencer à la main
souvent).

J'espère que tu peux me piloter précisément, car je suis trop énervé (vener!).

A+

Ray





Bonjour Raymond


Bonjour,

Je veux faire une macro simple (ci-dessous) avec une boucle, mais je
me plante tout le temps.


Si tu pouvais dire où et avec quel message ?

Déjà :

Do While True


Do tout seul suffit

NomF(0) = Dir
If NomF(0) = "" Then Exit Do


Fait passer au répertoire suivant et tu sors s'il n'y en a plus.
Sauf erreur de ma part il faut aussi tester . et .. qui ne sont pas de
vrais répertoires.

Mais je comprends pas bien la logique

NB si tu as l'intention de remplacer De Gaulle par Pétain, ça va faire du
bruit !

--

A+












Avatar
Kamel
Essaye cela peut etre est-ce une solution. Colle ce code dans le fichier
1-Cumul-avantmodif. Tu dois renseigner le chemin du fichier 1-List-taxa qui
s'ouvre automatiquement.

Sub test()
Dim p As Paragraph
Dim listeMots As New Collection
Dim i As Long
Dim doc1, doc2 As String

doc1 = "1-List-taxa"
doc2 = "1-Cumul-avantmodif"

Documents.Open "spécifie le chemin du fichier 1-List-taxa"

For Each p In Documents(doc1).Paragraphs
If Left(p.Range.Text, Len(p.Range.Text) - 1) <> "" Then _
listeMots.Add Left(p.Range.Text, Len(p.Range.Text) - 1)
Next

Documents(doc2).Activate

For i = 1 To listeMots.Count
Selection.Find.ClearFormatting
With Selection.Find
.Text = listeMots.Item(i)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Do While Selection.Find.Execute = True
Selection.Font.Italic = True
Loop
Next i
End Sub

Kamel

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

Je veux faire une macro simple (ci-dessous) avec une boucle, mais je me
plante tout le temps.
Y-a-t-il quelqu'un pour me corriger ?
Merci... ce serait vraiment sympa (et dé-stressant)
Raymond

Le principe de la macro (située dans "1-Cumul-avantmodif.doc") est
d'appeler
un autre fichier Word "1-List-taxa.doc" qui contient une liste de plus de
4500 mots séparés chacun par un paragraphe (pi), de sélectionner le
premier
mot (qui devient la variable "NomF"), de revenir à
"1-Cumul-avantmodif.doc"
et de remplacer ce mot variable par lui-même dans tout le fichier (en
respectant la casse, mot entier), mais en italique, et ainsi de suite
jusqu'à
la fin de la liste de mots (chaque mot et chaque signe de paragraphe (pi)
sont éffacés au fur et à mesure).
Pour bien préciser, voici le début de "1-List-taxa.doc":
churchill(pi)
degaulle(pi)
eisenhower(pi)
pétain(pi)


Sub italiques_taxa()
'
' italiques_taxa Macro
' Macro enregistrée le 12/03/05
'
Dim NomF(5000) As String
Dim iMax As Integer

Windows("1-List-taxa.doc").Activate

i = 0
Do While True
NomF(0) = Dir
If NomF(0) = "" Then Exit Do
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
NomF(0) = Dir(Selection)
Selection.Cut
Selection.Delete Unit:=wdCharacter, Count:=1
Windows("1-Cumul-avantmodif.doc").Activate
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "NomF(0)"
.Replacement.Text = "NomF(0)"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.HomeKey Unit:=wdStory
i = i + 1
Loop
iMax = i
End Sub



Avatar
Geo
Bonjour Raymond Poulain


L'exécution pas à pas de ma macro (avec ou sans "while true") plante
au même endroit.
Nom F(0)= Dir (alors surligné en jaune)

avec le message : " Erreur d'exécution 5. Argument ou appel de
procédure incorrect".


La commande Dir toute seule
lit le répertoire *suivant*
Il faut donc un précédent.

Normalement on fait :
Nom = dir(Monchemin et mon filtre sur les noms et ou les attributs)
Do while tant que nom n'est pas vide
traiter le fichier Nom
Nom = Dir
Boucler

Tu as des exemples dans l'aide, évidemment pas exactement le même, mais ça
donne des idées.
Ceci dit je me suis parfois arraché les cheveux sur ce type de traitement
et je n'ai jamais compris pourquoi ça ne marchait pas dans certains cas.
Une solution très élégante est dans la faq : la batchmacro d'anacoluthe.
--

A+

Avatar
Raymond Poulain
Bonjour Kamel,

Merci beaucoup. Tout baigne. Tu es une bête de VBA !
A+
Ray


Essaye cela peut etre est-ce une solution. Colle ce code dans le fichier
1-Cumul-avantmodif. Tu dois renseigner le chemin du fichier 1-List-taxa qui
s'ouvre automatiquement.

Sub test()
Dim p As Paragraph
Dim listeMots As New Collection
Dim i As Long
Dim doc1, doc2 As String

doc1 = "1-List-taxa"
doc2 = "1-Cumul-avantmodif"

Documents.Open "spécifie le chemin du fichier 1-List-taxa"

For Each p In Documents(doc1).Paragraphs
If Left(p.Range.Text, Len(p.Range.Text) - 1) <> "" Then _
listeMots.Add Left(p.Range.Text, Len(p.Range.Text) - 1)
Next

Documents(doc2).Activate

For i = 1 To listeMots.Count
Selection.Find.ClearFormatting
With Selection.Find
.Text = listeMots.Item(i)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Do While Selection.Find.Execute = True
Selection.Font.Italic = True
Loop
Next i
End Sub

Kamel

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

Je veux faire une macro simple (ci-dessous) avec une boucle, mais je me
plante tout le temps.
Y-a-t-il quelqu'un pour me corriger ?
Merci... ce serait vraiment sympa (et dé-stressant)
Raymond

Le principe de la macro (située dans "1-Cumul-avantmodif.doc") est
d'appeler
un autre fichier Word "1-List-taxa.doc" qui contient une liste de plus de
4500 mots séparés chacun par un paragraphe (pi), de sélectionner le
premier
mot (qui devient la variable "NomF"), de revenir à
"1-Cumul-avantmodif.doc"
et de remplacer ce mot variable par lui-même dans tout le fichier (en
respectant la casse, mot entier), mais en italique, et ainsi de suite
jusqu'à
la fin de la liste de mots (chaque mot et chaque signe de paragraphe (pi)
sont éffacés au fur et à mesure).
Pour bien préciser, voici le début de "1-List-taxa.doc":
churchill(pi)
degaulle(pi)
eisenhower(pi)
pétain(pi)


Sub italiques_taxa()
'
' italiques_taxa Macro
' Macro enregistrée le 12/03/05
'
Dim NomF(5000) As String
Dim iMax As Integer

Windows("1-List-taxa.doc").Activate

i = 0
Do While True
NomF(0) = Dir
If NomF(0) = "" Then Exit Do
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
NomF(0) = Dir(Selection)
Selection.Cut
Selection.Delete Unit:=wdCharacter, Count:=1
Windows("1-Cumul-avantmodif.doc").Activate
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "NomF(0)"
.Replacement.Text = "NomF(0)"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.HomeKey Unit:=wdStory
i = i + 1
Loop
iMax = i
End Sub