Lister une plage de cellules pour pouvoir les comparer

Sylvagreg

XLDnaute Nouveau
Bonjour,

Je suis débutant et bricole avec ce que je trouve sur ce type de forum.
Là je coince, la définition des plages ne fonctionne pas. Est ce que quelqu'un pourrait me corriger le code?
Merci d'avance:mad:

' Fusion
Dim i&, j&, DerL&
Dim Ws1 As Worksheet, Ws2 As Worksheet
Dim PlageWs1 As Range, PlageWs2 As Range
Set Ws1 = Worksheets("Fusion"): Set Ws2 = Worksheets("Salaires au 31 12")
Set PlageWs1 = (Cells(i, 2), Cells(i, 4))
Set PlageWs2 = (Cells(j, 2), Cells(j, 4))

With Ws2
For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
DerL = Ws1.Cells(Rows.Count, 1).End(xlUp)(2).Row
If Not IsError(Application.Match(PlageWs1, PlageWs2, 0)) Then
For j = 1 To DerL
If (Cells(j, 2) + Cells(j, 3) + Cells(j, 4)) = (.Cells(i, 2) + .Cells(i, 3) + .Cells(i, 4)) Then
Ws1.Cells(j, 18) = .Cells(i, 13)
Ws1.Cells(j, 19) = .Cells(i, 14)
Ws1.Cells(j, 20) = .Cells(i, 17)
End If
Next
Else
Ws1.Cells(DerL, 1) = .Cells(i, 1)
Ws1.Cells(DerL, 2) = .Cells(i, 2)
Ws1.Cells(DerL, 3) = .Cells(i, 3)
Ws1.Cells(DerL, 4) = .Cells(i, 4)
Ws1.Cells(DerL, 5) = .Cells(i, 5)
Ws1.Cells(DerL, 6) = .Cells(i, 6)
Ws1.Cells(DerL, 7) = .Cells(i, 7)
Ws1.Cells(DerL, 8) = .Cells(i, 8)
Ws1.Cells(DerL, 9) = .Cells(i, 9)
Ws1.Cells(DerL, 10) = .Cells(i, 10)
Ws1.Cells(DerL, 11) = .Cells(i, 11)
Ws1.Cells(DerL, 12) = .Cells(i, 12)
Ws1.Cells(DerL, 15) = .Cells(i, 15)
Ws1.Cells(DerL, 16) = .Cells(i, 16)
Ws1.Cells(DerL, 18) = .Cells(i, 13)
Ws1.Cells(DerL, 19) = .Cells(i, 14)
Ws1.Cells(DerL, 20) = .Cells(i, 17)
DerL = DerL + 1
End If
Next
End With
End Sub
 

Pierrot93

XLDnaute Barbatruc
Re : Lister une plage de cellules pour pouvoir les comparer

Bonjour,

Set PlageWs1 = (Cells(i, 2), Cells(i, 4))

quand tu veux initialiser ta plage, les variables i et j ne sont pas définies, donc valent 0.... inspire toi peut être de ceci :
Code:
Dim i As Long, PlageWs1 As Range
i = 1
Set PlageWs1 = Cells(i, 2).Resize(, 3)
PlageWs1.Select

bonne journée
@+
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Lister une plage de cellules pour pouvoir les comparer

Bonjour Sylvagreg et bienvenu, Pierrot, bonjour le forum,

Essaie comme ça :
Code:
Sub Macro1()
Dim i&, j&, DerL&
Dim Ws1 As Worksheet, Ws2 As Worksheet
Dim PlageWs1 As Range, PlageWs2 As Range

Set Ws1 = Worksheets("Fusion"): Set Ws2 = Worksheets("Salaires au 31 12")
Set PlageWs1 = Ws1.Range(Ws1.Cells(i, 2), Ws1.Cells(i, 4))
Set PlageWs2 = Ws2.Range(Ws2.Cells(j, 2), Ws2.Cells(j, 4))
With Ws2
    For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
        DerL = Ws1.Cells(Rows.Count, 1).End(xlUp)(2).Row
        If Not IsError(Application.Match(PlageWs1, PlageWs2, 0)) Then
            For j = 1 To DerL
                If Ws1.Range(Ws1.Cells(j, 2) + Ws1.Cells(j, 3) + Ws1.Cells(j, 4)) = .Range(.Cells(i, 2) + .Cells(i, 3) + .Cells(i, 4)) Then
                    Ws1.Cells(j, 18) = .Cells(i, 13)
                    Ws1.Cells(j, 19) = .Cells(i, 14)
                    Ws1.Cells(j, 20) = .Cells(i, 17)
                End If
            Next
        Else
            Ws1.Cells(DerL, 1) = .Cells(i, 1)
            Ws1.Cells(DerL, 2) = .Cells(i, 2)
            Ws1.Cells(DerL, 3) = .Cells(i, 3)
            Ws1.Cells(DerL, 4) = .Cells(i, 4)
            Ws1.Cells(DerL, 5) = .Cells(i, 5)
            Ws1.Cells(DerL, 6) = .Cells(i, 6)
            Ws1.Cells(DerL, 7) = .Cells(i, 7)
            Ws1.Cells(DerL, 8) = .Cells(i, 8)
            Ws1.Cells(DerL, 9) = .Cells(i, 9)
            Ws1.Cells(DerL, 10) = .Cells(i, 10)
            Ws1.Cells(DerL, 11) = .Cells(i, 11)
            Ws1.Cells(DerL, 12) = .Cells(i, 12)
            Ws1.Cells(DerL, 15) = .Cells(i, 15)
            Ws1.Cells(DerL, 16) = .Cells(i, 16)
            Ws1.Cells(DerL, 18) = .Cells(i, 13)
            Ws1.Cells(DerL, 19) = .Cells(i, 14)
            Ws1.Cells(DerL, 20) = .Cells(i, 17)
            DerL = DerL + 1
        End If
    Next
End With
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Lister une plage de cellules pour pouvoir les comparer

Bonjour le fil, bonjour le forum,

Oui là c'est la réponse de Pierrot qui l'explique. Tu définis ta plage avant la boucle For i = 1 to... Donc i = 0 et forcément ça plante (idem pour j) :
Essaie comme ça :
Code:
Sub Macro1()
Dim i&, j&, DerL&
Dim Ws1 As Worksheet, Ws2 As Worksheet
Dim PlageWs1 As Range, PlageWs2 As Range

Set Ws1 = Worksheets("Fusion"): Set Ws2 = Worksheets("Salaires au 31 12")
With Ws2
    For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
        Set PlageWs1 = Ws1.Range(Ws1.Cells(i, 2), Ws1.Cells(i, 4))
        DerL = Ws1.Cells(Rows.Count, 1).End(xlUp)(2).Row
        If Not IsError(Application.Match(PlageWs1, PlageWs2, 0)) Then
            For j = 1 To DerL
                Set PlageWs2 = Ws2.Range(Ws2.Cells(j, 2), Ws2.Cells(j, 4))
                If Ws1.Range(Ws1.Cells(j, 2) + Ws1.Cells(j, 3) + Ws1.Cells(j, 4)) = .Range(.Cells(i, 2) + .Cells(i, 3) + .Cells(i, 4)) Then
                    Ws1.Cells(j, 18) = .Cells(i, 13)
                    Ws1.Cells(j, 19) = .Cells(i, 14)
                    Ws1.Cells(j, 20) = .Cells(i, 17)
                End If
            Next
        Else
            Ws1.Cells(DerL, 1) = .Cells(i, 1)
            Ws1.Cells(DerL, 2) = .Cells(i, 2)
            Ws1.Cells(DerL, 3) = .Cells(i, 3)
            Ws1.Cells(DerL, 4) = .Cells(i, 4)
            Ws1.Cells(DerL, 5) = .Cells(i, 5)
            Ws1.Cells(DerL, 6) = .Cells(i, 6)
            Ws1.Cells(DerL, 7) = .Cells(i, 7)
            Ws1.Cells(DerL, 8) = .Cells(i, 8)
            Ws1.Cells(DerL, 9) = .Cells(i, 9)
            Ws1.Cells(DerL, 10) = .Cells(i, 10)
            Ws1.Cells(DerL, 11) = .Cells(i, 11)
            Ws1.Cells(DerL, 12) = .Cells(i, 12)
            Ws1.Cells(DerL, 15) = .Cells(i, 15)
            Ws1.Cells(DerL, 16) = .Cells(i, 16)
            Ws1.Cells(DerL, 18) = .Cells(i, 13)
            Ws1.Cells(DerL, 19) = .Cells(i, 14)
            Ws1.Cells(DerL, 20) = .Cells(i, 17)
            DerL = DerL + 1
        End If
    Next
End With
End Sub
 

Sylvagreg

XLDnaute Nouveau
Re : Lister une plage de cellules pour pouvoir les comparer

Bon alors là il bug sur
If Not IsError(Application.Match(PlageWs1, PlageWs2, 0)) Then
Je pense comprendre car la plageWs2 est définie après cette ligne.

Je suis vraiment complètement novice. Donc j'avais bien vu le message de Pierrot mais ne savait pas quoi en faire.
Comme dans le cas présent je pense déceler le problème mais suis incapable d'apporter une solution! Tu définis la valeur initiale de j après donc si on remonte la définition de plage on va arriver au même problème que précédemment??!!??
Merci à vous.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Lister une plage de cellules pour pouvoir les comparer

Bonjour Sylvareg, bonjour le forum,

je ne peux malheureusement t'aider davantage car je n'ai toujours pas compris comment fonctionne le mot Match dont l'aide est inexistante dans la version 2003. Je n'utilise jamais ce mots dans mes codes car je lui préfère Find que je maîtrise un peu mieux. Cependant, je pense que ça pourrait peut-être fonctionner comme ça :
Code:
Sub Macro1()
Dim i&, j&, DerL&
Dim Ws1 As Worksheet, Ws2 As Worksheet
Dim PlageWs1 As Range, PlageWs2 As Range

Set Ws1 = Worksheets("Fusion"): Set Ws2 = Worksheets("Salaires au 31 12")
DerL = Ws1.Cells(Rows.Count, 1).End(xlUp)(2).Row
With Ws2
    For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
        Set PlageWs1 = Ws1.Range(Ws1.Cells(i, 2), Ws1.Cells(i, 4))
        For j = 1 To DerL
            Set PlageWs2 = Ws2.Range(Ws2.Cells(j, 2), Ws2.Cells(j, 4))
            If Not IsError(Application.Match(PlageWs1, PlageWs2, 0)) Then
                If Ws1.Range(Ws1.Cells(j, 2) + Ws1.Cells(j, 3) + Ws1.Cells(j, 4)) = .Range(.Cells(i, 2) + .Cells(i, 3) + .Cells(i, 4)) Then
                    Ws1.Cells(j, 18) = .Cells(i, 13)
                    Ws1.Cells(j, 19) = .Cells(i, 14)
                    Ws1.Cells(j, 20) = .Cells(i, 17)
                End If
            Else
                Ws1.Cells(DerL, 1) = .Cells(i, 1)
                Ws1.Cells(DerL, 2) = .Cells(i, 2)
                Ws1.Cells(DerL, 3) = .Cells(i, 3)
                Ws1.Cells(DerL, 4) = .Cells(i, 4)
                Ws1.Cells(DerL, 5) = .Cells(i, 5)
                Ws1.Cells(DerL, 6) = .Cells(i, 6)
                Ws1.Cells(DerL, 7) = .Cells(i, 7)
                Ws1.Cells(DerL, 8) = .Cells(i, 8)
                Ws1.Cells(DerL, 9) = .Cells(i, 9)
                Ws1.Cells(DerL, 10) = .Cells(i, 10)
                Ws1.Cells(DerL, 11) = .Cells(i, 11)
                Ws1.Cells(DerL, 12) = .Cells(i, 12)
                Ws1.Cells(DerL, 15) = .Cells(i, 15)
                Ws1.Cells(DerL, 16) = .Cells(i, 16)
                Ws1.Cells(DerL, 18) = .Cells(i, 13)
                Ws1.Cells(DerL, 19) = .Cells(i, 14)
                Ws1.Cells(DerL, 20) = .Cells(i, 17)
                DerL = DerL + 1
            End If
        Next j
    Next i
End With
End Sub
 

Sylvagreg

XLDnaute Nouveau
Re : Lister une plage de cellules pour pouvoir les comparer

Maintenant j'ai toujours une erreur 1004
Avec comme message "Méthode Range de l'objet Worsheet a échoué
et le débogage se positionne sur la ligne suivante:
If Ws1.Range(Ws1.Cells(j, 2) + Ws1.Cells(j, 3) + Ws1.Cells(j, 4)) = .Range(.Cells(i, 2) + .Cells(i, 3) + .Cells(i, 4)) Then
 

Pierrot93

XLDnaute Barbatruc
Re : Lister une plage de cellules pour pouvoir les comparer

Re, bonsoir Robert:)

Code:
If Ws1.Cells(j, 2) & Ws1.Cells(j, 3) & Ws1.Cells(j, 4)) = .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4)) Then

en supposant que le code soit placé au bon endroit et que les différentes variables soient bien initialisées....

A noter tout de même, avec un tout petit fichier en pièce jointe ne représentant que le problème posé, avec le modèle de données et le résultat attendu, tu aurais déjà la réponse....
 

Sylvagreg

XLDnaute Nouveau
Re : Lister une plage de cellules pour pouvoir les comparer

Pierrot,

Cela ne marche toujours pas.
Cijoint un fichier
Je veux qu'il me retrouve donc les données du 31/12 à mettre en face de celles du 30/09.
Mais j'ai des changements de société, des salariés sortis, d'autres entrés, des homonymes...
Il faut qu'il me récupère tout cela.
Merci d'avance
 

Pièces jointes

  • Augmentations annuelles Evolution réelle2.xls
    67 KB · Affichages: 49

Pierrot93

XLDnaute Barbatruc
Re : Lister une plage de cellules pour pouvoir les comparer

Bonjour,

tu peux de toute façon enlever ce test :
Code:
If Not IsError(Application.Match(PlageWs1, PlageWs2, 0)) Then
"Application.Match" ne compare pas 2 plages de cellules mais recherche une valeur spécifique dans une plage....

bonne joutrnée
@+
 

Pierrot93

XLDnaute Barbatruc
Re : Lister une plage de cellules pour pouvoir les comparer

Re,

code un peu retouché, à tester :
Code:
Option Explicit
Sub Macro1()
Dim i&, j&, Ws1 As Worksheet, Ws2 As Worksheet
Sheets("Fusion").Cells.ClearContents
Sheets("Salaires actuels").Copy Sheets("Fusion").Range("A1")
Set Ws1 = Worksheets("Fusion"): Set Ws2 = Worksheets("Salaires au 31 12")
     With Ws2
         For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
             For j = 1 To Ws1.Cells(Rows.Count, 1).End(xlUp)(2).Row
                If (Ws1.Cells(j, 2) & Ws1.Cells(j, 3) & Ws1.Cells(j, 4)) = (.Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4)) Then
                    Ws1.Cells(j, 18) = .Cells(i, 13)
                    Ws1.Cells(j, 19) = .Cells(i, 14)
                    Ws1.Cells(j, 20) = .Cells(i, 17)
                 Else
                     Ws1.Cells(DerL, 1) = .Cells(i, 1)
                     Ws1.Cells(DerL, 2) = .Cells(i, 2)
                     Ws1.Cells(DerL, 3) = .Cells(i, 3)
                     Ws1.Cells(DerL, 4) = .Cells(i, 4)
                     Ws1.Cells(DerL, 5) = .Cells(i, 5)
                     Ws1.Cells(DerL, 6) = .Cells(i, 6)
                     Ws1.Cells(DerL, 7) = .Cells(i, 7)
                     Ws1.Cells(DerL, 8) = .Cells(i, 8)
                     Ws1.Cells(DerL, 9) = .Cells(i, 9)
                     Ws1.Cells(DerL, 10) = .Cells(i, 10)
                     Ws1.Cells(DerL, 11) = .Cells(i, 11)
                     Ws1.Cells(DerL, 12) = .Cells(i, 12)
                     Ws1.Cells(DerL, 15) = .Cells(i, 15)
                     Ws1.Cells(DerL, 16) = .Cells(i, 16)
                     Ws1.Cells(DerL, 18) = .Cells(i, 13)
                     Ws1.Cells(DerL, 19) = .Cells(i, 14)
                     Ws1.Cells(DerL, 20) = .Cells(i, 17)
                 End If
             Next j
         Next i
     End With
End Sub
 

Sylvagreg

XLDnaute Nouveau
Re : Lister une plage de cellules pour pouvoir les comparer

Merci Pierrot

Il m'a bloqué sur la ligne de copie alors j'ai remis le code que j'avais mis au début.
Mais maintenant il bloque sur la ligne
Ws1.Cells(DerL, 1) = .Cells(i, 1)
La première après le Else
 

Sylvagreg

XLDnaute Nouveau
Re : Lister une plage de cellules pour pouvoir les comparer

Avec le code entier ce sera mieux!!


Sub Macro1()
Dim i&, j&, Ws1 As Worksheet, Ws2 As Worksheet
Sheets("Fusion").Cells.ClearContents
Sheets("Salaires actuels").Select
Cells.Select
Selection.Copy
Sheets("Fusion").Select
Cells.Select
ActiveSheet.Paste
Range("a1").Select
Set Ws1 = Worksheets("Fusion"): Set Ws2 = Worksheets("Salaires au 31 12")
With Ws2
For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
For j = 1 To Ws1.Cells(Rows.Count, 1).End(xlUp)(2).Row
If (Ws1.Cells(j, 2) & Ws1.Cells(j, 3) & Ws1.Cells(j, 4)) = (.Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4)) Then
Ws1.Cells(j, 18) = .Cells(i, 13)
Ws1.Cells(j, 19) = .Cells(i, 14)
Ws1.Cells(j, 20) = .Cells(i, 17)
Else
Ws1.Cells(DerL, 1) = .Cells(i, 1)
Ws1.Cells(DerL, 2) = .Cells(i, 2)
Ws1.Cells(DerL, 3) = .Cells(i, 3)
Ws1.Cells(DerL, 4) = .Cells(i, 4)
Ws1.Cells(DerL, 5) = .Cells(i, 5)
Ws1.Cells(DerL, 6) = .Cells(i, 6)
Ws1.Cells(DerL, 7) = .Cells(i, 7)
Ws1.Cells(DerL, 8) = .Cells(i, 8)
Ws1.Cells(DerL, 9) = .Cells(i, 9)
Ws1.Cells(DerL, 10) = .Cells(i, 10)
Ws1.Cells(DerL, 11) = .Cells(i, 11)
Ws1.Cells(DerL, 12) = .Cells(i, 12)
Ws1.Cells(DerL, 15) = .Cells(i, 15)
Ws1.Cells(DerL, 16) = .Cells(i, 16)
Ws1.Cells(DerL, 18) = .Cells(i, 13)
Ws1.Cells(DerL, 19) = .Cells(i, 14)
Ws1.Cells(DerL, 20) = .Cells(i, 17)
End If
Next j
Next i
End With
End Sub
 

Discussions similaires

Réponses
11
Affichages
297
Réponses
0
Affichages
154

Statistiques des forums

Discussions
312 294
Messages
2 086 891
Membres
103 404
dernier inscrit
sultan87