Problème de macro VBA

Résolu/Fermé
Remi2236 Messages postés 86 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 22 mai 2024 - 28 nov. 2023 à 10:21
Remi2236 Messages postés 86 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 22 mai 2024 - 29 nov. 2023 à 10:11

Bonjour la communauté,

Je viens vers vous concernant un problème sur une macro. J'explique le but de la macro.

Dans la feuille nommée "Suivi_du_courrier", j'ai un tableau nommé "Tableau1" pour le suivi du courrier départ. dans la colonne A de ce tableau, il y a l'ordre du courrier envoyé qui va de 1 à l'infini. Je souhaite pouvoir, à l'aide d'un bouton, pouvoir supprimer une ligne par rapport au numéro d'envoi.

Pour cela, j'ai fait un UserForm nommé "userForm2" qui contient une TextBox nommée "TextBox1" et un bouton de commande nommé "CommandButton1". Le personnel inscrit le numéro de la ligne à supprimer dasn la TextBox1 et clique sur le CommandButton1 et cela doit supprimer la ligne qui correspond en colonne A ç la valeur de la TextBox1.

Je souhaite donc que la macro :

1) sélectionne la ligne du tableau correspondant à la valeur dans la TextBox1 dans la colonne A

2) supprime cette ligne

3) recalcule la valeur des cellules en colonne A pour que ces valeurs soient toujours de +1 par rapport à la cellule située au dessus : exemple, si l'ordre est de 1, 2, 3, 4 si je supprime la ligne correspondant au chiffre 2, pas que cela fasse 1, 3, 4 mais 1, 2, 3 (que le calcule se refasse)

J'ai écris ça mais cela me mets "L'indice n'appartient pas à la sélection :

Private Sub CommandButton1_Click()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim foundCell As Range
    Dim selectedRow As ListRow
    Dim i As Integer

    ' Spécifiez la feuille et le tableau
    Set ws = ThisWorkbook.Sheets("Suivi_du_courrier")
    Set tbl = ws.ListObjects("Tableau1")

    ' Cherche la valeur dans la TextBox1 dans la colonne A
    Set foundCell = tbl.ListColumns("Colonne1").DataBodyRange.Find(Val(TextBox1), LookIn:=xlValues)

    If Not foundCell Is Nothing Then
        ' Sélectionne la ligne correspondante
        Set selectedRow = tbl.ListRows(foundCell.row - tbl.ListRows(1).Range.row + 1)

        ' Supprime la ligne sélectionnée
        selectedRow.Delete

        ' Récalcule les valeurs de la colonne A
        For i = 2 To tbl.ListRows.Count
            tbl.ListRows(i).Range.Cells(1, 1).Value = IIf(i = 2, 1, tbl.ListRows(i - 1).Range.Cells(1, 1).Value + 1)
        Next i
    Else
        MsgBox "La valeur spécifiée n'a pas été trouvée dans la colonne A.", vbExclamation
    End If
End Sub


Si l'un de vous peut me débloquer la situation se serait très gentil.

Cdlt,

Rémi

A voir également:

1 réponse

thev Messages postés 1961 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 16 février 2025 706
28 nov. 2023 à 21:06

Bonjour,

Par rapport à ce que vous présentez, je vois une façon plus simple de renuméroter

Par ailleurs, il serait plus sûr d'ajouter  dans votre "Find" , le paramètre de recherche complète, notamment en cas de tri de votre tableau.

Private Sub CommandButton1_Click()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim foundCell As Range
    Dim selectedRow As ListRow
    Dim i As Integer

    ' Spécifiez la feuille et le tableau
    Set ws = ThisWorkbook.Sheets("Suivi_du_courrier")
    Set tbl = ws.ListObjects("Tableau1")

    ' Cherche la valeur dans la TextBox1 dans la colonne A
    Set foundCell = tbl.ListColumns("Colonne1").DataBodyRange.Find(Val(TextBox1), LookIn:=xlValues, LookAt:=xlWhole)

    If Not foundCell Is Nothing Then
        ' Sélectionne la ligne correspondante
        Set selectedRow = tbl.ListRows(foundCell.Row - tbl.HeaderRowRange.Row)

        ' Supprime la ligne sélectionnée
        selectedRow.Delete

        ' Tri selon les valeurs de la colonne A
        With tbl
            .Range.Sort key1:=.ListColumns(1), Order1:=xlAscending, Header:=xlGuess
        End With
        
        ' Récalcule les valeurs de la colonne A
        For i = 1 To tbl.ListRows.Count
            tbl.ListRows(i).Range.Cells(1, 1).Value = i
        Next i
    Else
        MsgBox "La valeur spécifiée n'a pas été trouvée dans la colonne A.", vbExclamation
    End If
End Sub

2
Remi2236 Messages postés 86 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 22 mai 2024 1
29 nov. 2023 à 10:11

Bonjour,

ça fonctionne très bien merci ! Je viens de percuter avec votre ajout de code que j'ai mis

ListColumns("Colonne1")

au lieu de

ListColumns(1)

Du coup ça marche beaucoup mieux...Merci du coup de main !

Cdlt

Rémi

0