0
votes

Sortie d'une "Trouver" boucle infinie

J'ai créé une boucle de faire avec la recherche pour remplacer "Hello" avec "hi" à l'intérieur de la colonne A de la feuille1, mais uniquement si la chaîne "xyz" n'est pas dans la même ligne de colonne B.

Quand trouver ne remplace pas "Hello", car dans la colonne B Il y a "xyz", nous entrons une boucle infinie car FindNext trouve toujours "bonjour" dans la colonne 1

Il est possible d'éviter une boucle infinie sans faire Boucle tandis que très compliqué?

Voir cette image des colonnes en feuille1 xxx


2 commentaires

Vous pouvez vérifier avec un cheftif () pour voir si "XYZ" est dans la même ligne et travaille de là?


Le code que j'ai téléchargé est une simplification du vrai. Il ne serait pas possible d'utiliser Countif () dans mon code réel. Merci Bruce


3 Réponses :


0
votes

Vous pouvez essayer ceci:

Option Explicit

Sub CallMask()
    Call Masks("Hello", "XYZ", "Hi")
End Sub

Sub Masks(sMask_I As String, sNoReplace_I As String, Replacement As String)
    Dim C As Range
    With ThisWorkbook.Sheets("Sheet1")
        For Each C In .Range("A1", "A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
            If C Like "*" & sMask_I & "*" And C.Offset(0, 1) <> sNoReplace_I Then
                C.Replace sMask_I, Replacement
            End If
        Next C
    End With

End Sub


4 commentaires

Merci Damian, votre code fonctionne très bien mais utilise la prochaine boucle et est très lent. C'est pourquoi je veux utiliser la méthode de la recherche


Malamare pour la prochaine boucle est la plus rapide lorsque vous travaillez avec des cellules. Si vous le souhaitez plus vite, vous pourriez le faire avec des tableaux, ce serait bien plus rapide.


Pour des performances plus rapides, copiez la plage dans un tableau, utilisez-le sur la matrice, puis renvoyez le tableau sur la plage. Basé sur votre commentaire, vous devez travailler avec beaucoup de lignes - donc cela fera une différence notable.


@Malamare pour chaque serait le moyen le plus rapide de itérer les cellules dans une plage , car une plage est essentiellement une collection de la plage Les objets et les collections d'objets sont mieux itératés avec pour chaque . Un pour ... Suivant La boucle est beaucoup plus rapide pour les tableaux d'itération - dans tous les cas, tout code qui interagit avec les cellules d'une boucle sera beaucoup plus lent qu'il ne doit être. Envisagez de copier les valeurs de cellule dans un tableau et en utilisant un pour en boucle pour itérer la matrice à la place; Modifiez la matrice en place, puis remplacez toutes les cellules avec le contenu de la matrice dans une seule opération de rédaction de feuille de calcul. que sera plus rapide.



0
votes

Lorsque vous utilisez Rechercher () dans une boucle, il est généralement plus facile de résumer que dans une méthode distincte: xxx


1 commentaires

Merci tim! Votre code fonctionne bien pour moi. Seulement changer "C.Offset (0, 3) .Value" par la référence à "HI". SI N'EST PAS DES RETOURS OFFAGE "" Sauf dans la première rangée



0
votes

J'ai testé avec des tableaux comme suggéré par Damian, AJD et Mathieu. C'est le code le plus rapide.

fois pour 1600 rangées sont:

  1. mon nouveau code avec tableaux: 8 ms
  2. Code Damian avec pour le prochain: 132 ms
  3. Le code avec "méthode distincte" de Tim Williams: 402 MS
  4. Mon premier code avec Trouver: 511 MS

    Ceci est le nouveau code: xxx


0 commentaires