Deux boucles For

Bonjour à tous,

Dans le fichier ci-joint, j'ai essayé d'établir une macro VBA avec deux boucles For.

L'objectif est de vérifier si la valeur de la feuille 1 existe dans la feuille 2.

Sauf que le résultat de la macro est faux.

Pourriez-vous m'aider à voir ce qui ne va pas dans ma boucle, s'il vous plaît?

Merci par avance pour votre aide.

14book1.xlsm (63.34 Ko)

Bonjour,

Moi ça me semble au contraire très juste sauf que ça s'arrête à 1000...

Pour te le prouver j'ai remplacer VRAI par ce qui a été trouvé en feuil2 et FAUX par... rien du tout...

Le résultat en pièce jointe.

Bien sur sur de grosses quantités de lignes on n'utiliserait pas une méthode aussi rustique mébon si on n'est pas pressé celle ci peux convenir malgré tout.

A+

12book1-vg.xlsm (68.82 Ko)

Bonjour @galopin01,

Merci pour votre réponse.

Bien sur sur de grosses quantités de lignes on n'utiliserait pas une méthode aussi rustique mébon si on n'est pas pressé celle ci peux convenir malgré tout.

Votre remarque ci-dessus m'a interpellée.

Pour tester ma macro, j'ai effectivement fixé le nombe de lignes à 1000 mais en réalité le nombre de ligne peux croître jusqu'à 10 000 lignes.

Pourriez-vous me dire dans ce cas là comment optimiser mon code lorsque j'aurai un nombre de lignes important, svp?

Ou bien quelle autre solution pourriez-vous me suggérer?

Merci par avance pour votre aide.

Salut Black_Hole, Salut le forum,

essaie avec cette macro

Sub VerifierExistance()
Dim x As Worksheet, y As Worksheet
Dim rng As Range
Dim iLast As Long
Dim iCounter As Integer

Set x = Worksheets("Sheet1")
Set y = Worksheets("Sheet2")

iLast = x.Range("A" & Application.Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
    For iCounter = 2 To iLast
        Set rng = y.Range("A:A").Find(x.Range("A" & iCounter).Value)
            If rng Is Nothing Then
                x.Cells(iCounter, 2).Value = "n'existe pas"
             Else
                x.Cells(iCounter, 2).Value = "existe"
             End If
    Next iCounter
Application.ScreenUpdating = True
End Sub

Bonjour,

Allez ! soyons fou !...

Cdlt.

5book1.xlsm (64.08 Ko)
Option Explicit

Public Sub MatchName()
Dim ws As Worksheet, ws2 As Worksheet
Dim lastRow As Long, lRow As Long
Dim rng As Range
Dim n

    Application.ScreenUpdating = False

    Set ws = Worksheets("Sheet1")
    Set ws2 = Worksheets("Sheet2")

    lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    Set rng = ws2.Cells(1).CurrentRegion

    For lRow = 1 To lastRow
        With ws
            n = Application.Match(.Cells(lRow, 1).Value, rng, 0)
            .Cells(lRow, 2).Value = IIf(IsError(n), False, True)
        End With
    Next lRow

End Sub

Par acquis de conscience j'ai testée la solution de Jean-Eric qui me semblait la plus performante sur 40 000 lignes

le résultat en 80 secondes environ.

Ce résultat peut encore être amélioré (75 " environ) en remplaçant le iif chronovore :

Sub Galopin()
Dim a, rng As Range, i, j, HDeb, HFin, n
HDeb = Timer
a = Worksheets("Sheet1").[A2].CurrentRegion.Resize(, 2).Value
Set rng = Worksheets("Sheet2").[A2].CurrentRegion
For i = 1 To UBound(a)
            n = Application.Match(a(i, 1), rng, 0)
            a(i, 2) = Not IsError(n)
Next
Worksheets("Sheet1").[A2].CurrentRegion.Resize(UBound(a), 2) = a
MsgBox Timer - HDeb
End Sub

Avec Find : entre 5 et 10 fois plus long (Je n'ai pas eu le courage d'attendre la fin...)

A+

Bonjour,

Une autre proposition avec Power Query (sans VBA).

On a :

1 tableau des communs des 2 feuilles.

2 tableaux des uniques de chaque feuille.

Cdlt.

5book1-1.xlsx (93.22 Ko)

Bonjour,

Une autre piste parmi tant d'autres :

Sub Test()

    Dim Plage As Range
    Dim Cel As Range

    With Worksheets("Sheet1"): Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    For Each Cel In Plage

        Cel.Offset(, 1).Value = IIf(Application.CountIf(Worksheets("Sheet2").Range("A:A"), Cel.Value), "VRAI", "FAUX")

    Next Cel

End Sub

Bonjour à tous,

Merci à tous pour vos réponses et le temps consacré.

Super content de voir que le temps de déroulement de la macro a drastiquement diminué!

Bonne semaine.

Re @Jean-Eric, @galopin01,

Dans les macros que vous avez proposé, vous utilisez la fonction ISERROR avec n comme expression.

Pourriez-vous m'expliquer comment cette fonction peux renvoyer TRUE ou FALSE,s 'il vous plaît?

Merci par avance pour votre aide.

Bonjour,

n est déclaré en variant. Et quelles valeurs peuvent prendre un variant ?

Je te propose un peu de lecture.

https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/variant-data-type

Regarde plus précisément le point sur Error.

Sinon ce n'est pas IsError qui retourne False ou True, c'est la fonction IIF.

A te relire.

Cdlt.

Re-bonjour @Jean-Eric,

Je vous remercie pour le partage du lien, cela m'a permis de beaucoup mieux comprendre le type Variant.

J'ai une dernière question concernant votre code.

En fait, je souhaiterais savoir s'il est sensible au format ?

Je m'explique...

A l'aide d'une macro, je récupère des noms de fichiers puis je lance votre macro. Sauf que la macro de matching ne fonctionne plus.

J'obtiens toujours le résultat FALSE. Je n'arrive pas à voir ce qui ne va pas !

J'ai mis un exemple dans le classeur ci-joint.

La feuille 3 et feuille 4 sont celles utilisées pour illustrer le cas présenté ci-dessus.

Merci par avance pour votre aide.

7book1-v1.xlsm (97.94 Ko)

Bonjour à tous,

Quelqu'un peut-il m'éclairer au sujet de mon précédent message, s'il vous plaît?

Je souhaiterais savoir si l'utilisation de la fonction Application.Match() ne fonctionne pas lorsque l'un des paramètres de cette fonction résulte d'une récupération de données.

En espérant avoir été claire...

Merci par avance pour votre aide.

Bonne journée.

Rechercher des sujets similaires à "deux boucles"