Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

Tonino7

XLDnaute Occasionnel
Bonjour à tous,

je m'arrache les cheveux depuis hier sur un problème INCOMPREHENSIBLE :

(ci-joint mon fichier : Free - Envoyez vos documents )

dans mon fichier, j'ai prévu une macro ("globalupdate") qui, pour résumer, me supprime toutes les lignes de l'onglet "P&L" (et l'onglet "BS" mais en l'occurence il est vide) dans lesquelles il y a un numéro de compte, et va ensuite recréer ces comptes un à un (donc réinsérer les lignes supprimées) en se basant sur la base de données de l'onglet "COA".

Voici le code principal utilisé pour la suppression des lignes où il y a des numéros de comptes :

Sub globalupdate()


Sheets("P&L").Select

For Each cell In Range("PLsize")
Line = cell.Row - 2

If cell.Value > 1 Then

NBdel = cell.Value - 1
cell.Value = 1

For N = 1 To NBdel


Sheets("P&L").Row(Line & ":" & Line).delete shift:=xlUp
Line = Line - 1
Next N
End If

Next cell
....


CONSTAT : tout se déroule à merveille, sauf pour quelques lignes impossibles à supprimer (comme la ligne 33 : compte 500103)

Je ne comprend absolument pas pourquoi cela ne marche pas pour certains comptes. J'ai tout vérifier des dizaines de fois.


Et j'ai recréer une macro quasiment -similaire, dans laquelle, je ne demande pas de supprimer des lignes, mais de les colorier en Jaune --> et bien, cela fonctionne partout. (vous pouvez tester cette macro en cliquant sur le bouton 346 (ou éxécuter macro "testu").

Cela est donc incompréhensible.


JE VOUS DEMANDE DE L'AIDE ! Merci par avance
 

Roland_M

XLDnaute Barbatruc
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

bonjour

supprimer une ligne ne modifie en rien son no ni son emplacement
exemple:
si je suis à la ligne no 5 et que je delete cette ligne (autant de fois que je veux)
je suis toujours à la ligne no 5 ! et pas no 4 puis no 3 puis no 2 . . .
donc ne pas décompter Line = Line - 1

if .. then
je delete (sans décompter)
else
je décompte (Line = Line - 1)
end if

EDIT : autre exemple de boucle
- boucle incorrecte !!!
si 1 est supprimé la ligne 2 remonte donc à la place de 1 et Lig est incrémenté à 2
donc la ligne 2 remontée à 1 ne sera pas testé !
et ce n'est plus To 100 mais 99 !!!
For Lig = 1 To 100
If Cells(Lig,1) . . . Then Rows(Lig).Delete
Next
- conclusion avec cette boucle qui commence par le bas
For Lig = 100 To 1 Step -1
If Cells(Lig,1) . . . Then Rows(Lig).Delete
Next
 
Dernière édition:

Tonino7

XLDnaute Occasionnel
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux


oui, si je delete la ligne no 5, je suis toujours à la ligne 5... mais l'objectif est de supprimer la ligne 4, et ligne 3 juste derriere... donc si je ne mets pas Line = Line -1.... je lui donnerai l'ordre de me supprimer la ligne 5 ad vitam eternam.

mais merci quand meme
 

Roland_M

XLDnaute Barbatruc
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

re
---------------------------------------------------------------
oui, si je delete la ligne no 5, je suis toujours à la ligne 5... mais l'objectif est de supprimer la ligne 4, et ligne 3 juste derriere... donc si je ne mets pas Line = Line -1.... je lui donnerai l'ordre de me supprimer la ligne 5 ad vitam eternam.
---------------------------------------------------------------
Ok mais je confirme quand même ! mais avec une boucle qui décrémente !

comme indiqué dans mon EDIT
 
Dernière édition:

Tonino7

XLDnaute Occasionnel
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux


effectivement, je viens de comprendre. Je vais tester, mais le problème c'est que j'ai 2 boucles, et c'est visiblement la premiere que je dois faire partir du bas. Or pour cette boucle, j'utilise le "for each... next". (car c'est une plage dynamique). Y'a-t-il possibilité de garder le "for each.. next"... mais dans le sens contraire? c'est à dire qu'il parte de la derniere cellule de la plage et "next" jusqu'à la premiere?
 

ROGER2327

XLDnaute Barbatruc
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

Bonjour Tonino7, Roland_M
Je ne sais pas comment utiliser la strucutre For each... ...Next à l'envers.

Mais en testant ces deux procédures, vous verrez qu'elles parcourent la même plage en sens inverses :
Code:
[COLOR="DarkSlateGray"][B]Sub tata()
Dim n&, plage, cel
   Set plage = Range("B5:B20")
   plage.ClearContents
   For Each cel In plage.Cells
      n = 1 + n
      cel.Value = n
   Next cel
End Sub

Sub toto()
Dim n&, plage, cel, i&
   Set plage = Range("B5:B20")
   plage.ClearContents
   For i = plage.Rows.Count - 1 To 0 Step -1
      n = 1 + n
      plage.Cells(1, 1).Offset(i, 0).Value = n
   Next i
End Sub[/B][/COLOR]
Vous pourrez peut-être adapter cela à votre cas. (Ne disposant pas d'Excel2007, je n'ai pas ouvert votre classeur.)​
ROGER2327
#3227
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…