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 p>
Il est possible d'éviter une boucle infinie sans faire Voir cette image des colonnes en feuille1 p>
3 Réponses :
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
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 code> serait le moyen le plus rapide de itérer les cellules dans une plage code>, car une plage code> est essentiellement une collection de la plage CODE> Les objets et les collections d'objets sont mieux itératés avec pour chaque code>. Un pour ... Suivant code> 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 code> 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 i> sera plus rapide.
Lorsque vous utilisez Rechercher () dans une boucle, il est généralement plus facile de résumer que dans une méthode distincte:
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
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: p>
Ceci est le nouveau code: p>
Vous pouvez vérifier avec un
cheftif () code> 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