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
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 SubAmicalement
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 SubIci 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 FunctionMerci 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 SubSub 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 SubPour l'explication :
Application.ScreenUpdating = FalsePermet 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
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
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 SubSub 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 SubA 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
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 IfDans 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 IfAmicalement
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