Microsoft 365 effacer cellule dans un tableau structuré

Bizarre

XLDnaute Nouveau
Bonjour

Je cherche à supprimer à l’aide d’un code saisi dans une listbox des lignes sur les feuilles (« Achat », » Basededonnée », « tableau de bord » et » « listederoulante »). Pour les 3 premières feuilles avec ce code tout fonctionne parfaitement. Mais pour la feuille « listederoulante » les données sont dans un tableau structuré et le code ne se trouve jamais dans la même cellule du tableau, si quelqu’un a une solution a me proposer cela me permettrais de progresser dans mon projet.
VB:
Sub supp()
Sheets("Achat").Unprotect
Sheets("Basededonnée").Unprotect
Sheets("Listederoulante").Unprotect

    Dim i As Integer
    Dim Editeur As String
    Dim Wsh As Worksheet

    Editeur = InputBox("Entrer la référence colonne A que vous voulez supprimer", "Welcome")
    'la valeur saisie est transmise à la variable Editeur

    For Each Wsh In Worksheets(Array("Achat", "Basededonnée", "Tableau de bord"))
        With Wsh
            NL = .Range("A" & .Rows.Count).End(xlUp).Row
            For i = NL To 3 Step -1
                If .Range("A" & i).Value = Editeur Then
                    .Rows(i).Delete
                End If
            Next i
        End With
    Next Wsh

End Sub
 

Pièces jointes

  • Exemple 1-V3.xlsm
    64.2 KB · Affichages: 7
Solution
RE

Attention à tes copies qui traînent des validations inappropriées dans le Tableau de bord
VB:
Sub supp()
Sheets("Lavage").Unprotect
Sheets("Basededonnée").Unprotect
Sheets("Listederoulante").Unprotect
Sheets("Tableau de bord").Unprotect

    Dim i As Integer
    Dim Editeur As String, Secteur As String
    Dim Wsh As Worksheet

    Editeur = InputBox("Entrer la référence colonne A que vous voulez supprimer", "Welcome")
    'la valeur saisie est transmise à la variable Editeur

    For Each Wsh In Worksheets(Array("Lavage", "Basededonnée", "Listederoulante", "Tableau de bord"))
        With Wsh.ListObjects(1)
            NL = .ListRows.Count
            For i = NL To 1 Step -1
                If .ListColumns(1).DataBodyRange.Cells(i...

chris

XLDnaute Barbatruc
Bonjour
VB:
Sub supp()
Sheets("Achat").Unprotect
Sheets("Basededonnée").Unprotect
Sheets("Listederoulante").Unprotect

    Dim i As Integer
    Dim Editeur As String
    Dim Wsh As Worksheet

    Editeur = InputBox("Entrer la référence colonne A que vous voulez supprimer", "Welcome")
    'la valeur saisie est transmise à la variable Editeur

    For Each Wsh In Worksheets(Array("Achat", "Basededonnée", "Tableau de bord"))
        With Wsh.ListObjects(1)
            NL = .ListRows.Count
            For i = NL To 1 Step -1
                If .ListColumns(1).DataBodyRange.Cells(i, 1) = Editeur * 1 Then
                    .ListRows(i).Delete
                    Exit For
                End If
            Next i
        End With
    Next Wsh

End Sub

Edit : oups, j'ai corrigé
 
Dernière édition:

Bizarre

XLDnaute Nouveau
Bonjour Chris ;

Vous êtes plus rapide à répondre que moi pour tester, je viens de faire l’essai et le code n’ais pas effacer dans la feuille « Listedéroulante ». Je me permets donc remettre le fichier en question.
 

Pièces jointes

  • Exemple 1-V3.xlsm
    65.1 KB · Affichages: 4

cp4

XLDnaute Barbatruc
Bonjour Chris ;

Vous êtes plus rapide à répondre que moi pour tester, je viens de faire l’essai et le code n’ais pas effacer dans la feuille « Listedéroulante ». Je me permets donc remettre le fichier en question.
Bonjour @Bizarre:) ,@chris;),

@Bizarre : Pourrais-tu être plus explicite, car sur la feuille "listederoulante" il y a 4 tableaux structurés. Alors que sur les autres feuilles, il n'y a qu'un seul tableau sur lequel le code rechercher est toujours en colonne A. Ce n'est pas le cas de la feuille "listederoulante".

Bonne journée.
 

chris

XLDnaute Barbatruc
Bonjour

Arf j'ai manqué d'attention

Pourquoi présenter ainsi ce tableau ? Tu compliques sans doute pour rien...

VB:
Sub supp()
Sheets("Achat").Unprotect
Sheets("Basededonnée").Unprotect
Sheets("Listederoulante").Unprotect

    Dim i As Integer
    Dim Editeur As String, Secteur As String
    Dim Wsh As Worksheet

    Editeur = InputBox("Entrer la référence colonne A que vous voulez supprimer", "Welcome")
    'la valeur saisie est transmise à la variable Editeur

    For Each Wsh In Worksheets(Array("Achat", "Basededonnée", "Tableau de bord"))
        With Wsh.ListObjects(1)
            NL = .ListRows.Count
            For i = NL To 1 Step -1
                If .ListColumns(1).DataBodyRange.Cells(i, 1) = Editeur * 1 Then
                    Secteur = .ListColumns(1).DataBodyRange.Cells(i, 2)
                   .ListRows(i).Delete
                Exit For
                End If
            Next i
        End With
    Next Wsh
   
    With Range("Tableau_code_en_service").ListObject
        With .ListColumns("Sect " & Secteur)
            For i = .Range.Rows.Count - 1 To 1 Step -1
                If .DataBodyRange.Cells(i, 1) = Editeur * 1 Then
                    .DataBodyRange.Cells(i, 1) = ""
                    Lig = i
                    Exit For
                End If
            Next
         End With
        'Suppression ligne si vide
        If WorksheetFunction.CountA(.DataBodyRange.Rows(Lig).Cells) = 0 Then
            .ListRows(i).Delete
        End If
    End With
End Sub

Edit : Bonjour CP4
 

Bizarre

XLDnaute Nouveau
Re ;

Le tableau « Tableau_de_bord » de la feuille « listederoulante » est alimenté par copier-coller des données rentrées en colonne A de la feuille « Basededonnée » vu mon niveau c’est le seul moyen que j’ais trouver pour rentrer les codes afin que ceux-ci ne soient pas en double.

J’ais une ligne en jaune dans le code, pouvez -encore m’aider ?

Je met une capture d’écran de la ligne en question

1643625630479.png
 

Pièces jointes

  • 1643625931637.png
    1643625931637.png
    8.9 KB · Affichages: 20

chris

XLDnaute Barbatruc
RE

Ton fichier réel à bien en titre de colonne Sect suivi du nom du secteur trouvé en colonne 2 de l'onglet Tableau de bord ?

Le tableau de bord pourrait être fait en POwerQuery, ce qui limiterait le traitement à une actualisation de ce tableau...
 

chris

XLDnaute Barbatruc
RE

Et tu crois qu'avec juste des en-têtes on peut comprendre pourquoi sur une ligne, on a autre chose que ce qui est attendu selon l'exemple manifestement tout sauf REPRÉSENTATIF que tu as fourni ?

C'est parfois désespérant de chercher çà aider des demandeurs qui n'aident pas à les aider...
 
Dernière édition:

chris

XLDnaute Barbatruc
RE
Tu devrais relire attentivement la charte...

Tu crois qu'on peut modifier du code sans contexte ?
Si tu passes ta souris sur le lien vers le 1er fichier que tu as transmis tu peux voir qu'il a été ouvert 4 fois et le second 2 fois...

Pourquoi créer et fournir un fichier de type salade de fruits qui n'a rien à voir avec le vrai et nous plonge dans la compote ?
Anonymiser ne veut pas dire transformer la structure, juste remplacer des identifiants par des textes neutres...
 
Dernière édition:

Bizarre

XLDnaute Nouveau
Bonsoir chris
Si vous êtes toujours disposé à m’aider je mets le fichier à votre disposition. J’ais simplement supprimer des lignes et modifier les données pour le reste c’est le fichier original.
 

Pièces jointes

  • Demo V4-9.xlsm
    211.9 KB · Affichages: 6

chris

XLDnaute Barbatruc
RE

Attention à tes copies qui traînent des validations inappropriées dans le Tableau de bord
VB:
Sub supp()
Sheets("Lavage").Unprotect
Sheets("Basededonnée").Unprotect
Sheets("Listederoulante").Unprotect
Sheets("Tableau de bord").Unprotect

    Dim i As Integer
    Dim Editeur As String, Secteur As String
    Dim Wsh As Worksheet

    Editeur = InputBox("Entrer la référence colonne A que vous voulez supprimer", "Welcome")
    'la valeur saisie est transmise à la variable Editeur

    For Each Wsh In Worksheets(Array("Lavage", "Basededonnée", "Listederoulante", "Tableau de bord"))
        With Wsh.ListObjects(1)
            NL = .ListRows.Count
            For i = NL To 1 Step -1
                If .ListColumns(1).DataBodyRange.Cells(i, 1) = Editeur * 1 Then
                    If Wsh.Name = "Tableau de bord" Then Secteur = .ListColumns(1).DataBodyRange.Cells(i, 2)
                   .ListRows(i).Delete
                Exit For
                End If
            Next i
        End With
    Next Wsh
  
    With Range("Tableau_code_en_service").ListObject
        With .ListColumns(Secteur)
            For i = .Range.Rows.Count - 1 To 1 Step -1
                If .DataBodyRange.Cells(i, 1) = Editeur * 1 Then
                    .DataBodyRange.Cells(i, 1) = ""
                    Lig = i
                    Exit For
                End If
            Next
         End With
        'Suppression ligne si vide
        If WorksheetFunction.CountA(.DataBodyRange.Rows(Lig).Cells) = 0 Then
            .ListRows(i).Delete
        End If
    End With
End Sub
 

Bizarre

XLDnaute Nouveau
Bonjour Chris

Votre solution me convient parfaitement, je vous remercie pour le temps passé a trouver une solution à mon problème. J'ai suivi vos conseils et supprimer les validations inappropriées. Je pense regarder un tuto sur PowerQuery rapidement et encore merci vraiment de votre patience.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof