C'est mon premier post sur cette partie du forum de macro word, même si j'ai souvent participé au forum excel.
Mon problème est le suivant (note : je suis nulle en macro de Word).
J'ai une macro très très vieille sous MSWord 2000 qui fonctionne (j'ai vérifié).
Je voudrais la faire fonctionner sous MSWord 2007, voire la rapidifier en plus.
Donc j'ai fait un copié-collé de la vieille macro dans mon fichier sous docx et je l'ai fait tourner.
Mais cela buggue tout de suite en surlignant en jaune le code:
Code:
.Text = listeMots.Item(i)
Je joins les 2 fichiers en docx pour test.
J'ai aussi quelques détails à améliorer comme la suppression (puisque les 2 fichiers sont ouverts) du code parasite (si possible):
Et je voudrais aussi adapter la macro pour que les codes ne soient pas séparés par la marque de paragraphe (pi), mais par le caractère | (sans espace avant et après).
Enfin j'ai aussi quelques instructions à ajouter qui existent sous word 2000 dans d'autres macros et que je voudrais ajouter à la suite de la macro présente pour que le processus se déroule en une fois de A à Z.
Mais cela je le préciserai dans une 2ème étape.
Pouvez-vous m'aider à fixer le problème de cette 1ère étape?
Lorsque j'ai lu ton message (avant de partir en WE), je suis devenue si rouge que je suis sûre qu'il doit en rester des traces sur tous les écrans des forumistes.
Toutes mes excuses (cela montre mon ignorance de MSWord 2007, mais j'aurais dû penser que cela existait puisque je connaissais l'équivalent sur Excel 2007!).
J'attache les mêmes fichiers avec le suffixe docm (et plus docx), ainsi tu devrais pouvoir visualiser la macro dans l'un des 2 fichiers et faire le test.
Heureusement pour moi, la macro bugge également avec docm, donc le souci reste entier.
En te remerciant de ton aide!
Steph
Ps:
au moment d'envoyer ce message je m'aperçois que les fichiers docm sont invalides en attaché sur ce forum, donc:
-j'attache la macro en docx
-je ne peux attacher les 2 fichiers en docm mais ce sont les mêmes qu'en docx et tu pourras peut-être te "dépatouiller"
- je mets ci-dessous une copie de la macro (en docm pour les noms de fichiers) après l'avoir affichée sous word...
HTML:
Sub italics_taxa_final()
'
' italics_taxa_final Macro
'
'
Dim p As Paragraph
Dim listeMots As New Collection
Dim i As Long
Dim doc1, doc2 As String
doc1 = "fruits-pour-macro-Vba.docm"
doc2 = "codes.docm"
Documents.Open "D:\_Data\TransfertsTemp\codes.docm"
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
Tu as raison, c'est bien l'erreur d'exéc 5854 paramètre de chaîne trop long avec surligné en jaune:
text=listmots.item(i).
J'ai essayé de modifier la macro en remplaçant i=1 par i=0, mais là, j'ai:
erreur d'exéc 9, l'indice n'appartient pa sà la sélection.
Le lien vers un site en Anglais est trop dur pour moi.
Je te joins les 2 fichers en .zip en espérant que tu pourras tester.
stephsteph
J'ai déjà testé sinon comment aurais-je pu lire le message d'erreur ?
Ceci dit, il faudrait peut-être envisager de réécrire la macro pour Word 2007
Et pour ce faire , peux-tu, stp, détailler précisément ce que doit faire la macro.
(Ne lésines pas sur les détails et explications)
Je m'en doutais que tu avais testé!
Mais cela m'a permis de faire le processus que tu conseillais en zip.
La macro de base est toute bête, il s'agit de mettre en italique exactement les mots (entiers parfois séparés par un espace ou un point et un espace, la casse étant importante, et parfois avec des doublons) de codes.docm qui sont dans le texte de fruits-pour-macro-Vba.docm.
Bien sûr dans le fichier réel de texte il y a plus 1000 pages et le nombre de codes est supérieur à 3000.
Dans la macro actuelle, le séparateur de codes est le retour à la ligne (pi), dans la version 2007 il faudrait que ce soit le caractère "|".
Ensuite comme tu vois dans fruits-pour-macro-Vba.docm avec les séparateurs ajoutés (type <aaa>) il y aura d'autres traitements à faire mais sans qu'il y ait de boucle à coder, par exemble entre 2 <xxx> et </xxx>, il faudra créer une zone à 2 colonnes, ou après <yyy> il faudra créer un saut de page, ou bien entre <zzz> et </zzz> un formatage du texte (par exemple gras, 18 de taille, centré). Là aussi j'ai des bouts de codes qui fonctionnaient sous MSWord2000 et avec des séparateurs différents (parce que le texte était généré différemment par une macro VBA sur un fichier Excel2000, ce problème là, sur Excel 2007 est déjà réglé).
Voilà j'espère que je suis claire et sans ambiguités.
Je reviens avec 1000 exceuses.
J'ai commis une erreur dans le copier coller de la macro (c'est en voulant la refaire tourner sur MSWord 2000 que j'ai compris).
Ce n'est pas :
Donc Staple si tu as pitié de mes bourdes d'enervement, je reviens pour savoir si tu pouvais aider à régler les problèmes que j'ai cité avant...
- séparateur "|" dans codes et plus "paragraphe" (="pi")
- les nouvelles macros de formattage comme création de deux colonnes avec un ligne verticale centrale entre les séparateurs <2> et </2> ou de type de police entre <1> et </1> dans le texte principal (là dans ce cas, j'ai pu tester les bouts de programmes précédents et il ne marchent plus car d'autres choses ont changé entre temps).
Merci de poursuivre ce fil avec moi, c'est vraiment bien.
Je vais essayer de réduire mes ambitions en restant pratique.
Le remplacement des marques de paragraphes (pi) par '|' est trop compliqué (pour moi) et ta piste avec lien ne semble pas correspondre au cas particulier (je ne veux que la macro remplace l'un par l'autre, je voulais que la macro soit changée pour considérer les '|' au lieu des marques de paragraphes), donc j'oublie (il me suffira de faire manuellement le remplacement de '|' par '^p' avant la macro).
Le plus important est donc les formats sur le texte.
Par exemple avec les mises en 2 colonnes, j'ai semble-t-il déjà commis l'erreur d'utiliser des séparateurs avec < et > et selon le support Microsoft il ne faut pas (c'est compris comme des caractères génériques), donc j'ai remplacé dans mon texte <2> par $0$ et </2> par $1$ (des mots qui sont étrangers au contenu du texte, donc qui peuvent servir de séparateurs).
En me servant de mes bouts de codes précédents, j'ai bricolé le code ci-après et le résultat est qu'il fait bien la mise en forme en 2 colonnes, mais seulement pour la première occurrence (donc ma boucle ne marche pas) et ensuite il ne remplace pas $0$ et $1$ par rien après le formatage (j'ai aussi essayé avec .Replacement.Text = "\1", mais c'est pareil).
Au total je ne suis qu'une élève limitée !
En espérant que le "maître" corrigera !
A+ Steph
Code:
Sub format()
Dim iMax As Integer
i = 0
Do While i < iMax + 1
With Selection.Find
.Text = "($0$)(*)($1$)"
.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
i = i + 1
Loop
End Sub
ma piste était surtoutune invitation explicite* à faire chauffer ton moteur de recherche.
Invitation à laquelle j'ajoute ce conseil:
axer tes recherches également sur le web anglophone (puisque VBA parle english, non ?)
*:
ou ailleurs sur le net
(C'est juste une histoire de mots-clés judicieusement choisis dans G..gle)
Tu as tout à fait raison.
C'est pour cela que, après maintes interrogations Google, la demande a été réduite au strict minimum, à savoir le bon fonctionnement de la boucle do while (le code a été inclus dans le précédent message).
Tous les autres soucis seront réglés manuellement (après tout, le fichier n'est traité qu'une fois par an).
Donc si tu pouvais régler cet os sur la boucle ce serait sûr sympa.
A+
Steph
stephsteph
Quel est la valeur de iMax ?
Car sauf erreur de ma part, tu le déclares mais ensuite ?
Sinon test ton code en mettant des espions et/ou utilisant Debug ou MsgBox pour voir la valeur de i
NB: Je précise que je suis plus doué en VBA sous Excel que sous Word, donc je ne te serai pas d'un grand secours contrairement à tatiak par exemple (qui aura peut-être la bonne idée de tomber sur ton fil )
Merci de ton aide et si tu n'est pas un expert c'est encore plus méritant.
Avec tes remarques je suis revenu sur la macro ancienne (qui ne fonctionne plus car le processus est maintenant très différent) et j'ai cherché des infos sur iMax puis sur NomF et j'ai ajouté un bout de code comme ci-après.
Le résultat est que maintenant la macro tourne (elle crée les 2 colonnes) mais seulement pour la première occurrence, pas pour les autres (pas de boucle).
Moi je suis dans la purée car je tatonne total.
Donc si tu peux faire d'autres remarques je veux bien essayer (le mieux serait bien sûr que l'expert que tu cites se réveille, je plaisante)...
L'autre option serait, si tu veux, de mettre le code complet de la précédente macro et que tu y retrouves tes "petits".
Si tu me dis "oui" je mets le code complet lors du prochain post.
A+, Steph
Code:
Sub test()
'
' test Macro
'
Dim NomF(10000) As String
Dim iMax As Integer
Do While i < iMax + 1
Selection.HomeKey Unit:=wdStory
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
NomF(i) = Selection.Text
Selection.HomeKey Unit:=wdStory
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.Delete
i = i + 1
Loop
i = 0
Do While i < iMax + 1
With Selection.Find
.Text = "($0$)(*)($1$)"
.Replacement.Text = "\2"
.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
i = i + 1
Loop
End Sub