Comparer des valeurs de 2 plages se trouvant dans 2 feuilles

Bonjour à tous,

Voilà plusieurs jours que je bute sur une macro qui consiste à comparer les valeurs de 2 plages dont la dimension est variable et se trouvant sur 2 feuilles différentes.

La macro consiste à comparer chaque ligne de la première plage de la feuille 1 avec chaque ligne de la deuxième plage de la feuille 2.

Si une valeur n'est pas répertoriée dans la première plage alors je copie la valeur dans une troisième feuille.

J'ai écrit cette macro mais elle ne fonctionne pas et j'ai du mal à comprendre.

Sub compare()

Dim cellule As Integer

Dim y_comparaison As Integer

' je stocke le n° de la ligne

cellule = Range("a65536").End(xlUp).Row

'je l'utilise avec range

Range("a11:a" & cellule).Select

For Each cellule In Worksheet("balanceN")

If Sheet("balanceN").Cells(a11, 1).Value <> Sheet("balanceN-1").Cells(a11, 1).Value Then

' copie les n° de comptes manquants

Sheets("ComparaisonBalN").Cells(y_comparaison, 1).Value = Sheets("ComparaisonBalanceN-1").Cells(y_comparaison, 1).Value

' copie les intitulés des numéros de cptes manqunts avec la propiriété offset

Sheets("ComparaisonBalN").Cells(y_comparaison, 2).Value = Sheets("ComparaisonBalanceN-1").Cells(y_comparaison, 1).Offset(, 1).Value

y_comparaison = y_comparaison + 1

End If

Next cellule

End Sub

Si quelqu'un veut bien m'aider je l'en remercie vivement car je dois utiliser cette macro dès demain.

Bon dimanche

Bonjour rimbaut, forum,

Peux-tu envoyer un bout de fichier afin de faciliter toute aide?

Merci à toi.

Bonjour,

Comme VBAnew, le mieux est de placer ton fichier car au vu de ton code, il ne correspond pas à tes explications.

Un lien qui est un peu la même chose que ce que tu veux faire sauf que cela est visualisé dans une boite à message --> https://www.excel-pratique.com/forum/viewtopic.php?t=8939

A te relire

Dan

19mipeczones-4.xlsm (182.10 Ko)

Bonsoir vba-new?

Voici les pages utiles à la macro.

Voici le fichier :

https://www.excel-pratique.com/~files/doc2/CompareBalance.xls

J'ai modifié quelque peu les feuilles afin que le fichier ne soit pas trop lourd.

Merci pour ton aide

Re,

Merci de ton fichier.

Peux-tu donner des explications de ce que tu veux faire ?

Comparer BalanceN avec BalnceN-1 ou le contraire ?

Si le compte n'est pas trouvé, on copie vers où ?

A te relire

Dan

Bonsoir Nad-dan,

Ce que je souhaite faire est de comparer tout d'abord la balanceN avec la balanceN-1 et ceci dans une première procédure. Puis comparer la balanceN-1 à la balance N et ceci dans une 2ieme procédure.

Les comptes "absents" de la balance et qui figurent donc sur la balanceN-1 doivent être copiés sur la feuille "comparaisonBalN".

Les comptes "absents" de la balanceN-1 et qui figurent donc sur la balanceN doivent être copiés sur la feuille "comparaisonBalanceN-1".

re,

Essaie avec ce code :

Sub compare()
'Macro Dan pour rimbaut le 29/06/09 - XL Pratique
' http://www.excel-pratique.com/forum/viewtopic.php?t=12141
Dim cellule As Range
Dim lig As Integer, ligcom As Integer
Application.ScreenUpdating = False
With Sheets("BalanceN")
    For Each cellule In .Range("A11:A" & Range("A65536").End(xlUp).Row)
        On Error Resume Next
        If IsError(Application.WorksheetFunction.Match(cellule, _
                Sheets("BalanceN-1").Range("A11:A" & Sheets("BalanceN-1").Range("A65536").End(xlUp).Row), 0)) Then
            lig = cellule.Row
            ligcom = Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row + 1
            .Range("A" & cellule.Row & ":D" & cellule.Row).Copy Destination:= _
                    Sheets("ComparaisonBalanceN-1").Range("A" & ligcom)
        End If
    Next cellule
End With

With Sheets("BalanceN-1")
    For Each cellule In Worksheets("balanceN-1").Range("A11:A" & Range("A65536").End(xlUp).Row)
        On Error Resume Next
        If IsError(Application.WorksheetFunction.Match(cellule, _
                Sheets("BalanceN").Range("A11:A" & Sheets("BalanceN").Range("A65536").End(xlUp).Row), 0)) Then
            lig = cellule.Row
            ligcom = Sheets("ComparaisonBalN").Range("A65536").End(xlUp).Row + 1
            .Range("A" & cellule.Row & ":D" & cellule.Row).Copy Destination:= _
                    Sheets("ComparaisonBalN").Range("A" & ligcom)
        End If
    Next cellule
End With
End Sub

Amicalement

Dan

Bonjour Dan,

Après test, cela ne semble pas marcher! Est-ce le cas pour toi?

Edit : après re-test, elle ne marche pas quand on lance la macro depuis les feuilles ComparaisonBalN et ComparaisonBalanceN-1. Sinon, marche si lancée depuis les 2 premières feuilles.

Merci pour ta macro.

Elle fonctionne. toutefois, je ne souhaite copier que les n° de comptes (colonne A) et les intitulés de comptes (colonne B).

De plus, les comptes absents doivent être copiés à partir de la ligne 5 de comparaisonBalN et comparaisonBalanceN-1 car actuellement il se positionne sur la ligne 3.

J'ai remarqué également en faisant les tests que parfois la plage activé notamment dans la feuille "BalanceN" était vers les cellules tout à fait en bas de la feuille et donc il n'y a que des cellules vides et donc elle ne copie rien. IL faudrait que une fois la macro exécutée, la cellule active soit la cellule 11.

Jje sais que j'abuse mais comme je souhaite comprendre je voudrais savoir ce que fait la ligne suivante :

- Application.ScreenUpdating = False

- On Error Resume Next

If IsError(Application.WorksheetFunction.Match(cellule, _

Sheets("BalanceN-1").Range("A11:A" & Sheets("BalanceN-1").Range("A65536").End(xlUp).Row), 0)) Then

Enfin, est ce que je peux scinder cette procédure en deux ? Je pense que oui en reprenant le corps de ta procédure.

En tous les cas je te remercie grandement et je mesure le chemin qui me reste à parcourir pour comprendre un tant soit peu les objets excel.

Après plusieurs tests, je me rends compte que par moment la macro ne fonctionne pas.

Re,

J'aurais surement du commencer par là. Voilà, j'avais écrit, avec un ami, cette procédure qui fonctionne bien mais si on l'applique à un autre classeur elle peut devenir instable. Ainsi, elle marche sur un classeur et pas sur un autre.

Quand j'avais posé la question sur un forum, il m'a été répondu que l'instabilité du code provient du fait que cells ne s'applique pas à sheets mais à worksheets. Enfin, je vous soumets cette procédure et dites moi ce qu'il faut améliorer pour que le code soit stable.

Sub ComparaisonBalanceN_1()
Worksheets("comparaisonBalanceN-1").Activate
    Dim cellule_2008 As Range
    Dim y_comparaison As Integer
    Dim range_2007, range_2008 As String

    range_2008 = "A11:A" & calcMaxRow("BalanceN-1")
    range_2007 = "A11:A" & calcMaxRow("BalanceN")

    y_comparaison = 5

     For Each cellule_2008 In Worksheets("BalanceN").Range(range_2008)
        If Worksheets("balanceN-1").Range(range_2007).Find(cellule_2008.Value, LookIn:=xlValues) Is Nothing Then
        Worksheets("ComparaisonBalanceN-1").Cells(y_comparaison, 1).Value = cellule_2008.Value
        Worksheets("ComparaisonBalanceN-1").Cells(y_comparaison, 2).Value = cellule_2008.Offset(, 1).Value
            y_comparaison = y_comparaison + 1
        End If
    Next cellule_2008
End Sub

Ici le code de la fonction que l'on a crée

Function calcMaxRow(une_feuille As String)
    Dim y As Integer

    y = 11
    Do While Sheets(une_feuille).Cells(y, 1) <> ""
        y = y + 1
    Loop

    calcMaxRow = y - 1
End Function

Merci pour votre disponibilité.

re,

Elle fonctionne. toutefois, je ne souhaite copier que les n° de comptes (colonne A) et les intitulés de comptes (colonne B).

De plus, les comptes absents doivent être copiés à partir de la ligne 5 de comparaisonBalN et comparaisonBalanceN-1 car actuellement il se positionne sur la ligne 3

La macro se positionne à la première ligne juste en dessous des titres que tu as mis dans tes feuilles. Dans ton fichier exemple tu n'en n'avais pas mis. Je l'ai placé en ligne 4 mais cela n'a pas d'importance. Il te faut simplement mettre tes titres sur une ligne en oratnt de la colonne A. La macro fera le reste.

Pour ce qui est des intiltulés A et B tu n'avais pas précisé ce que tu voulais recopier. J'ai donc supposé que tu voulais tout.

Ci dessous la procédure scindée en deux:

Sub compare1()
'Macro Dan pour rimbaut le 29/06/09 - XL Pratique
' http://www.excel-pratique.com/forum/viewtopic.php?t=12141
Dim cellule As Range
Dim lig As Integer, ligcom As Integer
Application.ScreenUpdating = False
With Sheets("BalanceN")
    For Each cellule In .Range("A11:A" & Range("A65536").End(xlUp).Row)
        On Error Resume Next
        If IsError(Application.WorksheetFunction.Match(cellule, _
                Sheets("BalanceN-1").Range("A11:A" & Sheets("BalanceN-1").Range("A65536").End(xlUp).Row), 0)) Then
            lig = cellule.Row
            ligcom = Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row + 1
            .Range("A" & cellule.Row & ":B" & cellule.Row).Copy Destination:= _
                    Sheets("ComparaisonBalanceN-1").Range("A" & ligcom)
        End If
    Next cellule
End With
End Sub
Sub compare2()
'Macro Dan pour rimbaut le 29/06/09 - XL Pratique
' http://www.excel-pratique.com/forum/viewtopic.php?t=12141
Dim cellule As Range
Dim lig As Integer, ligcom As Integer
Application.ScreenUpdating = False
With Sheets("BalanceN-1")
    For Each cellule In Worksheets("balanceN-1").Range("A11:A" & Range("A65536").End(xlUp).Row)
        On Error Resume Next
        If IsError(Application.WorksheetFunction.Match(cellule, _
                Sheets("BalanceN").Range("A11:A" & Sheets("BalanceN").Range("A65536").End(xlUp).Row), 0)) Then
            lig = cellule.Row
            ligcom = Sheets("ComparaisonBalN").Range("A65536").End(xlUp).Row + 1
            .Range("A" & cellule.Row & ":B" & cellule.Row).Copy Destination:= _
                    Sheets("ComparaisonBalN").Range("A" & ligcom)
        End If
    Next cellule
End With
End Sub

Pour l'explication :

Application.ScreenUpdating = False

Permet de ne pas voir le rafraichissement de l'écran pendant l'exécution de la macro

If IsError(Application.WorksheetFunction.Match(cellule, _...

Si la valeur n'est pas trouvée dans l'autre feuille, cela retourne une erreur au travers de laquelle je complète la feuille en question.

Amicalement

Dan

Bonjour Nad dan, bonjour à tous,

J'ai essayé ta macro. Elle me copie les titres et je ne souhaite pas copier les titres. De plus comme je te l'ai dit il faut copier les seuls numéros de comptes et les intitulés soient les colonnes A et B à l'exclusion des autres.

De plus, je ne comprends pas trop ce que fait cette instruction :

ligcom = Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row + 1

.Range("A" & cellule.Row & ":B" & cellule.Row).Copy Destination:= _

Sheets("ComparaisonBalanceN-1").Range("A" & ligcom)

N'a t'il pas un problème si la sheets est comparaisonBalanceN-1 et que la copy destination est "comparaisonBalanceN-1".

Enfin, une fois cette étape mise au point, j'aimerai faire une macro qui insère la ligne ( je dis bien la ligne) dans la colonne en fonction de l'ordre croissant des comptes.

Exemple :

si le compte 102000 est absent de la balance N, il doit apparaître avec la macro "compare1" dans la feuille "comparaisonBalN". Ensuite ce compte devra inséré, avec cette nouvelle macro, dans la balance N au dessous de, par exemple les comptes qui sont antérieurs à 102000.

Je ne sais pas si je me suis fait bien comprendre.

Je te remercie beaucoup pour ton aide

re,

Elle me copie les titres et je ne souhaite pas copier les titres. De plus comme je te l'ai dit il faut copier les seuls numéros de comptes et les intitulés soient les colonnes A et B à l'exclusion des autres.

La macro ne copie pas les titres. Es-tu sûr que ton fichier est le même que celui que tu as placé sur le fil ? Il faut te placer sur la feuille BALANCEN pour exécuter la macro COMPARE1 et sur la feuille BALANCEN-1 pour exécuter la macro COMPARE 2.

Es-ce ce que tu as fait ?

ligcom = Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row + 1
.Range("A" & cellule.Row & ":B" & cellule.Row).Copy Destination:= _ 
Sheets("ComparaisonBalanceN-1").Range("A" & ligcom) 

Dans la première instruction on récupère la dernière ligne vide en colonne A

Dans la deuxième instruction on copie les données dans la colonne A et B vers la colonne A de la feuille ComparaisonBalanceN-1.

Fais le test comme je t'ai expliqué.

Vois le fichier joint, résultat comme expliqué avant

Fichier

Dan

Re,

Je n'ai pas modifié ton fichier. J'ai également ouvert celui que tu m'as envoyé. Les 2 fichiers sont identiques. Cependant, 3 problèmes à l'exécution des macros.

1° problème:

Tu dis qu'il faut se positionner sur balanceN et balanceN-1 puis exécuter les macros. Mais si je veux faire un bouton (interface utilisateur) puis exécuter la macro, ne faut il pas activer les feuilles correspondantes comme ceci par exemple :

worksheets("balanceN").activate

2° problème :

la macro ne fonctionne pas à tous les coups. C'est à dire que par moment, elle copie les comptes manquants et par moments rien ne se passe.

3° problème :

Les comptes copiés commencent à la ligne 3 comme tu peux le constater sur la feuille "comparaisonBalanceN-1". Or, je souhaite qu'elle démarre à la ligne 5.

Je te joins le fichier.

https://www.excel-pratique.com/~files/doc2/CompareBalance.rar

A tout hasard, ne peux t'on pas améliorer le code que je t'ai donné ?

Merci pour ton aide

Re,

La macro fonctionne toujours mais copie les données en dessous des dernières.

Si les données commencent à la ligne 3 c'est parce que tu as mis la mention "Comptes à copier à la suite de la balance N-1 puis trier les données" en ligne 2.

Si tu veux commencer en ligne 5, place des titres (je suppose qu'il te faut savoir de quoi on parle) en ligne 4

J'ai fait un ptit changement (un point manquant ) donc pour faire simle remplace tes macros par celles-ci après et de cette sorte, tu pourras exécuter les macros depuis la feuille que tu souhaites

Sub compare1()
'Macro Dan pour rimbaut le 29/06/09 - XL Pratique
' http://www.excel-pratique.com/forum/viewtopic.php?t=12141
Dim cellule As Range
Dim lig As Integer, ligcom As Integer
Application.ScreenUpdating = False
With Sheets("BalanceN")
    For Each cellule In .Range("A11:A" & .Range("A65536").End(xlUp).Row)
        On Error Resume Next
        If IsError(Application.WorksheetFunction.Match(cellule, _
                Sheets("BalanceN-1").Range("A11:A" & Sheets("BalanceN-1").Range("A65536").End(xlUp).Row), 0)) Then
            lig = cellule.Row
            ligcom = Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row + 1
            .Range("A" & cellule.Row & ":B" & cellule.Row).Copy Destination:= _
                    Sheets("ComparaisonBalanceN-1").Range("A" & ligcom)
        End If
    Next cellule
End With
End Sub
Sub compare2()
'Macro Dan pour rimbaut le 29/06/09 - XL Pratique
' http://www.excel-pratique.com/forum/viewtopic.php?t=12141
Dim cellule As Range
Dim lig As Integer, ligcom As Integer
Application.ScreenUpdating = False
With Sheets("BalanceN-1")
    For Each cellule In Worksheets("balanceN-1").Range("A11:A" & .Range("A65536").End(xlUp).Row)
        On Error Resume Next
        If IsError(Application.WorksheetFunction.Match(cellule, _
                Sheets("BalanceN").Range("A11:A" & Sheets("BalanceN").Range("A65536").End(xlUp).Row), 0)) Then
            lig = cellule.Row
            ligcom = Sheets("ComparaisonBalN").Range("A65536").End(xlUp).Row + 1
            .Range("A" & cellule.Row & ":B" & cellule.Row).Copy Destination:= _
                    Sheets("ComparaisonBalN").Range("A" & ligcom)
        End If
    Next cellule
End With
End Sub

A noter que les macros n'effacent les données existantes avant le transfert.

Amicalement

Dan

Désolé Dan je dois être trop bête mais çà ne marche qu'une fois sur 2. Tu me dis pour que ça fonctionne de me mettre sur la feuille "BalanceN" et d'exécuter la macro. C'est ce que je fais mais, comme je te l'ai dit, çà ne fonctionne pas à tous les coups.

Est ce que la feuille "balanceN" doit elle être activé ? Si oui pourquoi ne pas l'activer dans le code.

Ceci dit j'ai essayé de me placer sur balanceN et sur comparaisonBalN, la macro ne fonctionne que par intermitence. Pourquoi ?

Comme cette application est destinée à des travaux comptables, tu comprends bien qu'il d'une part qu'elle puisse fonctionner dès que l'on clique sur un bouton et que nous n'oublions aucun compte.

Enfin, je souhaite que les comptes allant sur la feuille destination (soit comparaisonBalN et comparaisonBalanceN-1") soient copiés à partir de la ligne 5.

J'ai du mal à comprendre, dans ton code, où se situe le numéro de la première ligne de la feuille destination

re,

Vois le fichier joint où j'ai placé des boutons sur la feuille BALANCEN et BALANCEN-1

En ligne 4 desfeuilles Comparaison, les titres dont je t'ai parlé.

Le bouton BalanceN transfert les données vers ComparaisonBalanceN-1

Le bouton BalanceN-1 transfert les donénes vers ComparaisonBalanceN

Fichier

La macro n'efface bien sûr pas les données dans les feuilles comparaison. elle les recopie en dessous des précédentes. Chose que tu n'as pas précisée dans tes courriers.

Amicalement

Dan

Merci Dan celà fonctionne bien. En ce qui concerne les données dans les feuilles comparaison, on ne doit trouver que les comptes absents dans les balances. Donc si on n'exécute plusieurs fois la macro, il ne faut pas que celle ci recopie les comptes déja copiés au dessous. Celà ferait double emploi et serait source d'erreur.

Un grand merci pour ton aide.

Au fait, où peut on avoir des cours sur la manipulation des objetx excel avec les propriètés et les méthodes.

Encore merci et excuse moi pour avoir abusé de ta gentillesse

re,

Pas de soucis.

Dans la macro COMPARE1, mets ceci juste après "Application.ScreenUpdating = False"

If Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row = 5 Then
Sheets("ComparaisonBalanceN-1").Range("A5:B" & Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row).ClearContents
Else: Sheets("ComparaisonBalanceN-1").Range("A5:B" & Sheets("ComparaisonBalanceN-1").Range("A65536").End(xlUp).Row + 1).ClearContents
End If

Dans la macro COMPARE2, mets ceci juste après "Application.ScreenUpdating = False"

If Sheets("ComparaisonBalN").Range("A65536").End(xlUp).Row = 5 Then
Sheets("ComparaisonBalN").Range("A5:B" & Sheets("ComparaisonBalN").Range("A65536").End(xlUp).Row).ClearContents
Else: Sheets("ComparaisonBalN").Range("A5:B" & Sheets("ComparaisonBalN").Range("A65536").End(xlUp).Row + 1).ClearContents
End If

Amicalement

Dan

Edit Dan :

Au fait, où peut on avoir des cours sur la manipulation des objetx excel avec les propriètés et les méthodes.

Suis ce lien --> https://forum.excel-pratique.com/viewtopic.php?t=8069

Si ton pb est terminé' n'oublie pas de mettre RESOLU sur le fil. Explications ici --> https://forum.excel-pratique.com/viewtopic.php?t=13

Merci de ta particpation

Dan

Rechercher des sujets similaires à "comparer valeurs plages trouvant feuilles"