Code pour supprimer et réagencer les lignes en fonction

Bonjour à tous,

J'aimerai en fonction du résultat d'une cellule, supprimer une ligne et remonter les suivante. Exemple :

capture d ecran 5

Dans l'image, la cellule B5 est égal à 0. Du coup il faudrait que toute la ligne 5 soit supprimée et que la ligne 6 remonte d'un cran (afin qu'il n'y est pas de vide).

En résumé, si le chiffre dans la colonne C est égal à 0, alors la ligne correspondante est supprimée et la ligne suivante prend sa place.

Je ne sais pas s'il vous sera utile, dans le doute je vous joins le fichier correspondant à l'image.

Merci d'avance ;)

bonjour,

La macro correspond à votre besoin :

Sub test()
Feuil1.Rows(5).Delete
End Sub

Après pour améliorer la chose il faudrait savoir, quand et comment on lance la macro. S'il n'y a qu'un tableau qui peut comporter un nombre de lignes variables ou non. Si c'est toujours la colonne B qui doit être évaluée... Enfin tout un tas d'explication que vous ne donnez pas.

A+

Bonsoir,

Merci pour le coup de main mais je crois bien que dans votre code ne prend pas en compte la valeur des cellules de la colonne B.

Pour répondre à vos interrogations, :

quand et comment on lance la macro

Je ne le sais pas encore, j'évaluerai la chose au moment de l'insérer dans le fichier de destination.

S'il n'y a qu'un tableau qui peut comporter un nombre de lignes variables ou non

Le nombre de tableau et de lignes sont variables. Cependant ce sera toujours la colonne B qui sera évaluée.

Dans l'idée je pensais à un "truc" qui utiliserai if, .... Si la colonne B est égal à 0 alors la ligne correspondante est supprimée… Mais je n'ai pas réussi à le rendre fonctionnel ...

Je suis bloqué à ceci :

Sub test()

If Cells(5, 2) = 0 Then      'Si la cellule B5 est égal à 0 alors

Feuil1.Rows(5).Delete        'La ligne 5 est supprimée
End If
End Sub

Comment dire que c'est toute la colonne B qui est évaluée et que la ligne à supprimer n'est pas "fixe" mais dépend de la cellule qui contient la valeur 0 ?

S'il y a plusieurs tableaux sont-ils consécutifs ?

Est-ce qu'ils commencent bien à la cellule A1 et il ne doit pas y avoir de lignes vides entre...

En règle générale un fichier joint plus ou moins conforme à l'original devrait être joint. Cela évite d'avoir à "tirer les vers du nez" pour tout savoir avant de commencer à programmer.

Nota : Idéalement on évite de lire des Cells comme vous suggérez car (cela est très chronophage)

On essaie de stocker les données dans un tableau virtuel et seule la suppression se fait sur la feuille. Mais c'est très difficile à faire avec une boule de cristal !

A+

Le fichier que vous demandez n'est pas encore créé, raison pour laquelle il n'est pas en pièce jointe.

Mais tel que je le vois il devrait très probablement correspondre à une trame déjà existante que je vous joins.

Est-ce qu'ils commencent bien à la cellule A1 et il ne doit pas y avoir de lignes vides entre...

Non ça c'est une certitude, il ne commencera pas par la cellule A1. Est-ce vraiment rédhibitoire les lignes vides ?... car il y'en aura.

10trame.xlsm (17.74 Ko)

Je prends également bonne note de votre conseil concernant Cells ;)

Il n'y a jamais rien de rédhibitoire... à condition de disposer du fichier.

Cependant cela est certainement une erreur de conception de commencer des tableaux à des endroits flottants.

Un tableau de travail Excel n'est pas une présentation Powerpoint.

Si on veut une présentation à imprimer on commence d'abord par préparer les données dans des tableaux standard (en A1) et après on présente ce qu'on veut ou on veut avec des titres, des explications... Bref un tableau de an'est pas un cahier d'écolier...

Pour développer un peu mon explication, sans même parler du temps que prend telle ou telle méthode, comprenez simplement que la suppression d'une ligne entraine de ce fait la renumérotation des lignes suivantes.

S'il y a des cellules vides dans des lignes qu'il ne faut pas supprimer cela suppose d'évaluer différemment la situation "vide" de "zéro"...

En général pour faire des suppression de lignes, on commence par la dernière ligne et on remonte à la première.

Bref la programmation VBA est rarement aussi simple que qu'on pourrait l'imaginer à première vue !

C'est la raison pour laquelle personnellement j'évite de faire des programmation douteuse sur des exemples trop simpliste : C'est en général du temps perdu car après il survient généralement 3 douzaine de question subsidiaires qui font que la question finale est à cent lieues du point de départ...

A+

Bref la programmation VBA est rarement aussi simple que qu'on pourrait l'imaginer à première vue !

C'est la raison pour laquelle personnellement j'évite de faire des programmation douteuse sur des exemples trop simpliste : C'est en général du temps perdu car après il survient généralement 3 douzaine de question subsidiaires qui font que la question finale est à cent lieues du point de départ...

Je crois que la définition du VBA n'a jamais été aussi bien faite 😂😂😂

Je comprends tout ce que vous dites, simple question : Quand vous dites

on commence d'abord par préparer les données dans des tableaux standard (en A1)

A1 représente une cellule fixe, mais qui peut être B4, E10, ... ? ou il faut absolument que ce soit A1 ?

Quand à la renumérotation des lignes, je n'y avait pas pensé. Est-ce qu'il n'y aurait pas un moyen autre pour arriver à ce résultat ?

Il y a des milliers d'options pour se compliquer la vie... Cependant la règle de base est celle-ci !

voir à ce sujet ici

A+

bonsoir,

D'accord, le layout n'est pas vraiment simple, mais avec une plage nommée, on sait faire beaucoup.

4trame.xlsm (25.23 Ko)
Sub Sotin()
     Dim iAR
     For Each ar In Range("Sotin").Areas     'boucle les areas dans la plage nommées "Sotin"
          iAR = ar.Row + ar.Rows.Count - 1     'numéro de la dernière ligne de cet area
          i = ar.Row     'première ligne de cet area
          Do     'boucle
               Set c = Cells(i, "C")     'cellule en colonne C
               If c.Value = 0 And c.Value <> "" Then     'contient valeur 0 et n'est pas vide
                    If c.Row < iAR Then     'on n'est pas dans la dernière ligne de cet area
                         With c.Offset(, -2).Resize(iAR - c.Row, 19)
                              .Value = .Offset(1).Value     'copier la ligne en bas 1 ligne plus haut
                         End With
                    End If
                    Cells(iAR, 1).Resize(, 19).ClearContents     'effacer dernière ligne
               Else
                    i = i + 1     'ligne suivante
               End If
          Loop While i <= iAR     '
     Next
End Sub

Bonjour galopin01,

Je prend bonne note de votre site et vais m'instruire de ce côté ;) merci !

Bonjour BsAlv,

Merci pour votre aide, le fichier fonctionne bien. Il me faut maintenant trouver une solution pour rendre variable la plage nommée ;)

Bonne journée à tous !

bonjour, vous savez expliquer cela ? Vous avez des marquages quelque part.

Supposons en colonne S les cellules "abc" marquent la ligne avant et après une plage. Cela vous convient ou savez-vous m'expliquer d'une autre manière ?

12trame.xlsm (28.06 Ko)

Re,

C'est exactement cela ... Parfait merci beaucoup pour le coup de main ! ;)

Rechercher des sujets similaires à "code supprimer reagencer lignes fonction"