Problème VBA-excel _Comparer deux listes

Résolu
Bonjour,

Quelqu'un pourrait-il me filer un coup de main?

Je souhaite comparer deux listes de données (une colonne de code avec une autre colonne de code) dans excel (en automatisant avec VBA)?

Si les codes sont identiques:correct, si ils sont différents:erreur.
quand traiter ce problème dans VBA?
Configuration: Windows XP
Internet Explorer 6.0

6 réponses

  1. Salut,

    ce code t'écrira dans une troisième colonne s'il y a erreur ou non, en espérant que ce soit ça que tu souhaites:

    Sub Compare()
    For i = 1 To Range("A1").End(xlDown).Row
    If Cells(i, 1).Value = Cells(i, 2).Value Then
    Cells(i, 3).Value = "Correct"
    Else: Cells(i, 3).Value = "Erreur"
    End If
    Next i
    End Sub

    A adapter ! ;-)
    1
    1. Contributeur
      bonjour,
      par exemple comparer colonne A à B

      sub Compare()
      dim i as integer, V as integer
      'déterminer la dernière ligne initialisée
      V= Range("A65536").End(xlUp).Row
      for i=1 to V
      if range("A" & i).value <>range("B" & i).value then
      msgbox "pas égale"
      end if
      next i
      End SUB
      A+
      louis
      0
      1. Merci pour vos réponses si rapides les gas, on sent les pros...
        Comme je t'attonne en VBA, je galère, bref
        j'ai essayé vos réponses et en fait le problème est plus compliqué:

        donc je compare deux colonnes(A et B).OK
        Une valeur qui se trouve dans A doit se trouver dans la colonne B (elle peut se trouver n'importe ou dans la colonne B, si ce n'est pas le cas elle est fausse; et ce raisonnement pour toutes les valeurs de la colonne A (et le pire c'est que vice versa aussi mais laissons cela))

        Je sais pas si je suis clair. Si je suis compris que je comprenne vos réponses .
        Merci Quand même
        0
        1. Ok, on reprend:

          Sub Compare()
          n = 0
          For i = 1 To Range("A1").End(xlDown).Row
          For j = 1 To Range("B1").End(xlDown).Row
          If Cells(i, 1).Value = Cells(j, 2).Value Then
          n = n + 1
          Exit For
          End If
          Next j
          Next i
          If n = Range("A1").End(xlDown).Row Then MsgBox "Toutes les formules de la colonne A se trouvent en B"
          Else MsgBox "Il y a " & Range("A1").End(xlDown).Row-n & " formules de la colonne A qui ne se trouvent pas en B"
          End If
          End Sub

          Ca va déjà se rapprocher de ce que tu cherches je pense...
          0
          1. Salut,

            ce code ta donne le nombre de formules qu'il y a en A et qui ne sont pas en B et inversement.

            Problème, il ne gère pas les doublons, donc si tes formules sont une seule fois dans chaque colonne, ça marche bien, sinon il faudra modifier un peu...

            Sub Compare()
            n = 0
            m = 0
            For i = 75 To Range("A75").End(xlDown).Row
            For j = 75 To Range("B75").End(xlDown).Row
            If Cells(i, 1).Value = Cells(j, 2).Value Then
            n = n + 1
            Exit For
            End If
            Next j
            Next i

            For i = 75 To Range("B75").End(xlDown).Row
            For j = 75 To Range("A75").End(xlDown).Row
            If Cells(i, 1).Value = Cells(j, 2).Value Then
            m = m + 1
            Exit For
            End If
            Next j
            Next i

            If n = Range(Range("A75"), Range("A75").End(xlDown).Address).Rows.Count And m = Range(Range("B75"), Range("B75").End(xlDown).Address).Rows.Count Then
            MsgBox "Toutes les formules se trouvent dans les deux colonnes"
            ElseIf n = Range(Range("A75"), Range("A75").End(xlDown).Address).Rows.Count And m <> Range(Range("B75"), Range("B75").End(xlDown).Address).Rows.Count Then
            MsgBox "Il y a " & Range(Range("B75"), Range("B75").End(xlDown).Address).Rows.Count - m & " formules de la colonne B qui ne se trouvent pas en A et toutes les formules de A se trouvent en B"
            ElseIf n <> Range(Range("A75"), Range("A75").End(xlDown).Address).Rows.Count And m = Range(Range("B75"), Range("B75").End(xlDown).Address).Rows.Count Then
            MsgBox "Il y a " & Range(Range("A75"), Range("A75").End(xlDown).Address).Rows.Count - n & " formules de la colonne A qui ne se trouvent pas en B et toutes les formules de B se trouvent en A"
            Else: MsgBox "Il y a " & Range(Range("A75"), Range("A75").End(xlDown).Address).Rows.Count - n & " formules de la colonne A qui ne se trouvent pas en B et " & Range(Range("B75"), Range("B75").End(xlDown).Address).Rows.Count - m & " formules de la colonne B qui ne se trouvent pas en A"
            End If
            End Sub
            0
            1. merci, je suis en train de détailler tes réponses pour bien les comprendre...
              Par contre concernant mon problème qui touche à sa fin c'est que:
              ma colonne A a des codes de ce style:
              BA0001A
              BA0001B
              BA0001C
              BA0002B
              BA0003A
              BA0006A
              ...
              ma colonne B a des codes de ce style:
              BA0001
              BA0002
              BA0004
              BA0005...
              DONC je suis obligé d'enlever la dernière lettre des codes de la colonne A pour les comparer à B et dans l'exemple le code BA0001 est correct, le code BA0003(A) est faux (pas d'équivalent dans la colonne B) et le code BA0005 est faux (pas d'équivalent dans la colonne A)
              Kapish, je sais ça devient alambiqué
              0
          2. Dans ce cas, dans la partie suivante tu dois effectuer une petite modif:

            For i = 75 To Range("A75").End(xlDown).Row
            For j = 75 To Range("B75").End(xlDown).Row
            If Left(Cells(i, 1).Value,6) = Left(Cells(j, 2).Value,6) Then
            n = n + 1
            Exit For
            End If
            Next j
            Next i

            For i = 75 To Range("B75").End(xlDown).Row
            For j = 75 To Range("A75").End(xlDown).Row
            If Left(Cells(i, 1).Value,6) = Left(Cells(j, 2).Value,6) Then
            m = m + 1
            Exit For
            End If
            Next j
            Next i

            Du coup il ne va comparer que les 6 premiers caractères de chaque chaine contenue dans les cellules... ;-)
            0
            1. ouais ça touche à sa fin...
              avec ton code, il compare les deux listes
              maintenant l'idéal serait qu'il me note dans une autre colonne les codes de la colonne A qui ne se trouve pas dans B et dans une autre colonne les codes de la colonne B qui ne setrouve pas dans A
              0
            2. avec ton code, il compare les deux listes
              maintenant l'idéal serait qu'il me note dans une autre colonne les
              codes de la colonne A qui ne se trouve pas dans B et dans une autre colonne
              les codes de la colonne B qui ne setrouve pas dans A
              0
            3. Essaye comme ça et regarde si ça te va:

              Sub Compare()
              n = 0
              m = 0
              Application.ScreenUpdating = False
              ActiveSheet.Range(Range("A1"), Range("A1").End(xlDown).Address).Copy
              ActiveSheet.Paste Destination:=ActiveSheet.Range("C1")
              ActiveSheet.Range(Range("B1"), Range("B1").End(xlDown).Address).Copy
              ActiveSheet.Paste Destination:=ActiveSheet.Range("D1")
              Application.CutCopyMode = False

              For i = 1 To Range("A1").End(xlDown).Row
              For j = 1 To Range("B1").End(xlDown).Row
              If Left(Cells(i, 1).Value, 6) = Left(Cells(j, 2).Value, 6) Then
              n = n + 1
              Cells(i, 3).Value = ""
              Exit For
              End If
              Next j
              Next i

              For i = 1 To Range("B1").End(xlDown).Row
              For j = 1 To Range("A1").End(xlDown).Row
              If Left(Cells(i, 1).Value, 6) = Left(Cells(j, 2).Value, 6) Then
              m = m + 1
              Cells(i, 4).Value = ""
              Exit For
              End If
              Next j
              Next i

              If n = Range(Range("A1"), Range("A1").End(xlDown).Address).Rows.Count And m = Range(Range("B1"), Range("B1").End(xlDown).Address).Rows.Count Then
              MsgBox "Toutes les formules se trouvent dans les deux colonnes"
              ElseIf n = Range(Range("A1"), Range("A1").End(xlDown).Address).Rows.Count And m <> Range(Range("B1"), Range("B1").End(xlDown).Address).Rows.Count Then
              MsgBox "Il y a " & Range(Range("B1"), Range("B1").End(xlDown).Address).Rows.Count - m & " formules de la colonne B qui ne se trouvent pas en A et toutes les formules de A se trouvent en B"
              ElseIf n <> Range(Range("A1"), Range("A1").End(xlDown).Address).Rows.Count And m = Range(Range("B1"), Range("B1").End(xlDown).Address).Rows.Count Then
              MsgBox "Il y a " & Range(Range("A1"), Range("A1").End(xlDown).Address).Rows.Count - n & " formules de la colonne A qui ne se trouvent pas en B et toutes les formules de B se trouvent en A"
              Else: MsgBox "Il y a " & Range(Range("A1"), Range("A1").End(xlDown).Address).Rows.Count - n & " formules de la colonne A qui ne se trouvent pas en B et " & Range(Range("B1"), Range("B1").End(xlDown).Address).Rows.Count - m & " formules de la colonne B qui ne se trouvent pas en A"
              End If
              Application.ScreenUpdating = True
              End Sub
              0
            4. @xjlMerci beaucoup xjl
              Mission accomplie, ça marche.
              0
            5. @xjlce code est presque bon en fait:
              Problème de comparaison dans un sens de la colonne B vers la colonne A
              - il se trompe
              - il marque pas dans une autre colonne les codes de la colonne B n'ayant pas d'équivalent
              0