Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Word Erreur d'exécution

Marine_blatz

XLDnaute Nouveau
Bonjour à tous j'ai une erreur lors de l'exécution de ce code quelqu'un sais til pourquoi ?
Voir code et capture ci contre

VB:
Sub rapport_provisoire_entete()

Dim Prgrf As Paragraph
Dim reg As New VBScript_RegExp_55.RegExp, Match As VBScript_RegExp_55.Match
Dim Matches As VBScript_RegExp_55.MatchCollection

    Set reg = New VBScript_RegExp_55.RegExp
    reg.Pattern = "(rapport)( )(\d{2})"
    reg.Global = True
    For Each Prgrf In ThisDocument.Sections(1).Headers(1).Range.Paragraphs
        If InStr(Prgrf.Range.Text, "rapport") Then
            Set Matches = reg.Execute(Prgrf.Range.Text)
            For Each Match In Matches
                Remplace_dans_Header 1, 1, Match.Value, "rapport provisoire"
            Next Match
        End If
    Next Prgrf
End Sub


Sub Remplace_dans_Header(Sct As Byte, Hdr As Byte, S1 As String, S2 As String)
    With ThisDocument.Sections(Sct).Headers(Hdr).Range.Find
        .Text = S1
        .Forward = False
        .Execute
        If .Found Then .Parent.Text = S2
    End With
End Sub
 

Pièces jointes

  • Capture.PNG
    47 KB · Affichages: 30

Staple1600

XLDnaute Barbatruc
Bonjour

Si cela fonctionne !
Puisque j'ai fait le test
Le cadre c'est moi qui l'est ajouté dans Paint pour te montrer le AVANT macro et le APRES macro.

Reproduit mon test et tu verras que cela fonctionne.

Dans un document de 2,3 pages ajoutes sur texte "bidon" sur chaque page
Puis insères un entête égal à : rapport 16
Lances la macro du message#1 (en ayant pris soin d'activer la bonne référence)
Tu auras comme résultat : rapport provisoire
dans les entêtes des pages du document
 

Marine_blatz

XLDnaute Nouveau
Sur ma capture du message 17 c'est mon entête peu être ne repond t-elle pas auc criteres d'execution
 

Staple1600

XLDnaute Barbatruc
Re

Tu ne lis pas mes messages attentivement
Reproduis simplement mon test tel quel
Juste pour voir que dans les conditions que je décris, ton code fonctionne
Dans mon exemple; j'ai écrit: rapport 16
et pas RAPPORT N°:3439 etc...

Ton pattern est rédigé pour trouvé seulement deuxchiffres
reg.Pattern = "(rapport)( )(\d{2})"

C'est pour cela qu'il fonctionne avec mon exemple : rapport 16

Et j'ai testé sans qu'il y ait de tableau dans l'entête.
 

Staple1600

XLDnaute Barbatruc
Re

Lance ces deux tests, et tu comprendras ce que je veux dire
VB:
Sub test_OK()
Dim Chaine$
Chaine = "rapport 16"
 With CreateObject("VBScript.RegExp")
    .Pattern = "(rapport)( )(\d{2})"
    vTest = .test(Chaine)
 End With
 MsgBox vTest
End Sub
Sub test_PASOK()
Dim Chaine$
Chaine = "RAPPORT N°: 3939393"
 With CreateObject("VBScript.RegExp")
    .Pattern = "(rapport)( )(\d{2})"
    vTest = .test(Chaine)
 End With
 MsgBox vTest
End Sub
Le test_OK renvoie VRAI car rapport 16 respecte le pattern
La seconde renvoie FAUX car pattern non respecté.
 

Marine_blatz

XLDnaute Nouveau
Tu peux mettre cette macro dans ce document ?
Je comprend rien de rien deux semaines que j'essaye

je recapitule la macro doit changer "RAPPORT N°: 343939393992" par "RAPPORT N°: PROVISOIRE" et ceux quelque que soit le numéro soulignié
 

Pièces jointes

  • ENTETE TEST.docm
    25.5 KB · Affichages: 0

Staple1600

XLDnaute Barbatruc
Re

Je vais essayer d'être plus clair
1) Tu as fourni un code VBA issu d'un autre discussion
(qui utilises les expressions régulières)
Ce qu'on appelle un pattern est dans ton code
"(rapport)( )(\d{2})"
Ce qui veut dire qu'une chaine de caractère qui contient le mot rapport puis un espace puis un nombre de deux chiffres respectent les conditions
Ce qui est le cas pour rapport 16 ou rapport 39
Ce n'est pas le cas pour : RAPPORT N°: 343939393992
Donc il faut changer le pattern

Ensuite, il reste le problème que ton entête contient un tableau, ce qui complexifie les choses.
 

Staple1600

XLDnaute Barbatruc
Re

Alors en changeant d'optique
(test OK sur mon fichier de test)
VB:
Sub rapport_provisoire_entete()
Dim Prgrf As Paragraph
Dim reg As New VBScript_RegExp_55.RegExp, Match As VBScript_RegExp_55.Match
Dim Matches As VBScript_RegExp_55.MatchCollection
    Set reg = New VBScript_RegExp_55.RegExp
    reg.Pattern = "[^\D]+"
    reg.Global = False
    For Each Prgrf In ThisDocument.Sections(1).Headers(1).Range.Paragraphs
            Set Matches = reg.Execute(Prgrf.Range.Text)
            For Each Match In Matches
                Remplace_dans_Header 1, 1, Match.Value, "PROVISOIRE"
            Next Match
    Next Prgrf
End Sub

Sub Remplace_dans_Header(Sct As Byte, Hdr As Byte, S1 As String, S2 As String)
    With ThisDocument.Sections(Sct).Headers(Hdr).Range.Find
        .Text = S1
        .Forward = False
        .Execute
        If .Found Then .Parent.Text = S2
    End With
End Sub
NB: Entête simple (sans tableau inséré dans l'entête)
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…