[Catégorie modifiée .Net -> VBA] VBA Word2007 - Modifier la police selon conditi

Résolu
mouftie - 18 févr. 2013 à 20:14
 mouftie - 20 févr. 2013 à 16:00
Bonjour,
j'ai créé une macro pour récupérer mon code dans un document word pour rédiger ma doc applicative, en passant par la coloration syntaxique de http://charles.racaud.free.fr/code-syntaxing/index, mais les commentaires en verts sont avec une police de 7.5, ce qui est un peu petit pour moi.
Bon alors j'ai essayé un truc, mais je n'ai encore jamais fait de boucle avec vba Word, et quand je lance avec F8, j'ai une erreur incompatibilité de type sur ma ligne For each...

qq'1 peut-il corriger cette partie du code, que j'ai mis entre [] ('MeF des commentaires" svp (NB. je sais que le dim doit être mis après le sub)
Sub CollMacro() 
' Collage spécial Htlm 
    Selection.PasteAndFormat (wdPasteDefault) 
    Selection.Shading.Texture = wdTextureNone 
    Selection.Shading.ForegroundPatternColor = wdColorAutomatic 
' met un fond vert 
    Selection.Shading.BackgroundPatternColor = -704577690 
[]'MeF des commentaires 
Dim c As Variant 
    Selection.MoveUp Unit:=wdParagraph, Count:=1 
            Selection.Find.ClearFormatting 
For Each c In Paragraph    'je voudrais faire une boucle 
'pour chaque c dans le paragraphe en cours 
If c "^l'" Or c "^t'" Then 
'alors sélection de la ligne entière ou mieux jusqu'au prochain ^l 
    Selection.EndKey Unit:=wdLine, Extend:=wdExtend 
    Selection.Font.Size = 9.5 
    Selection.Font.Bold = wdToggle 
    Selection.EndKey Unit:=wdLine     '   arrêt de la sélection 
Next c []
'MeF des paragraphes 
    Selection.Find.ClearFormatting 
    With Selection.ParagraphFormat 
        .SpaceBefore = 0 
        .SpaceAfter = 0 
    End With 
    Selection.Find.Execute Replace:=wdReplaceAll 
    With Selection.Find 
        .Text = "^l" 
        .Replacement.Text = "^p" 
    End With 
    Selection.Find.Execute Replace:=wdReplaceAll 
    Selection.HomeKey Unit:=wdStory 
    Selection.Find.Execute Replace:=wdReplaceAll 
End Sub

Merci pour votre aide

11 réponses

C'est encore moi.

Je vous propose de rédiger un très court document Word, et de lui associer la macro suivante
Option Explicit

Sub Exemple()
Dim Rng As Range, Car As Range, Déb As Long, Fin As Long, r As Long, Msg As String
Set Rng = Selection.Range
With Rng
    Déb = .Start
    Fin = .End
End With
Msg = ""
For r = Déb To Fin
    With ActiveDocument
        Set Car .Range(r, r + 1): Msg Msg & Car.Text & vbCrLf
    End With
Next r
MsgBox Msg
End Sub

puis de la tester en ayant au préalable sélectionner une petite partie du document (une dizaine de caractères).
Je pense que vous pourriez ensuite vous en inspirer pour parcourir un paragraphe sélectionné?

Bon courage.


Étant illettré, je signe d'une croix : ×
3
Oui, merci, ça m'aide beaucoup ! c'est bien différent d'Excel entre naviguer avec des cellules ou des chaines de caractères (peut-être n'est-ce pas le bon terme...).
Néanmoins, avec votre aide et celle de Microsoft, je devrai au moins avancer.
Un grand merci pour votre patience.
pour délimiter mon "paragraphe", qui est déjà sélectionné, je cherchais un truc comme ActiveParagraph...
Encore merci.
3
Bonjour mouftie.

La déclaration
Dim c As Variant

montre déjà que vous êtes mal parti. Cela prouve en effet que vous ne connaissez pas le type d'un caractère. Pour parcourir les caractères d'un paragraphe
Par As Paragraph

vous formez d'abord un objet
Rng As Range

par l'instruction
Set Rng =  Par.Range

Rng représente la liste des caractères du paragraphe. Puis vous formez un objet
Cars As Characters

par l'instruction
Set Cars  = Rng.Characters

Cars représente la collection des caractères du paragraphe. Vous obtenez alors le caractère
Car As Range

de rang r du paragraphe par l'instruction
Set Car = Cars(r)

Bien entendu j'ai décomposé pour vous faire comprendre le détail des opérations, mais il est possible de compacter.

Cordialement.

Étant illettré, je signe d'une croix : ×
0
Bonsoir Zermelo,
Merci pour ta réponse détaillée, mais je n'ai pas du tout comprendre quand même...
ça bug sur Set Rgn = Par.range au motif variable objet ou de bloc with non défini.
Voilà où j'en suis :
'MeF des commentaires
Dim c As Variant
Dim Par As Paragraph
Dim Rng As Range  'Liste des caractères du paragraphe
Dim Cars As Characters    'Cars représente la collection des caractères du paragraphe

      Set Rng = Par.Range
      Set car = Cars(c)
    Selection.MoveUp Unit:=wdParagraph, Count:=1
            Selection.Find.ClearFormatting
'   For Each c In Paragraphs(1).Range    'je voudrais faire une boucle
'   For Each c In Paragraph
    For Each c In Paragraph
  'pour chaque c dans le paragraphe en cours
    If c.Text "^l'" Or c.Text "^t'" Then
  'alors sélection de la ligne entière ou mieux jusqu'au prochain ^l
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        Selection.Font.Size = 9.5
        Selection.Font.Bold = wdToggle
  'arrêt de la sélection
        Selection.EndKey Unit:=wdLine
          Exit For    'quitte la boucle

Merci pour ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonsoir.

Nous nous sommes très mal compris, mais je n'ai pas le temps d'expliquer cela maintenant. Je reviendrai un peu avant minuit.

À bientôt.


Étant illettré, je signe d'une croix : ×
0
Ok merci bonne soirée
0
Re.

Les indications que je vous ai données n'avaient pour but que de présenter les objets susceptibles de vous aider, ainsi que la façon dont ils s'enchaînent.
Il faut de plus les utiliser correctement. Il est normal que l'instruction
Set Rng = Par.Range

provoque une erreur, parce ce que l'objet Par, bien que déclaré, n'existe pas.
Reprenons la boucle qui pose problème
For Each c In Paragraph
.......................
Next c

mais sans nous occuper de son contenu. L'objet Paragraphe existe. Donc vous pouvez former l'objet Paragraphe.Range, puis l'objet Paragraphe.Range.Characters. Celui-ci sera une collection de caractères, qui sont de type Range. Voici donc la boucle que vous pouvez former,
Dim c As Range, r As Long
For r = 1 To Paragraphe.Range.Characters.Count
    Set c = Paragraphe.Range.Characters(r)
    ......................................
Next r



Cordialement.

Étant illettré, je signe d'une croix : ×
0
Bonjour zermelo,
for ne fonctionne tujours pas :
Dim c As Range, r As Long
For r = 1 To Paragraphe.Range.Characters.Count
    Set c = Paragraphe.Range.Characters(r)
  'pour chaque c dans le paragraphe en cours
    Selection.MoveUp Unit:=wdParagraph, Count:=1
            Selection.Find.ClearFormatting
    If c.Text "^l'" Or c.Text "^t'" Then
  'alors sélection de la ligne entière ou mieux jusqu'au prochain ^l
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        Selection.Font.Size = 9.5
        Selection.Font.Bold = wdToggle
  'arrêt de la sélection
        Selection.EndKey Unit:=wdLine
          Exit For    'quitte la boucle
    End If
Next r
au motif erreur 424 - Objet requis.
je me débrouille un peu avec vba excel, mais c'est ma 1ère boucle sous vba word...
je ne vois même pas de quel objet vba parle...
0
Bonjour mouftie.

Désolé, j'ai fait une faute de frappe. Il faut remplacer Paragraphe par Paragraph, l'objet que vous mentionnez dans la boucle
For Each c In Paragraph
.......................
Next c

et qui est donc censé exister (c'est de votre ressort). Mais il est évident qu'il n'existe pas d'objet nommé Paragraphe.
Bien sûr, je n'ai pas commis exprès cette faute de frappe. Mais cela a au moins l'intérêt de vous montrer qu'il faut faire très attention à ce genre de chose.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
Je suis vraiment désolée d'insister, mais, même sans le e, j'ai toujours le même motif d'erreur au même endroit.
For r = 1 To Paragraph.Range.Characters.Count
'erreur 424 - Objet requis.
Merci
0
Vous avez raison d'insister.
Il est alors probable que l'objet Paragraph n'existe pas. Dans votre code initial, rien n'indique que vous l'ayez construit. Il y a seulement le commentaire
je voudrais faire une boucle pour chaque c dans le paragraphe en cours

Qu'entendez-vous exactement par paragraphe en cours ? Il ne suffit pas d'écrire Paragraph pour que cela crée un objet de type Paragraph. D'une manière générale, pour qu'une macro agisse sur une partie d'un texte Word, il faut que cette partie soit sélectionnée. On peut alors la récupérer et la traiter. Il est temps, je crois, que vous étudiez en profondeur l'explorateur d'objets de VBA.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
Rejoignez-nous