Etrange décalage de cellule sur un FOR EACH

Bonjour cher forumeur !!

Voici ce qui m'amène.. n'ayant pas non plus trouver de réponse ailleurs

Lorsque je fais une boucle "For each" dans une feuille pour copier les lignes de cette feuille dans une autre (une consolidation de feuille en quelques sortes ! ), tout se passe bien !

Lorsque je fais cette boucle dans une autre boucle passant en revue toutes les feuilles, afin de recopier toutes les lignes de chaque feuille dans la feuille de consolidation, il beugue !! Pourtant, l'intérieur de la nouvelle boucle (pour passer en revue chaque cellule de la feuille) reste la même qu'auparavant.

La contrainte de consolidation, c'est l'année !

Je veux que chaque ligne correspondant à la date demandée en feuille "consolidation" soit réécrite dans cette dernière.

J'ai mis une msgbox juste après l'appel de la boucle for each cel in plage, et bizarre.. il ne me sort pas la bonne cellule en réponse. Je vous laisse constater sur le fichier joint..

infos :

feuille 1 : datas, où seront récupérées les données pour les feuilles mensuelles

feuille 2 : récap, par année

feuille 3 à dWs : Mois

Si quelqu'un a une idée.. svouplé..

Merci beaucoup !!

Voici le code que je mets pour le "for each ws in worksheets"

Mes variables sont normalement définis comme il faut ... ?!? ...

For Each ws In Worksheets
    If ws.Name <> "DATA" Or ws.Name <> "TDB" Then
        With ws
        dl = .Range("A1").End(xlDown).Row
        Set Plage = .Range("A2:A" & dl)
            For Each cel In Plage
MsgBox "Année Cellule : " & cel & Chr(10) & Chr(10) & "Année de référence : " & Worksheets("TDB").Range("A1")
                If Year(cel) = Worksheets("TDB").Range("A1").Value Then
                Worksheets("TDB").Cells(j, 1).Value = cel.Value
                Worksheets("TDB").Cells(j, 2).Value = cel.Offset(0, 1).Value
                Worksheets("TDB").Cells(j, 3).Value = cel.Offset(0, 2).Value
'                Worksheets("TDB").Cells(j, 4).Value = _
'                    Worksheets("TDB").Cells(j, 3).Value + Worksheets("TDB").Cells(j - 1, 4).Value
                Worksheets("TDB").Cells(j, 5).Value = cel.Offset(0, 4).Value
                j = j + 1
                End If
            Next cel
        Set Plage = Nothing
        End With
    End If
Next ws

Ps: Galopin01, si tu me lis, je te répond très bientôt en parallèle.. et te remercie pour ta patience

Bonjour,

Hum... Je te dis ça en toute amitié... Hein !

T'es vraiment un salopard !

Option Explicit
Dim ws As Long 'Worksheet
Dim Plage As Range
Dim cel As Variant
Dim sysdate As Date

Dim i As Long
Dim j As Long
Dim dl As Long
Dim l As Long
Dim l2 As Long

Sub recap()
Dim ws As Worksheet
Dim Plage As Range
Dim cel As Variant

Dim i As Long
Dim j As Long

Dim dl As Long
Dim l As Long
Dim l2 As Long

Comment que tu veux que VBA il y retrouve ses petits ?

Moi, normalement je me penche même pas sur un code qui commence comme ça !

Moi je te recommande de ne jamais mettre de variable "hors Sub". Sauf exception dument motivée...

Ne jamais utiliser la variable " l " (qui ressemble trop à un i ou à un 1)

N'utiliser les variables "en une seule lettre" (i, j, k...) que dans des compteurs de boucles...

Indépendamment de ce qui est dit plus haut, cette structure est déconnante :

Sub test()
Dim ws As Worksheet
For Each ws In Worksheets
    If Worksheets(ws).Name <> "DATA" Or Worksheets(ws).Name <> "TDB" Then
      MsgBox Worksheets(ws).Name
    End If
Next
End Sub

Explication :C'est le Or qui est déconnant !

Une fois qu'on a corrigé le problème d'instanciation voici pourquoi c'est déconnant...

Teste cette macro :

Sub test()
Dim ws As Worksheet
For Each ws In Worksheets
    If ws.Name <> "DATA" Or ws.Name <> "TDB" Then
      MsgBox ws.Name
    End If
Next
End Sub

Comme tu peux le voir le Or annule l'exclusion...

Je te laisse corriger.

Remarque : Si tu as une feuille qui fait une consolidation tu l'appelles "Conso" parce que moi entre "DATA" et "TDB" j'en suis encore à me demander laquelle fait une "conso"

Enfin les Sub vont normalement dans Module1, sauf celles des USF (œuf corse...)

A l'exception des Evènementielles prédéfinies ( du type Worksheet_Change...) en principe tu n'as aucune raison de pondre des Private Sub. Dans quelques années quand tu maitrisera un peu mieux le VBA, tu pourras pour d'obcures raisons t'amuser à pondre du code dans les modules de feuille mais dans l'ensemble il n'y a aucune raison valable de prendre cette mauvaise habitude.

A+

Mille merci Galopin01 !!

j'ai compris d'où venait l'erreur, même si j'ai encore un peu de mal à comprendre pourquoi pas le "or"..

La réponse pour d'autres personnes qui auraient ce soucis (en tout cas moi ça fonctionne comme ça.. ) :

- au lieu de noter " If ws.Name <> "DATA" Or ws.Name <> "TDB" Then "

=> noter plutôt : " If ws.Name <> "DATA" AND ws.Name <> "TDB" Then"

Encore merci, et je reviens très vite vers toi par mail pour l'autre topic, je suis vraiment DEBORDE ces temps-ci.. !!!

ps : j'ai bien pris en compte tout ce que tu m'as écrit, c'est très gentil d'ailleurs de m'avoir fait ce petit topo, et je t'en remercie beaucoup ! j'ai encore beaucoup de travail !! lol

- je vais modifier tout ça

Rechercher des sujets similaires à "etrange decalage each"