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 !
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..
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