IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Supprimer et modifier des données dans une table sur excel à partir d'une sélection Listview [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Supprimer et modifier des données dans une table sur excel à partir d'une sélection Listview
    Bonjour à tous,

    Cela fait un bon moment que je cherche une solution à mon problème.
    J'ai créé un formulaire avec des textbox, combobow etc qui alimentent une table dans une feuille excel.
    Sur ce formulaire, j'ai intégré une Listview pour faire des recherches. Je souhaiterais à partir d'une ligne sélectionnée dans la Listview et qui correspond à une ligne identique dans ma table dans excel, supprimer la ligne directement dans la table excel.

    J'ai testé ce code trouvé sur le site "ListView1.ListItems.Remove (ListView1.SelectedItem.Index)"
    Le souci, c'est qu'il ne supprime que la ligne dans la Listview, elle reste présente dans le fichier excel.
    Il supprime aussi les lignes non sélectionnées dans la ListView.

    J'ai aussi testé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim SuppLigne As Long
    SuppLigne = UserForm1.ListView1.SelectedItem.Index + 1
    With UserForm1.ListView1
    .ListItems.Remove .SelectedItem.Index
    Worksheets("Missions").Rows(SuppLigne).Delete Shift:=xlUp
    End With
    Alors lui supprime bien dans la ListView et table sur excel, mais supprime même quand aucune sélection n'est fait dans la Listview.

    Concernant la modification, à vrai dire j'étais tellement à fond sur la suppression que je n'ai pas cherché.

    En espérant que mes explication sont claires, et vous remerciant par avance.

    Guinam

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Il te faut tester si il y a bien une sélection de faite (surligné en bleu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If ListView1.SelectedItem.Selected Then ListView1.ListItems.Remove (ListView1.SelectedItem.Index)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,


    ça fonctionne pour la sélection, mais la ligne reste présente dans ma table Excel.
    Ci-joint mon projet pour plus de compréhension.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Avril 2017
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2017
    Messages : 122
    Points : 194
    Points
    194
    Par défaut
    vous avez un code qui fait la suppression que vous souhaitez (1e message)

    Theze vous a expliqué comment faire le test avant de le lancer.

    Que vous manque t-il ? Vous ne savez pas combiner les deux ?
    Je ne teste quasi jamais le code que je propose. il s'agit juste d'indication sur comment je m'y prendrais, comment faire, des lignes d'intention.
    Il y a donc souvent des erreurs, le déboggage existe pour cela.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Pour la suppression j'ai fait quelque chose comme ça :

    Code vba Excel : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim SuppLigne As Long
     
        If txtMNumeroLM.Value = "" Then
        MsgBox ("Merci de sélectionner un enregistrement"), vbInformation, ""
        Exit Sub
        End If
     
        SuppLigne = UserForm1.ListView1.SelectedItem.Index + 1
        With UserForm1.ListView1
        .ListItems.Remove .SelectedItem.Index
        Worksheets("Missions").Rows(SuppLigne).Delete Shift:=xlUp
        End With

    Il faut ensuite vider tous les textbox et autres et ça m'a l'air de fonctionner.

    Je continu de chercher pour la modification d'un enregistrement.

    Merci par avance.

    Guinam

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous,

    Concernant mon problème j'ai bricolé le code suivant :

    Code vba excel : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub cmdMModifier_Click()
     
        Dim sonat As Long
     
        If txtMNumeroLM.Value = "" Then
        MsgBox ("Merci de sélectionner l'enregistrement à modifier"), vbInformation, ""
        Exit Sub
        End If
     
     
        sonat = ActiveCell.Row
     
        Cells(sonat, 1) = txtMNumeroLM.Text
        Cells(sonat, 2) = txtMDateSignature.Text
        Cells(sonat, 3) = txtMNomSociete.Text
        Cells(sonat, 4) = txtMActivite.Text
     
     
        Call VideMissions
        Call Actualisation_ListView1 ' On appelle la procédure qui actualise la ListView
    End Sub


    Il fonctionne si on a bien positionné sur la ligne à modifier.
    Mon souci, c'est je n'ai pas encore trouvé comment faire, pour que la sélection dans ListView soit synchronisée à celle de mon fichier Excel en arrière plan.

    Est-que vous pourriez me confirmer que le code n'est pas déconnant et si vous avez une idée je suis preneur.

    Merci par avance.
    Guinam

  7. #7
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Afin d'être sûr qu'il y est bien correspondance entre la feuille et la ListView, le mieux à mon avis est d'ajouter une colonne cachée contenant le numéro de la ligne.
    Voici la petite modif apportée à la Sub Initialize :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Private Sub UserForm_Initialize()
     
        '============================ Initialise la ListView Factures ==========================================
        With ListView1
     
            .Gridlines = False 'Affiche ou pas les lignes
            .View = lvwReport ' Style de rapport
            .FullRowSelect = True 'Permet de sélectionner une ligne dans la liste
            'Création des en-têtes personnalisées avec leur largeur
            .ColumnHeaders.Add Text:="Numero LM"
            .ColumnHeaders.Add Text:="Num Client"
            .ColumnHeaders.Add Text:="Nom Client"
            .ColumnHeaders.Add Text:="Type Client"
            .ColumnHeaders.Add Text:="Code Mission"
            .ColumnHeaders.Add Text:="Num Facture"
            .ColumnHeaders.Add Text:="Date Facture"
            .ColumnHeaders.Add Text:="Date Echeance"
            .ColumnHeaders.Add Text:="Montant HT"
            .ColumnHeaders.Add Text:="TVA"
            .ColumnHeaders.Add Text:="NumLigne", Width:=0 '<--- stocke le numéro de la ligne et la colonne est cachée (largeur 0)
     
        End With
     
        Call ListView1_Actualisation 'On appelle la procédure qui actualise la ListView
     
        '============================ Fin ListView ==========================================
     
        txtFDateFacture.Text = Format(Now(), "dd/mm/yyyy")
     
        With cboFRech
     
            .AddItem "Montant Facture"
            .AddItem "Nom Client"
            .AddItem "Nom Sous - Traitant"
            .AddItem "Num Client"
            .AddItem "Num Facture"
            .AddItem "Numero LM"
     
        End With
     
        With cboFOperateur
     
            .AddItem "="
            .AddItem "<"
            .AddItem ">"
     
        End With
     
        cboFOperateur.ListIndex = 0
     
    End Sub
    et la modif apportée à la Sub "cmdFSupprimer_Click()" pour la suppression dans la ListView et dans la feuille avec un message demandant si la suppression est bien voulue, adaptes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Private Sub cmdFSupprimer_Click()
     
        On Error GoTo Fin 'si la ListView est vide
     
        With ListView1
     
            'avec une boite de message demandant si la suppression est vraiment désirée !
            If .SelectedItem.Selected And _
                MsgBox("Voulez-vous vraiment supprimer l'enregistrement n° " _
                & .ListItems.Item(.SelectedItem.Index).SubItems(10) _
                & " de la feuille 'Factures' ?", vbQuestion + vbYesNo) = vbYes Then
     
                Worksheets("Factures").Rows(.ListItems.Item(.SelectedItem.Index).SubItems(10)).EntireRow.Delete xlUp
                .ListItems.Remove (.SelectedItem.Index)
     
                ListView1_Actualisation
     
                'Vider le formulaire apres suppression des données dans la base
                Me.txtFNumeroLM.Value = ""
                Me.txtFNumClient.Value = ""
                Me.txtFNomClient.Value = ""
                Me.cboFTypeClient.Value = ""
                Me.txtFCodeMission.Value = ""
                Me.txtFNumFacture.Value = ""
                Me.txtFDateFacture.Value = ""
                Me.txtFDateEcheance.Value = ""
                Me.txtFMontantHT.Value = ""
                Me.cboFTVA.Value = ""
     
            End If
     
        End With
     
    Fin:
     
    End Sub

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Avec la colonne caché ça fonctionne.

    Merci beaucoup à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/05/2015, 14h29
  2. Réponses: 7
    Dernier message: 24/01/2012, 18h55
  3. Réponses: 2
    Dernier message: 31/03/2011, 11h22
  4. modifier des données dans une requête multi table
    Par Bluman dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/02/2008, 10h00
  5. Réponses: 4
    Dernier message: 02/05/2005, 20h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo