Problème avec .find

Problème avec .find - VB/VBA/VBS - Programmation

Marsh Posté le 09-08-2006 à 09:40:50    

Bonjour,
J'ai un problème avec le find...je m'explique je voudrais simplement remplacer ds un texte la suite de caractère "&&" par un nombre [1] puis [2]....et c'est ça le problème j'incrémente un compteur et je dois remplacer la cha9ne de caractère par un nombre différent à chaque fois.
Le problème c'est que mon code me remplace bien les "&&" avec un nombre qui s'incrémente ms c pas ds l'ordre, par exemple le 2 premiers serotn 1 et 2 puis ça va de 2 en 2, donc le 4 eme à la valeur 3 etc..enfin c'est n'impoorte quoi!!
Si vous avez déjà rencontré ce problème...please give me a solution!!!  
Merci

Reply

Marsh Posté le 09-08-2006 à 09:40:50   

Reply

Marsh Posté le 09-08-2006 à 11:14:03    

:heink: Bizarre en effet... Mais find() c'est pas super super comme fonction.
Tu as regardé ce topic : http://forum.hardware.fr/hardwaref [...] 3792-1.htm ?
Regardes mon dernier post dessus, ça peut être utile.

Reply

Marsh Posté le 09-08-2006 à 11:56:51    

je viens de trouver le problème ct tout con....Bon mtnt autre question (ms je vais créer un nouveau message)  
Je veux remplacer des mots et pour cela je fais une boucle While..et j'ai rien trouvé de bien pour m'arrêter.While i <> ActiveDocument.Words.Count n'est pas efficace car il y a trop de mots ds mon document.Il faudrait un truc du genre While (!EOF) ms ça n'existe pas en VB.
T'as une idée?

Reply

Marsh Posté le 09-08-2006 à 13:26:41    

Un peu en retard mais inspiré du Delete Crochets si cela peut rendre service


Option Explicit
 
Private Function FindReplace(Chaine As String) As String
Dim Pos As Long, Taille As Long
Dim strR As String, strL As String, Str As String
Dim Cpt As Long, Ch As String
Dim ChRecherchée As String
 
    Cpt = 0
    ChRecherchée = "&&"
 
    Do
        Pos = InStr(Chaine, ChRecherchée )
        Taille = Len(Chaine)
        If Pos > 0 Then
            Cpt = Cpt + 1
            Ch = "[" & Cpt & "]"
            strL = Left(Chaine, Pos - 1)
            strR = Right(Chaine, Taille - Pos - Len(ChRecherchée) + 1)
             
            Str = strL & Ch & strR
            Chaine = Str
        End If
    Loop Until Pos = 0
 
    Application.StatusBar = "Nb Remplacement : " & Cpt
    FindReplace = Chaine
End Function
 
 
Public Sub Remplacer()
Dim Str As String
    ActiveDocument.Select
    Str = Selection
    Selection = FindReplace(Str)
    Application.ScreenRefresh
End Sub


Message édité par kiki29 le 09-08-2006 à 13:58:57
Reply

Marsh Posté le 09-08-2006 à 14:15:42    

merci ms je vais mieux t'expliquer mon problème...
Je te montre mon code je pense que c plus rapide au niveau exécution:
 
Sub add_ID(ref As Integer)
 
Selection.Find.ClearFormatting
 
reference = ref
 
With Selection.Find
    While i <> ActiveDocument.Words.Count
        .Forward = True
        .ClearFormatting
        .MatchWholeWord = True
        .MatchCase = False
        .Wrap = wdFindStop
        .Execute FindText:="&&"
         
        If Selection.text = "&&" Then
            Selection.Delete
            Selection.InsertBefore ("[" & reference & "]" )
            Selection.Style = "monStyle"
            Selection.Font.Color = wdColorRed
            Selection.Font.Underline = wdUnderlineNone
            Selection.Font.Bold = True
            reference = reference + 1
        End If
         
    i = i + 1
    refTotal = reference - 1
    Wend
End With
 
End Sub
 
ça ça marche, mon problème est de le modifier pour que la boucle s'arrête dès qu'il n'y a plus rien à remplacer.


Message édité par acorsa le 09-08-2006 à 14:19:35
Reply

Marsh Posté le 09-08-2006 à 16:10:48    

Eh bien au niveau temps y'a pas photo : sur un doc bidon de 94 pages le mien : 0.6 s, ton code 19 s,sans compter qu'il ne fonctionne pas correctement

Reply

Marsh Posté le 09-08-2006 à 16:37:55    

Maintenant les temps sont comparables et ton code fonctionne correctement, reste peut etre à l'optimiser


Sub add_ID(ref As Long)
Dim Reference As Long, RefTotal As Long
     
    ActiveDocument.Select
    Selection.Find.ClearFormatting
    Reference = ref
 
    With Selection.Find
        .Execute FindText:="&&"
        If Selection.Find.Found = False Then Exit Sub
        With Selection
            .Delete
            .InsertBefore ("[" & Reference & "]" )
            .Style = "monStyle"
            .Font.Color = wdColorRed
            .Font.Bold = True
            .MoveRight Unit:=wdCharacter, Count:=1
            Reference = Reference + 1
        End With
         
        While Selection.Find.Found = True
            .Forward = True
            .ClearFormatting
            .MatchWholeWord = True
            .MatchCase = False
            .Wrap = wdFindStop
            .Execute FindText:="&&"
            If Selection.Find.Found = True Then
                With Selection
                    .Delete
                    .InsertBefore ("[" & Reference & "]" )
                    .Style = "monStyle"
                    .Font.Color = wdColorRed
                    .Font.Bold = True
                    .MoveRight Unit:=wdCharacter, Count:=1
                    Reference = Reference + 1
                End With
            End If
            RefTotal = Reference - 1
        Wend
    End With
End Sub


Message édité par kiki29 le 09-08-2006 à 16:54:51
Reply

Marsh Posté le 09-08-2006 à 16:50:11    

Alors là....chapeau!!!
Je te remercie vraiment...tu me donne de quoi bien terminer ma journée!!!
Merci beaucoup!

Reply

Marsh Posté le 09-08-2006 à 16:54:06    

Bon là je viens de tester et retester sur des gros fichiers et je me dois de te re-remercier!!!
C'est là qu'on voit les pros qd même!!!
Merci!

Reply

Marsh Posté le 09-08-2006 à 16:55:54    

Je viens de rajouter après ton post dans le code un :


       If Selection.Find.Found = False Then Exit Sub  


 
après le 1er .execute
 


    With Selection.Find  
        .Execute FindText:="&&"  
        If Selection.Find.Found = False Then Exit Sub  <<<<<<<<<<<
        .....


Message édité par kiki29 le 09-08-2006 à 17:51:02
Reply

Marsh Posté le 09-08-2006 à 16:55:54   

Reply

Marsh Posté le 09-08-2006 à 18:01:22    

pkoi ça marchait très bien?

Reply

Marsh Posté le 09-08-2006 à 19:03:42    

Essaie sans en moulinant 2 fois le même fichier ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed