MACRO COMPARAISON 2 COLONNES

coquillette -  
Krysstof Messages postés 1659 Statut Membre -
Bonjour à tous,

j'ai besoin de vos lumières pour éclairer mon problème.
voila je vous explique: j'ai 2 feuilles avec dans chaque feuilles 1 tableau où j'aimerais comparer la colonne C de la feuille 1 avec la colonne C de la feuille 2.
si le résultat est différent j'aimerais que sur la colonne D de la feuille 2 apparaissant le résultat de la différence entre la colonne C de la feuille 1 et la colonne C de la feuille 2.
j'espère avoir été claire dans mon explication et vous remercie pour l'aide que vous pourrez m'apporter car là je sèche depuis plusieurs jours et mon projet n'avance pas.....
merci beaucoup par avance.....

2 réponses

  1. Krysstof Messages postés 1659 Statut Membre 295
     
    le probleme de la comparaison de 2 colonne est "comment tu veux comparer?"

    en gros, si tu veux comparer ligne a ligne (si C1 = C1 alors ok, si C2 <> C2 alors pas ok, etc...)
    ca c'est facile

    si par contre tu veux comparer la cellule C1 avec toutes les cellule de l'autre feuille, pareil pour c2, C3 etc... la c'est pas la meme chose.

    ensuite bien sur si tu fait le 1er choix, tu est dépendant de l'ordre de tes ligne, du nombre de lignes, etc.

    donc explique mieux ce que tu veux comparer pour commencer ;)
    0
    1. coquillette
       
      j'ai déjà une macro que me colorie les cellules en fonction du résultat qui fonctionne très bien mais je voudrais à la place du coloriage le résultat de la différence entre la cellule c5 de la feuille 1 et la colonne c5 de la feuille 2.
      voici ma macro:

      Sub comp46()
      Dim lig1 As Long, derlig1 As Long, derlig2 As Long, cp As Variant
      Dim lig2 As Long, FR1 As Worksheet, FR2 As Worksheet
      Set FR1 = Sheets("sem 47")
      Set FR2 = Sheets("sem 48")
      derlig1 = FR1.Range("b65535").End(xlUp).Row
      derlig2 = FR2.Range("b65535").End(xlUp).Row
      For lig1 = 2 To derlig1
      cp = FR1.Cells(lig1, "b")
      For lig2 = 2 To derlig2
      If cp = FR2.Cells(lig2, "b") Then
      If FR1.Cells(lig1, "c") > FR2.Cells(lig2, "c") Then
      FR2.Cells(lig2, "c").Interior.ColorIndex = 15
      ElseIf FR1.Cells(lig1, "c") < FR2.Cells(lig2, "c") Then
      FR2.Cells(lig2, "c").Interior.ColorIndex = 4
      Else: FR2.Cells(lig2, "c").Interior.ColorIndex = 8
      End If
      Exit For
      End If
      Next lig2
      Next lig1
      End Sub

      exemple: feuille 1
      cellule c5 = 86
      feuille 2
      cellule c5 = 56
      j'aimerai que dans la cellule d5 de la feuille 2 apparaisse = -30

      j'espère avoir été + claire
      0
  2. Krysstof Messages postés 1659 Statut Membre 295
     
    Dim lig1 As Long, derlig1 As Long, derlig2 As Long, cp As Variant
    Dim lig2 As Long, FR1 As Worksheet, FR2 As Worksheet
    Set FR1 = Sheets("sem 47")
    Set FR2 = Sheets("sem 48")
    derlig1 = FR1.Range("b65535").End(xlUp).Row
    derlig2 = FR2.Range("b65535").End(xlUp).Row
    For lig1 = 2 To derlig1
        cp = FR1.Cells(lig1, "b")
        For lig2 = 2 To derlig2
            If cp = FR2.Cells(lig2, "b") Then
                If FR1.Cells(lig1, "c") > FR2.Cells(lig2, "c") Then
                    FR2.Cells(lig2, "c").Interior.ColorIndex = 15
                ElseIf FR1.Cells(lig1, "c") < FR2.Cells(lig2, "c") Then
                    FR2.Cells(lig2, "c").Interior.ColorIndex = 4
                Else: FR2.Cells(lig2, "c").Interior.ColorIndex = 8
                End If
                Exit For
            End If
        Next lig2
    Next lig1
    End Sub


    ok, donc tu cherche la comparaison sur la valeur de la colonne B et tu mets en couleur le résultat dans C, et tu fais 65000 fois 65000 iterations !
    ca se travaille ^^

    bref, la technique, si ya pas de ligne vide dans la colonne B, consiste à utiliser "isempty" pour savoir quand s'arrêter, et utiliser un booleen pour savoir que tu as trouver la valeur, donc ne pas continuer la 2eme boucle

    ca donne
    lig1 = 2
    while not isempty(FR1.cells(lig1, "b")
        dim trouve = false
        lig2 = 2
        while not isempty(FR2.cells(lig2, "b") and not trouve
            if FR1.Cells(lig1, "b") = FR2.Cells(lig2, "b") then
    
    'on met le bool a vrai, comme ca on continue pas la boucle au prochain tour
                trouve = true
    
    'ici on rajoute la valeur a mettre dans la colonne D
                FR2.Cells(lig2, "d") = FR1.Cells(lig1, "c")- FR2.Cells(lig2, "c")
    
    'et la on remet ton code de couleur
                If FR1.Cells(lig1, "c") > FR2.Cells(lig2, "c") Then
                    FR2.Cells(lig2, "c").Interior.ColorIndex = 15
                ElseIf FR1.Cells(lig1, "c") < FR2.Cells(lig2, "c") Then
                    FR2.Cells(lig2, "c").Interior.ColorIndex = 4
                Else: FR2.Cells(lig2, "c").Interior.ColorIndex = 8
            end if
            lig2=lig2+1
        wend
        lig1 = lig1+1
    wend
    
    0
    1. coquillette
       
      je te remercie beaucoup ta macro fonctionne impeccable mais je dois insérer moi même une colonne pour faire apparaitre le résultat car normalement dans mon tableau la colonne D est déja prise par autre chose

      exemple:
      colonne A = EAN
      colonne B= libellé
      colonne C= valeur
      Colonne D= quantité

      donc est ce qu'il existe 1 macro qui puisse m'insérer automatiquement une colonne entre la colonne C et D en fait qui décalerai la colonne D en colonne E....

      merci encore...
      0
    2. Krysstof Messages postés 1659 Statut Membre 295
       
      oh ben oui, j'ai plus la syntaxe, mais le plus simple : tu vas sur ta feuille, tu sélection A1
      tu démarre l'enregistrement d'une macro, et tu fais :
      clic droit sur la colonne D
      insérer une nouvelle colonne
      arreter la macro

      rien d'autre

      et hop, t'as le code dasn un nouveau module
      0