Supprimer une ligne de tableau contenant une valeur

Bonjour à tous,

J'ai créé un tableau de plan d'action qui répertorie toutes les taches à faire quel service doit s'en occuper. Il comporte un onglet par service : "Maintenance" , "Production" , "Laboratoire", etc... Ainsi qu'un onglet "Global"

Chaque onglet possède une macro que j'ai réussi à bricoler qui permet

1) D'ouvrir un UserForm avec les informations à remplir

2) Ajouter une ligne dans le tableau de la page actuelle avec les informations saisie dans chaque colonne

3) Ajouter une ligne avec les mêmes informations dans l'onglet "Global"

Avec un mot de passe pour protéger, chaque service n'a accès qu'à son onglet où il peut ajouter ses actions et à l'onglet Global pour toutes les consulter. La page Global est protégée, elle ne peut pas être modifiée directement. Cependant des info peuvent être corrigées sur le tableau d'action (Par exemple modification de l'avancement, ou tout simplement rectification), donc pour que celà apparaisse aussi dans longlet "Global" les informations sont juste copiées"

Donc ma macro fait : Copier ligne 7 de l'onglet Production, et j'ai les infos qui s'affichent correctement mais si j'efface ou je supprime la ligne d'action dans l'onglet Production, ca me fait bugger mon onglet global.


Donc je souhaiterai faire une macro qui :

1) supprime la ligne sélectionnée de la feuille "Production"

2) supprime la ligne de l'onglet Global qui contenant les mêmes informations

Vous avez peut être une solution facile pour ça. Mais je m'étais dit que relier la ligne du plan global avec la ligne d'origine est une bonne idée, alors j'ai ajouté une colonne qui contient la ligne d'origine de l'onglet production avec une lettre pour l'origine de la création de la ligne, puisque forcement compile trois/quatre onglets en 1, la ligne 726 de global est copiée sur la ligne 234 de prod, donc je ne peux juste pas effacer la ligne 234 des deux tableau en même temps.

image

Voila un apperçu de ce que ça donne, donc dans la colonne E, j'ai ma ligne à comparer.

Donc une autre solution si la première n'est pas accessible serait :

1) Dans la feuille "Production" : Vérifier la valeur de la colonne E de la ligne sélectionnée

2) Comparer cette valeur avec la colonne E de la feuille "Global" pour retrouver celle qui est identique

3) Effacer la ligne de la feuille "Global" qui contenait cette valeur

4) Supprimer la ligne selectionnée de la feuille "Production

Dans le but de supprimer les deux lignes en simultané

J'espère que ce n'est pas trop compliqué et que mon explication reste clair car très longue ... Mais je n'arrive pas a bricoler de macro avec ce que je trouve sur internet. Pour cette tache.

Merci d'avance à ceux qui tentent de m'aider.

Bonjour Dojori, bonjour le forum,

Explications claires mais sans le fichier qui va bien je ne m'y risquerai même pas...

Ok, je vais essayer de faire un fichier TEST et je reviendrai ici

image

Voici les codes d'accès aux pages.

Si jamais il y a un code pour aller aux macros, c'est Admin également. (Je ne sais plus comment j'avais mis ce mot de passe)

Bonjour Dojori, bonjour le forum,

Je suis parti du principe qu'au moins une cellule de la ligne à supprimer était sélectionnée dans l'onglet de travail (autre que Global). Le code :

Sub Macro1()
Dim OG As Worksheet 'déclare la variable OG (Onglet Global)
Dim OA As Worksheet 'déclare la variable OA (Onglet Actif)
Dim TG As ListObject 'déclare la variable TG (Tableau structuré Global)
Dim TOA As ListObject 'déclare la variable TOA (Tableau structuré Onglet Actif)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim VC As String 'déclare la variable VC (Valeur Cherchée)

Set OG = Worksheets("Global") 'définit l'onglet OG
Set OA = ActiveSheet 'définit l'onglet OA
Set TG = OG.ListObjects(1) 'définit le tableau structuré TG
Set TOA = OA.ListObjects(1) 'définit le tableau structuré TOA
VC = OA.Cells(ActiveCell.Row, "E").Value 'définit la valeur cherchée VC
OA.Cells(ActiveCell.Row, "E").Delete 'supprime la cellule : ligne = ligne de la cellule active, colonne = E de l'onglet OA
TOA.ListRows(ActiveCell.Row - TOA.HeaderRowRange.Row).Delete 'supprime la ligne de la cellule active dans le tableau structuré TOA
'définit la ligne LI (ligne de la première occurrence trouvée de VC dans la colonne E de l'onglet OG)
LI = OG.Columns(5).Find(VC, , xlValues, xlWhole).Row
OG.Cells(LI, "E").Delete 'supprime la cellule : ligne = LI, colonne = E de l'onglet OG
TG.ListRows(LI - TG.HeaderRowRange.Row).Delete 'supprime la ligne correspondant à LI dans le tableau structuré TG
End Sub

Aïe Aïe beau travail ! Merci beaucoup

Beaucoup de fonctions que je ne saisis pas encore tout à fait bien mais de toute évidence ça marche exactement comme j'avais imaginé ! "Je suis parti du principe qu'au moins une cellule de la ligne à supprimer était sélectionnée dans l'onglet de travail (autre que Global)." Tu étais parti du bon principe !


Il y a quand même un petit soucis... Si j’efface une ligne plus ancienne, les numéros se décalent vers le haut et c'est alors possible d'avoir deux fois la même référence dans la colonne... du coup ça n'efface plus forcement la bonne ligne (si j'ai deux fois M7 par exemple)

Ce problème vient de mon code qui les numérote en fonction de leur position dans excel (la ligne de code en rouge) :

"
With sh
Last = WorksheetFunction.CountA(.Range("f:f")) + 7
For i = 1 To 9
.Cells(Last, 5).Value = "S" & Last - 7

.Cells(Last, 6).Value = CDate(Me.TextBox1.Value)
.Cells(Last, i + 5).Value = Me.Controls("TextBox" & i).Value


Est-ce qu'il y aurait un moyen d'éviter les doublons dans la colonne E pour éviter les ambiguïtés ?

Bonjour Dojori, bonjour le forum,

Une proposition. J'ai remplacé une partie du code dans un des UserForm. Il te faudra faire la même modif pour tous, si elle te convient. L'astuce est d'utiliser la valeur max plus une pour définir une ligne. Comme ça, même si tu supprimes une ligne entre la première et la dernière ça ne créera pas de doublons. En revanche tu risques d'avoir des trous... 1, 2, 4, 5 par exemple...

With sh
    DL = .Cells(Application.Rows.Count, "E").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne E de l'onglet sh
    Select Case DL 'agit en fonction de DL
        Case 6 'cas ou DL vaut 6 (première ligne)
            .Cells(DL + 1, 5).Value = "S1" 'renvoie "S1" dans la cellule ligne DL + 1, colonne 5,
        Case Else 'tous les autres cas
            TV = .Range("E7:E" & DL) 'définit le tableau des valeurs TV
            For J = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (de 7 à DL)
                V = CLng(Mid(TV(J, 1), 2)) 'définit la valeur V (texte après le premier caractère converti en entier long)
                If V <> VMax Then VMax = V 'si V est supérieur à VMax, VMax devient V
            Next J 'prochaine ligne de la boucle
            .Cells(DL + 1, 5).Value = "S" & VMax + 1 'renvoie dans la cellule ligne DL + 1, colonne 5, S suivi de Vmax + 1
    End Select 'fin de l'action en fonction de DL
    .Cells(DL + 1, 6).Value = CDate(Me.TextBox1.Value) 'renvoie la date de la TextBox1
    For I = 1 To 9 'rempli la ligne avec cette boucle
        .Cells(DL + 1, I + 5).Value = Me.Controls("TextBox" & I).Value
    Next
End With

With sho
Lost = WorksheetFunction.CountA(.Range("f:f")) + 7
.Cells(Lost, 5).Value = sh.Cells(DL + 1, 5).Value 'renvoie la même valeur dans l'onglet Global
'etc...

Bien le bonjour,

Les trous ne sont pas un problème, puisque ce n'est pas une information utile autre chose que de référencer les lignes pour la macro. Je vais d'ailleurs les rendre invisible.

Donc ta solution est parfaite. Je te remercie énormément pour ton aide ! En général j'essaie de grignoter des bouts de macro parci par là sur ce forum pour arriver à mes fins mais là j'étais un peu broqué ! Mais c'est réglé, merci à toi, je vais signaler que mon problème est résolu.

Cdt.

Bonjour Dojori, bonjour le forum,

En pièce jointe ton fichier modifié avec une seule UserForm sans certains contrôles doublés (ComboBox/TextBox) et avec des bug corrigés (le code que je t'avais proposé n'était pas correct quand on initialisait un tableau). La propriété Tag des contrôles édités permet de boucler pour renvoyer le résultat dans le tableau.

6dojori-ed-v01.xlsm (199.29 Ko)

Bonjour ThauThème

Je n'avais pas eu l'occasion de jeter un œil à la version remaniée de l'ajout d'actions. J'ai mis pas mal de temps à apprivoiser les codes, mais je pense que que maintenant j'ai réussi à comprendre et faire les modifications nécessaires pour l'adapter à mon document.

Il fonctionne du tonnerre sur toutes les tâches que je voulais faire, et notamment la numérotation fonctionne parfaitement. Par contre, la fonction supprimer des lignes ne fonctionne plus.

J'ai "Erreur d’exécution 9, l'indice n'appartient pas à la sélection" ; sur le document que tu as envoyé ;

"TG.ListRows(LI - TG.HeaderRowRange.Row).Delete 'supprime la ligne correspondant à LI dans le tableau structuré TG" est surlignée

et bizarrement c'est l'Erreur d’exécution 91, variable objet ou variable de bloc With non définie"

"LI = OG.Columns(21).Find(VC, , xlValues, xlWhole).Row" est surlignée

Pourtant c'est grosso modo le même code réutilisé dans les deux documents. (j'ai juste changé la colonne 5 en colonne 21)

Je suis un peu perdu sur ce point j'ai l'impression de repartir du départ haha.

Pour rappel si tu es confronté au moindre mot de passe il s'agit de "Admin"

Merci mille fois d'avance.

Bonjour Dojori, bonjour le forum,

Comme le tableau de l'onglet Global est un tableau structuré (Tableau13), si on y écris une formule dans la première ligne , celle-si est répercuté dans toutes les autres lignes... Ça fausse tout les reste...

Deux solutions :

1. Soit un utilise un tableau simple (Tableau13 est converti en plage normale)
2. Soit on copie la valeur en dur mais pas la formule. Les lignes :

OG.Cells(Lost, 6).FormulaLocal = "='" & ActiveSheet.Name & "'!" & "F" & Last 'formule qui récupère la valeur de l'onglet actif
'etc

deviendraient

OG.Cells(Lost, 6).Value = ActiveSheet.Range("F" & Last) 'récupère la valeur de l'onglet actif
'etc

On peut même aussi utiliser les deux solutions conjointement...

En pièce jointe le fichier modifié avec la solution 2

3dojori-ed-v02.xlsm (204.36 Ko)

Très bien ça règle donc le soucis. J'étais passé par une formule par manque d'outils pour faire autrement. Mais c'était bien cette solution que je recherchais.

Mais après une nouvelle solution ... un nouveau problème.

Je me suis rendu compte que les chiffres (qui permettent d'identifier chaque ligne pour la suppression), ceux-là même qui sont générés automatiquement à chaque ajout de ligne via l'UserForm, sont ajoutés en dehors du tableau ! La conséquence est qu'en cas de tri dans le tableau d'une des colonnes, la ligne E ne bouge pas et les actions se trouvent en face d'un nouveau Code de référence et j'ai donc deux actions différentes supprimées.

Pour illustrer : Admettons que je trie la colonne G par ordre alphabétique et que l'action qui commence par un "A" était aussi la plus récente (donc initialement en bas du tableau), elle se retrouvera en ligne 1 en face du code P1 par exemple et si je sélectionne cette action pour la supprimer, la macro va tout simplement me supprimer la ligne P1 dans mon tableau Production, c'est-à-dire : l'action la plus récente, tandis que dans le tableau global, c'est aussi la ligne P1 qui va être supprimée mais comme les lignes n'ont pas été réorganisées, c'est toujours l'action la plus ancienne qui sera en première ligne du tableau et donc celle-ci de supprimé.

Mon objectif est bien de supprimer les mêmes informations dans chacun des tableaux simultanément.

Bon, je ne me laisse pas abattre, j'ai tout simplement ajouté la colonne E à mon tableau, comme ça les lignes sont bien reliées avec leur propre "code d'identification" même en cas de tri des différentes colonnes.

Sauf que je suis confronté à un nouveau problème dont j'ignore la source. A partir du moment où j'effectue la macro "Supprimer une ligne", il me supprime deux lignes d'un seul coup ! Lorsque je lance la macro, je vois le curseur s'aggrandir, sélectionner la ligne du dessous en plus, et paf supprimer les deux d'un coup.

Je sens qu'on est à deux doigts d'avoir tout parfait haha.

Merci encore !

Bonjour le fil, bonjour le forum,

Envoie le fichier modifié avec la colonne supplémentaire pour chaque tableau...

Le voici :

2dojori-ed-v03.xlsm (201.62 Ko)

Et je remarque que dans global il y a aussi deux lignes supprimées mais ce ne sont pas forcément les deux mêmes que celles supprimées dans les autres onglets.

Bonsoir Dojori, bonsoir le forum,

En pièce jointe la version 04. J'ai modifié la propriété [TAG] des contrôles et adapté le code. Ça me parait OK. À tester...

2dojori-ed-v04.xlsm (201.71 Ko)

Bonjour ThauTheme,

Je viens de regarder la V04, les lignes sont bien effacées 1 par 1. Par contre cette fois-ci plus possible d'ajouter d'action.

Ca beugue à cette ligne :

V = CLng(Mid(TV(J, 1), 2)) 'définit la valeur V (texte après le premier caractère converti en entier long)

Bonjour Dojori, bonjour le forum,

En pièce jointe la version 05...

9dojori-ep-v05.xlsm (207.05 Ko)

Bon cette fois-ci je crois que c'est parfaitement bon.

Cela fait exactement ce que j'avais imaginé mais ça va bien au delà de mon niveau de compréhension. Je n'aurais jamais pu y arriver seul.

Merci énormément.

Rechercher des sujets similaires à "supprimer ligne tableau contenant valeur"