IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comparer 2 Ranges avec Offset column.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Comparer 2 Ranges avec Offset column.
    Bonjour le Forum,
    Je me permets de poser la question suivante car je bloque et n'ai pas trouvé de posts similaires.

    Je cherche - à l'aide d'une macro - à comparer deux ranges sur deux sheets differentes (‘Sheet1’ Range A3 to lastrow,lastcol et ‘Sheet2’ Range A3 to lastrow,lastcol ).

    Les conditions sont les suivantes ;

    1) Si valeur en Column A sur Sheet1 n’existe pas en Column A sur Sheet2 alors pas d’action et passe a Cell A suivante.

    2) Si valeur en Column A sur Sheet1 = Column A sur Sheet2 alors comparaison de toutes les valeurs de la ligne en question (B a E par exemple).

    3) Si valeur(s) differente(s), mettre sur Sheet1 la(es) cell(s) avec un fond d’une couleur.

    NB : Les valeurs en Column A ne sont pas forcément dans le même ordre sur Sheet1 et Sheet2.

    NB : Il peut y avoir des valeurs en Column A sur Sheet1 qui n’existent pas sur Sheet2 et inversement.

    NB : Il n’y a pas de doublons en Column A.

    NB : Il n’y a pas forcement le même nombre de ligne sur les deux ranges.

    NB : le fichier peut être amené à avoir un nombre de Colum plus important (inconnu à ce jour) et j’aimerai éviter de ‘retourcher’ la macro plus tard donc, détecter la lastcol.

    Remarque importante : Sur la Sheet2, il y a une columnB qui n’existe pas sur la Sheet1, et là, je bloque pour le code car en fait, il faut comparer le column B de Sheet1 avec la column C de sheet 2. (c'est plus parlant sur le fichier Excel attache). j'ai pensé passer par un offset pour la comparaison mais j'ai peur cela prenne bcp de temps pour tourner.

    Ce fichier peut contenir plusieurs milliers de lignes et je ne sais pas s’il est possible de passer par un array pour augmenter la rapidité d’exécution.

    Ci-joint un fichier d’exemple.

    Pour l’instant, j’arrive à filtrer la Sheet2 s’il y a un match mais je bloque pour le code pour comparer les valeurs de cell Bx à Ex.

    Merci pour votre aide et support.
    Herve
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Ajoute au début de la macro :

    et ne fais pas de tests sur la colonne B.

    Supprime la colonne en fin de macro.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci Daniel,
    Effectivement, cette solution est la plus simple; a force de trop reflechir, j'en oubli la simplicite.

    par contre, j'arrive bien a filter la Sheet2 s'il y a une equivalence mais pour faire la comparaison de column C a E je bloque.
    ma macro filtre bien mais comment puis-je faire pour recuperer l'addresse de la ligne ?

    Dans l'exemple ci dessous, je compare les lignes 3 a 15 (donc C a Q) le probleme est qu'il faut que je remplace le 3 (en gras) pas le numero de ligne !?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    'Look for match between Sheet1 and Sheet2 in Column A From Cell A3
            For i = 3 To sheetOne.Range("a" & Rows.Count).End(xlUp).Row
                If Application.CountIf(sheetTwo.Range("a:a"), Cells(i, "a")) <> 0 Then
                        Cells(i, "a").Select
    'If Match, highlight the cell A in Yellow and Filter in Sheet2
                        Selection.Interior.ColorIndex = 3
                        sheetTwo.Select
                        Range("$A$2:$N$14").AutoFilter Field:=1, Criteria1:=Cells(i, "a").Value
    
    'If Value is Different between sheet1 and sheet2, highlight the cell(s) in Red
                        For j = 3 To 15
                        If sheetOne.Cells(i, j).Value <> "" And sheetOne.Cells(i, j).Value <> sheetTwo.Cells(3, j).Value Then
                            sheetOne.Cells(i, j).Interior.ColorIndex = 3
                        End If
                        Next j
                        sheetOne.Select
                End If
            Next i
    Dernière modification par AlainTech ; 30/03/2013 à 15h52. Motif: Balises [code]

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Si j'ai bien compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            Range("$A$2:$N$14").AutoFilter Field:=1, Criteria1:=Cells(i, "a").Value
            With ActiveSheet.AutoFilter.Range
                Ligne = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)(1).Row
            End With
            'If Value is Different between sheet1 and sheet2, highlight the cell(s) in Red
            For j = 3 To 15
                If sheetOne.Cells(i, j).Value <> "" And sheetOne.Cells(i, j).Value <> sheetTwo.Cells(Ligne, j).Value Then
                    sheetOne.Cells(i, j).Interior.ColorIndex = 3
                End If
            Next j

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci encore Daniel,

    Pour accéder a la ligne dans le filtre, j'utilise le Find.
    Je suis persuadé qu'il y a moyen d'optimiser ce code mais il repond tres bien a mes attentes.

    Et encore merci
    Herve

    Post Resolu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    sheetOne.Select
    'Look for match between Sheet1 and Sheet2 in Column A From Cell A3
            For i = 3 To sheetOne.Range("a" & Rows.Count).End(xlUp).Row
                If Application.CountIf(sheetTwo.Range("a:a"), Cells(i, "a")) <> 0 Then
                        Cells(i, "a").Select
    'If Match, highlight the cell A in Yellow and Filter in Sheet2
    '                    Selection.Interior.ColorIndex = 6
                        sheetTwo.Select
                        Range("$A$2:$IV$2000").AutoFilter Field:=1, Criteria1:=sheetOne.Cells(i, "a").Value
     
     
    With sheetTwo.Range("a:a")
    x = [A:A].Find(What:=(sheetOne.Cells(i, "a").Value), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns).Row
    End With
     
     
    'If Value is Different between sheet1 and sheet2, highlight the cell(s) in Red
                        For j = 3 To 256
    '                    If sheetOne.Cells(i, j).Value <> "" And sheetOne.Cells(i, j).Value <> sheetTwo.Cells(x, j).Value Then
                        If sheetOne.Cells(i, j).Value <> sheetTwo.Cells(x, j).Value Then
                            sheetOne.Cells(i, j).Interior.ColorIndex = 3
                        End If
                        Next j
                        sheetOne.Select
                End If
            Next i
    Dernière modification par AlainTech ; 30/03/2013 à 15h53. Motif: Balises [code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle For Each avec Offset variable suivant Application.thiscell.column
    Par Ganeshiva dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/07/2015, 17h43
  2. Réponses: 2
    Dernier message: 06/11/2005, 11h11
  3. [struts] Comparer deux variables avec <logic:equal>
    Par trax020 dans le forum Struts 1
    Réponses: 4
    Dernier message: 29/05/2005, 11h08
  4. Comparer l'enregistrement avec le suivant ...
    Par psyco2604 dans le forum ASP
    Réponses: 3
    Dernier message: 01/06/2004, 17h40
  5. Pb avec DROP COLUMN sous SQL Server 2000
    Par debailleul dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/03/2004, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo