Supprimer des lignes suivant certaines conditions

Bonjour,

Je souhaiterais avoir de l'aide pour m'aider à réaliser une macro dans mon fichier Excel (voir pièce jointe).

Il s'agit d'une extraction de nomenclature, dans laquelle on retrouve notamment le niveau d'arborescence, la référence et le type d'article.

En fait, je veux supprimer les lignes correspondant aux articles de type H, S ou SH, ainsi que leur décomposition, jusqu'à revenir à un niveau d’arborescence identique ou inférieur. Pour faciliter mon explication, j'ai mis en rouge les lignes à supprimer.

Pour expliquer un peu le fonctionnement, un article de niveau 2 fait partie de la décomposition de l'article de niveau 1 ; un article de niveau 6 fait partie de la décomposition de l'article de niveau 5...

Je remercie d'avance tous ceux qui pourrons m'aider.

Bonsoir,

N'hésitez pas à me demander plus d'infos si quelque-chose ne vous parait pas clair.

J'ai essayé différentes idées dans la journée, mais rien n'a été concluant.

Merci

Bonsoir

Ok pour les lignes 4, 6, 11, 13, 19, 23.

Mais qu'est ce qui permettrait d'identifier les lignes 12, 20, 21, 22, 24 et 25 ?

Et comme à mon habitude je ne saurais trop vous conseiller l'utilisation de tableaux structurés.

Merci pour votre réponse.

Par exemple, on voit que la ligne 11 est un article de type S. C'est donc une ligne à supprimer. Son niveau d'arborescence est 3. Cet article est composé de 2 autres articles (4 dans l'arborescence) qu'il faut également supprimer, quelque soit le type d'article.

Pour la ligne 19, qui est un article de type SH, il faut la supprimer, mais également tous les articles qui le compose. Un niveau 5 est inclus dans un niveau 4, et un niveau 6 est inclus dans un niveau 5. Donc si on supprime un article de niveau 4, on supprime également ses constituants de niveaux 5 et 6.

Pour mieux expliquer, on peux imaginer qu'un niveau 4 correspond au moteur d'une voiture. Celui-ci est composé de plusieurs éléments qui correspondent donc à un niveau 5. Chaque élément est constitué de différentes pièces, qui sont donc un niveau 6. Donc, quand je veux supprimer le ligne qui correspond au moteur, il faut également supprimer tous les constituant de celui-ci.

Attention, si j'ai plusieurs moteurs, je ne veux en supprimer que certains. Ceux qui sont marqués S, H, ou SH.

J'espère avoir donné de meilleures explications.

Merci

D'accord mais il reste un problème pour les lignes 22, 24 et 25.

En ligne 22 l'article est en SH mais le niveau est supérieur à la ligne 21 donc non inclus. Idem pour la ligne 24 et par conséquent pour la ligne 25.

Bonne journée.

L'article de la ligne 19 est de niveau 4. Tout ce qui est en dessous (lignes 20 à 25) est inclus dans l'article de la ligne 19.

On arrête de supprimer les lignes quand le niveau d'arborescence devient égale ou inférieur. Donc quand on supprime une ligne de niveau 4, on supprime toutes les lignes suivantes de niveaux 5, 6 et plus, et on s'arrête quand on retrouve un niveau 4, 3, 2 ou 1. En l’occurrence, dans mon cas, on trouve en ligne 22 un article de niveau 2 (que je ne veux pas supprimer).

Est-ce plus clair pour vous ?

Merci

Bonjour,

Je suis inquiet de voir que je n'ai pas de réponse à mon problème. Sur ce forum, je trouve toujours une solution aux problèmes Excel.

Est-ce que ce sont mes explications qui ne sont pas claires, ou est-ce simplement qu'il faut beaucoup de réflexion pour trouver la macro adéquat ? Demain, je vais continuer de me pencher sur le problème, mais galère, galère...

Merci

Bonjour

C'est juste que vos conditions ne me semble pas rationnelles.

On considère qu'une valeur "S", "H" ou "SH" en colonne D déclenche la suppression avec un niveau de la colonne A qu'on mémorise.

Tant que le niveau en A est supérieur au niveau mémorisé e t que rien ne change en colonne D on supprime. Si le niveau en A devient inférieur ou égal au niveau mémorisé en arrête la suppression jusqu'au prochain indicateur en colonne D. Jusque là pas de problème. En ligne 4 on commence à supprimer. En ligne 5 le niveau en A arrête la suppression. Même chose en ligne 6 et 7 jusqu'à la ligne 11 où on trouve un nouveau déclencheur. Donc on supprime et on mémorise le niveau (3).

En ligne 13 nouveau déclencheur, on mémorise le niveau (4) en 14 le niveau (2) arrête la suppression jusqu'au prochain déclencheur en ligne 19. Nouveau niveau (4) et on supprime jusqu'au prochain déclencheur en ligne 23 et là Patatras tout s'écroule. Il ne faut plus tenir compte du niveau en A (6) mais d'un autre. Lequel? Celui de la ligne 19? Pourquoi pas mais pourquoi pas celui de la ligne 4 ou 6 ou 11 ou 13?

Si vous avez une réponse à cette question ça deviendra possible d'avoir une réponse.

Cordialement

Rebonjour

Finalement voici une solution

Bonsoir,

Merci pour la proposition, j'étudierai ça demain.

Par contre, comme je vais devoir adapter cette macro à mon vrai tableau (secret professionnel oblige), serait-il possible de me commenter la macro ? En effet, je vais devoir l'appliquer sur une plage d'environ 45 colonnes et 2000 lignes.

Merci

Bonsoir

Le programme avec les commentaires.

Super, merci beaucoup pour la macro commentée.

Je vais essayer d'adapter tout ça à mon vrai fichier, et je reviendrai vers vous si besoin.

Merci

Bonjour,

J'ai appliqué cette macro à mon vrai fichier. Malheureusement, tout ne fonctionne pas correctement.

En fait, le "type article" est dans la 17ème colonne de mon tableau. j'ai donc modifier la ligne qui défini le numéro de la colonne :

Avant :

colArticle = 4 ' Numéro de la colonne "Type article"

Après :

 colArticle = 17 ' Numéro de la colonne "Type article"

Le problème, c'est que beaucoup de colonnes sont effacées entre la référence article et le type article. Qu'est-ce qu'il faut que je modifie d'autre pour résoudre ce problème ?

Je ne peux malheureusement pas vous joindre le véritable fichier étant donné qu'il contient des données professionnelles, mais je peux vous apporter des précisions si nécessaire.

Merci

J'ai oublié de vous préciser...

Mon véritable tableau contient 46 colonnes. Le type article est dans la 17ème.

Merci

Bonjour

Il y a deux lignes à modifier :

colNiveau = 1 ' Numéro de la colonne "Niveau arborescence"
colArticle = 4 ' Numéro de la colonne "Type article"

"Le problème, c'est que beaucoup de colonnes sont effacées entre la référence article et le type article. Qu'est-ce qu'il faut que je modifie d'autre pour résoudre ce problème ?"

Je ne comprends pas. Mon code ne supprime aucune colonne. Assurez vous qu'il n'y a pas de colonnes ni de lignes masquées avant de lancer la macro.

Dans mon véritable tableau, la colonne "niveau" est au même endroit que dans l'exemple que j'ai joint à la discussion, à savoir en colonne 1. Je ne l'ai donc pas modifiée. J'ai donc changé uniquement la colonne type article en mettant 17 au lieu de 4.

J'ai en effet constaté que seules les 4 premières colonnes restent complétées. Toutes les autres sont vidées. Ne serait-ce pas à cause des dernières lignes de la macro ?

  Range("tb_articles").Delete ' Vide le tableau d'origine
  Range("tb_articles").Resize(UBound(tb2, 1), UBound(tb2, 2)) = tb2 ' Et transfère le données du tableau calculé

Merci

J'ai trouvé.

Remplacez la ligne :

   If IsEmpty(tb1(i, UBound(tb1, 2))) Then j = j + 1: For k = 1 To 4: tb2(j, k) = tb1(i, k): Next k

par

If IsEmpty(tb1(i, UBound(tb1, 2))) Then j = j + 1: For k = 1 To ubound(tb2,2): tb2(j, k) = tb1(i, k): Next k

Légère faute d'inattention de ma part. Seules les colonnes 1 à 4 étaient transférées dans tb2

k = 1 To 4

Merci beaucoup, mais je ne vois pas cette ligne dans la macro que vous m'avez faite au départ

Voici le fichier modifié

Merci beaucoup, c'est nettement mieux.

Mais je suis désolé de vous embêter à nouveau, mais j'ai encore un problème.

Quand j'ai plusieurs lignes consécutives de type H (ou plusieurs lignes consécutives de type S...) et de même niveau, il n'y a qu'une ligne sur 2 qui est supprimée. Auriez-vous une explication ?

Merci

Rechercher des sujets similaires à "supprimer lignes suivant certaines conditions"