Comparaison de 2 tableaux Excel

Résolu
Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   -  
Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je ne suis pas un crak du langage VBA. Mais, j'ai quand même, à l'aide des internautes de ce merveilleux site, réussi à créer un code servant à comparer les tableaux que m'envoie mon client et les tableaux de mes propres extractions venant de mes logiciels de gestion.

Malheureusement, il s'avère que mon code ne marche pas pour un certain client et je n'arrive absolument pas à l'expliquer. C'est pourquoi je vous demande de l'aide.

Ci-joint mon fichier avec 2 boutons activant mes codes sur la feuille 1 :

https://www.cjoint.com/c/EFspSwjrx5f

Pas besoin de toucher au code du premier bouton "RETRAITEMENTS", il marche parfaitement. Par contre, le problème est sur le code du bouton "COMPARATIF".

Lors de l'étape 1, sur la comparaison des références, tout marche à merveille ! Par contre lorsqu'il s'agit de comparer les prix, il y a un problème. Prenez l'exemple des références suivantes :
- 1006859271
- 1006864780
- 1006908984
- 1006911205

Les prix sont différents sur les 2 tableaux et pourtant, sur la feuille 3, ces différences de prix ne sont pas indiquées. Ce qui veut dire que le code ne prend en compte que certains prix. Pourquoi?!

Je vous remercie d'avance pour le temps que vous passerez à m'aider. Ce n'est effectivement pas un problème facile...

Cordialement,

4 réponses

  1. PlacageGranby Messages postés 402 Statut Membre 26
     
    Bonjour,

    J'ai pris une valeur pour faire le test soit 1006859271
    J'ai ensuite été dans votre code VBA et j'ai ajouter deux espions pour voir le contenu des variable durant l'exécution du code.
    soit les variable
    Sheets(1).Range("C" & n).Value
    Sheets(2).Range("B" & t).Value

    Ensuite, j'ai ajouté le code suivant, et j'ai mis un point d'arret sur le MSGbox
        If Sheets(1).Range("C" & n).Value = 1006859271 Then
            If Sheets(2).Range("B" & t) = 1006859271 Then
                MsgBox "ok"
            End If
        End If


    Voici le contenu des variables avant la comparaison
    Watch : : Sheets(1).Range("C" & n).Value : 1006859271 : Variant/Double : Module2.COMPARATIF
    Watch : : Sheets(2).Range("B" & t).Value : "1006859271" : Variant/String : Module2.COMPARATIF

    Donc, vous comparez un chiffre avec du texte.

    une solution serait de forcer une conversion avant la comparaison avec cstr
    Donc, on converti les deux valeur en texte.

    If cstr(Sheets(1).Range("C" & n).Value) = cstr(Sheets(2).Range("B" & t).Value) Then
    0
    1. PlacageGranby Messages postés 402 Statut Membre 26
       
      La trace pas à pas est toujours l'outil ultime pour le débuggage.
      On vérifie le contenu des variables et on voit pourquoi excel ne réagit pas comme prévu lors des boucles et des conditions.
      Pour mettre un point d'arret, on click dans la marge de gauche, et pour ne pas se tapper 2000 ligne de code, on ajoute un if, comme dans mon exemple précédent pour aller directement à la valeur qui nous intéresse.
      0
  2. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
     
    Merci infiniment de vous être penché sur mon problème.

    Merci de m'avoir donné les clés pour mes prochains codes, je ne connaissais pas du tout tout ça.

    Ce qui m'étonne c'est que je convertis en nombre à chaque fois mes valeurs mais excel les considère encore comme du texte...

    Du coup, votre If cstr viendrait se mettre à quel endroit dans le code?

    Merci d'avance.
    0
  3. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
     
    Dim DLig As Long
    Dim DLig2 As Long
    DLig = Sheets(1).Range("C2").End(xlDown).Row
    DLig2 = Sheets(2).Range("B3").End(xlDown).Row
    x = 3
    'boucle sur les lignes de Feuil2
    For t = 3 To DLig2
    ' si ref n'existe pas en feuil 1 on recopie les colonnes en feuil3 + message
    If Application.WorksheetFunction.CountIf(Sheets(1).Range("C:C"), Sheets(2).Range("B" & t)) = 0 Then
        x = x + 1
            For k = 1 To 18
            Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
            Next
            Sheets(3).Range("S" & x) = "La référence n'est pas chez le client"
        End If
    Next t
    'boucle sur les lignes de Feuil1
    For t = 2 To DLig
    ' si ref n'existe pas en feuil 2   message (on ne recopie pas lignes car pas même emplacements mais juste la ref)
    If Application.WorksheetFunction.CountIf(Sheets(2).Range("B:B"), Sheets(1).Range("C" & t)) = 0 Then
        x = x + 1
     Sheets(3).Range("B" & x) = Sheets(1).Range("C" & t)
     Sheets(3).Range("E" & x) = Sheets(1).Range("A" & t)
     Sheets(3).Range("G" & x) = Sheets(1).Range("I" & t)
     Sheets(3).Range("H" & x) = Sheets(1).Range("H" & t)
     Sheets(3).Range("I" & x) = Sheets(1).Range("J" & t)
     Sheets(3).Range("K" & x) = Sheets(1).Range("N" & t)
            Sheets(3).Range("S" & x) = "La référence n'est pas chez nous"
        End If
    Next t
    
    ' boucle sur lignes en Feuil 1 et sur lignes en feuil2
    For n = 2 To DLig
    For t = 3 To DLig2
    ' si les ref correspondent
    If CStr(Sheets(1).Range("C" & n).Value) = CStr(Sheets(2).Range("B" & t).Value) Then
    If Sheets(1).Range("C" & n) = Sheets(2).Range("B" & t) Then
    ' alors on verifie que les prix correspondent et si pas correspondance on relève les colonnes + message et calcul de différence
        If Sheets(1).Range("N" & n) <> Sheets(2).Range("K" & t) Then
             x = x + 1
            For k = 1 To 18
            Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
            Next
            Sheets(3).Range("S" & x) = "Ecart de prix"
            Sheets(3).Range("t" & x) = Sheets(1).Range("N" & n) - Sheets(2).Range("K" & t)
        End If
    End If
    End If
    
    Next t
    Next n
    End Sub
    


    Je l'ai ajouté ici mais ça ne change rien....
    0
    1. PlacageGranby Messages postés 402 Statut Membre 26
       
      Re-bonjour,

      En ayant rajouter ma suggestion de Cstr().vous avez maintenant deux IF qui font la même chose.
      Le premier converti en texte et compare si les valeurs sont égales.
      Le deuxième IF, est toujours pareil, ce qui va causer l'erreur il compare encore un nombre avec du texte.
      Il faut supprimer ce deuxième IF ainsi que le end if correspondant.

      Ci-bas ton code corrigé

      Dim DLig As Long
      Dim DLig2 As Long
      DLig = Sheets(1).Range("C2").End(xlDown).Row
      DLig2 = Sheets(2).Range("B3").End(xlDown).Row
      x = 3
      'boucle sur les lignes de Feuil2
      For t = 3 To DLig2
      ' si ref n'existe pas en feuil 1 on recopie les colonnes en feuil3 + message
      If Application.WorksheetFunction.CountIf(Sheets(1).Range("C:C"), Sheets(2).Range("B" & t)) = 0 Then
          x = x + 1
              For k = 1 To 18
              Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
              Next
              Sheets(3).Range("S" & x) = "La référence n'est pas chez le client"
          End If
      Next t
      'boucle sur les lignes de Feuil1
      For t = 2 To DLig
      ' si ref n'existe pas en feuil 2   message (on ne recopie pas lignes car pas même emplacements mais juste la ref)
      If Application.WorksheetFunction.CountIf(Sheets(2).Range("B:B"), Sheets(1).Range("C" & t)) = 0 Then
          x = x + 1
       Sheets(3).Range("B" & x) = Sheets(1).Range("C" & t)
       Sheets(3).Range("E" & x) = Sheets(1).Range("A" & t)
       Sheets(3).Range("G" & x) = Sheets(1).Range("I" & t)
       Sheets(3).Range("H" & x) = Sheets(1).Range("H" & t)
       Sheets(3).Range("I" & x) = Sheets(1).Range("J" & t)
       Sheets(3).Range("K" & x) = Sheets(1).Range("N" & t)
              Sheets(3).Range("S" & x) = "La référence n'est pas chez nous"
          End If
      Next t
      
      ' boucle sur lignes en Feuil 1 et sur lignes en feuil2
      For n = 2 To DLig
      For t = 3 To DLig2
      ' si les ref correspondent
      If CStr(Sheets(1).Range("C" & n).Value) = CStr(Sheets(2).Range("B" & t).Value) Then
      ' alors on verifie que les prix correspondent et si pas correspondance on relève les colonnes + message et calcul de différence
          If Sheets(1).Range("N" & n) <> Sheets(2).Range("K" & t) Then
               x = x + 1
              For k = 1 To 18
              Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
              Next
              Sheets(3).Range("S" & x) = "Ecart de prix"
              Sheets(3).Range("t" & x) = Sheets(1).Range("N" & n) - Sheets(2).Range("K" & t)
          End If
      End If
      
      Next t
      Next n
      End Sub
      0
  4. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
     
    J'ai tellement perdu de temps sur ce truc c'est incroyable.

    Je vous remercie infiniment pour votre réponse et en plus, votre code marche à merveille ! Enfin ce code marche grâce à vous !

    Merci encore.

    Cordialement.
    0