Suppression élément sélectionné d'une listbox

Bonjour à tous,

Vous trouverez ci-joint un extrait de mon projet.

L'idée de mon UF est de lier un ou plusieurs sous-traitant(s) à un chantier sélectionné.

Le fonctionnement de l'UF est le suivant :1. On choisit le chantier

2. On choisit un ou plusieurs sous-traitant(s) à affilier lors de la validation de l'UF. Ils sont ajouté à une listbox

3. Une fois la listbox complétée. On ajoute les sous-traitants à la base de donnée. (non programmé encore...)

Mon problème :

Si l'utilisateur veut supprimer un item de la listbox via le bouton "Supprimer le sous-traitant sélectionné de la liste d'affiliation" ET qu'il sélectionne le dernier item, cela a pour conséquence de supprimer l'ensemble de la listbox. Ce qui n'est pas souhaité

Voici un extrait de mon code :

    Dim j As Integer
    For j = ajouter_affiliation_multiple.ListBox1.ListCount - 1 To 0 Step -1
        If ajouter_affiliation_multiple.ListBox1.Selected(j) = True Then
            'on Supprime l'élément selectionné dans la ListBox.
        ajouter_affiliation_multiple.ListBox1.RemoveItem (j)
        End If
    Next j

J'ai aussi d'autres problème concernant cet UF que je détaillerai une fois ce problème résolu.

Merci sincèrement à ceux qui m'aideront !

Cordialement,

Batoine !

Bonjour,

Peut-être simplement comme ceci :

Private Sub suppr_st_listbox_Click()
Me.ListBox1.RemoveItem Me.ListBox1.ListIndex
End Sub

Bon Dimanche

Bonjour cousinhub, bonjour le forum

Merci beaucoup cousinhub pour votre réponse, effectivement ça fonctionne et est beaucoup plus simple !

J'ai maintenant un autre problème concernant des vérifications à effecteur avant d'ajouter le sous-traitant renseigné à la listbox (lors de l'événement clique sur le bouton "Affilier le st".

Voici les conditions qu'il faut remplir afin que le ST soit affilié, j'ai résumé ça sous forme de graphique (joint en image), selon moi plus simple à comprendre.

Je souhaite dans un premier temps faire la boucle sur les différents items de la listbox et vérifier que le ST ne soit pas déjà présent dans cette listbox.

J'obtiens un message d'erreur surprenant : "Erreur de compilation, next sans For".

Voici le code de ma boucle :

'____Vérification que le nom renseigné n'appartienne pas à la listbox
For j = 0 To ListBox1.ListCount - 1         'boucle sur les éléments de la listbox
    If ListBox1.Selected(j) = nom.Value Then
    MsgBox "Le sous-traitant est déja dans la liste"
    ok = False
Next j

Je ne comprends pas d'où cela vient.

Je ne sais pas d'ailleurs si mon code pour la boucle est bon ou non ?

Merci de votre aide.

image affilier st verification

Batoine

J'obtiens un message d'erreur surprenant : "Erreur de compilation, next sans For".

Probablement parce qu'il manque "end if" avant next j.

Bonjour Addict,

Merci pour votre réponse ! Je viens de corriger cette erreur stupide. En revanche, ma boucle ne fonctionne pas, je ne comprends pas pourquoi...

Je viens de saisir deux fois le même ST dans la listbox. Je n'ai pourtant aucun message d'erreur et le code de la boucle semble bon ?

'____Vérification que le nom renseigné n'appartienne pas à la listbox
For i = 0 To ListBox1.ListCount - 1         'boucle sur les éléments de la listbox
    If ListBox1.Selected(i) = nom.Value Then
    MsgBox "Le sous-traitant est déja dans la liste"
    ok = False
    End If
Next i

Avez-vous une idée ?

Merci d'avance !

Batoine

Re-,

Je n'avais pas regardé attentivement les différents codes...

Euh, y'a du boulot....

Première question : Est-ce que les numéros de chantiers sont uniques, ou est-ce que tu peux avoir un Chantier1 dans le département du Rhône, et un Chantier1 dans le département de la Savoie, par exemple? (c'est à dire 2 chantiers nommés Chantier1)

Deuxième (et je pense qu'il y en aura d'autres....) : Comment mets-tu à jour les onglets "Chantiers" et "Affiliation"? (à la main, automatiquement...)

@ te relire

Re,

Oui effectivement il y a du boulot, je préfère il aller par étape et détaillez au fur et à mesure les soucis rencontrés. En tout cas merci beaucoup pour votre aide !

Pour votre première question :

En théorie les noms de chantiers sont tous différents, cependant et si cela est possible, j'aimerai pouvoir me contraindre (éviter des risques inutiles) et faire en sorte que les chantiers puissent avoir des noms similaires. Et donc faire une vérification par département ET par chantier. Je profite de votre expérience ! (Cette partie de code me sera utile dans une autre procédure de mon projet).

Pour la deuxieme :

Les onglets sont tous mis à jours automatiquement via des UF, aucune saisie n'est prévue directement sur les onglets.

Merci encore pour votre aide !

Batoine

Re-,

J'ai à peu près modifié tout le code (et commenté).

Par contre, il risque d'y avoir un problème s'il y a des noms de chantier identiques. (pour moi, il vaudrait mieux que chaque chantier ait un nom unique). Si c'est pas possible, il va falloir coder différemment (mais c'est possible)

Le principe :

A l'initialisation, on charge tous les départements (et seulement eux)

Dès le choix du département, on charge les chantiers correspondants

Dès le choix du chantier, on charge dans la listbox les sous-traitants déjà présents, et on charge les autres dans la combobox

Dès le choix d'un sous-traitant supplémentaire, et appui sur le bouton qui va bien (affiliation), on supprime le sous-traitant du combobox, et on le rajoute dans la listbox

Si tu sélectionnes un sous-traitant dans la listbox, et que tu le supprimes, on l'enlève de cette listbox, et on le remet dans la combobox.

A noter que les données des combobox sont triées par ordre alphabétique dès l'initialisation, ou en cas de changement....

Dès que tu valides l'affiliation par le bouton principal, on remet tous les sous-traitants dans la ligne du chantier qui va bien.

Regarde si cela te convient.

Bonne soirée

Bonjour cousinhub,

C'est absolument parfait ! Je n'avais pas penser à cette méthode. Elle est effectivement beaucoup plus intuitive pour l'utilisateur ! Un grand grand merci, grâce à vous j'ai pu apprendre l'ajout et la suppression à la listbox en fonction de la sélection effectuée.

Je débute en vba depuis 2 mois maintenant et c'est grâce à des personnes comme vous que j'accélère mon apprentissage et de vos commentaires sur le code.

Depuis lundi, j'ai bien avancé mon projet et ai travaillé sur la possibilité de modifier la "fiche" d'un sous-traitant. Et j'ai maintenant un autre problème, lié à ces modifications ; je m'explique :

Voici les modifications apportées responsable du problème (j'imagine) :

Dans le cas où le nom du ST ai changé suite à la modification, j'ai créée dans la feuille "Affiliation" un tableau. Ce tableau me permet de définir une zone de sélection dans laquelle une boucle s'effectue. La boucle me permet de chercher les cellules ayant comme valeur l'ancien nom du ST et de la remplacer par le nouveau nom défini par l'utilisateur.

Le problème résultant :

L'erreur s'effectue dans un cas précis, si l'utilisateur tente d'ajouter un sous-traitant qui existe déjà à la base de donnée. Dans ce cas excel le détecte et lui propose d'affilier ce ST à un chantier. Une nouvel UF s'affiche. L'utilisateur n'a plus qu'à sélectionner le chantier auquel il veut l'affilier. Une fois validé, le ST ne s'ajoute pas dans la première colonne vide de la ligne du chantier mais à la dernière colonne du tableau

Voici l'extrait du code de l'ajout :

'--------2.   si le formulaire est complet, on insère les valeurs sur la feuille AFFILIATION-------------------------
    If Ok = True Then

    Dim no_col_aff As Long
    Dim no_ligne_aff As Long
    Dim FoundCell As Range

                                'On récupère le numéro de la ligne auquel est inscrit le sous-traitant dans la feuille affiliation

    Set FoundCell = Workbooks("Aide détection première cellule vide").Sheets("Affiliation").Range("B:B").Find(What:=choix_chantier.Value)
    no_ligne = FoundCell.Row

                                'n° de la première colonne vide de la ligne du chantier sélectionné
    no_col_aff = Workbooks("Aide détection première cellule vide").Sheets("Affiliation").Cells(no_ligne, Columns.Count).End(xlToLeft).Column + 1

                                'Insertion des valeurs sur la feuille affiliation
    Sheets("Affiliation").Cells(no_ligne, no_col_aff) = nom.Value

     Unload Me
    Else
    End If

Afin d'éviter de rajouter l'UF de l'ajout du ST, il faudra, pour voir l'erreur, simplement renseigner un nom au harsard dans l'UF affiliation.

J'ai essayé (xlToRight) mais j'obtiens une erreur ensuite.... Je n'arrive pas non plus à trouver d'infos sur internet concernant la sélection de première cellule vide dans un tableau .

Merci d'avance,

Cordialement,

Antoine

Bonsoir,

J'aurai bien voulu pouvoir t'aider, mais si tu protèges tes onglets par des mots de passe, (onglet "Sous-Traitants"), ça va être moins simple....

J'aurai pu passer outre, (supprimer le mot de passe), mais il faut que tu prennes l'habitude de joindre des fichiers accessibles à tous...

Personnellement, je n'aurai pas rajouter un USF, le premier suffisant amplement, il suffirait de modifier un peu le code, et ça devrait le faire...

Mais pour faire les tests, je dois pouvoir modifier l'onglet protégé...

Et là, je ne peux pas...

@ te relire

Bonsoir cousinhub,

Quel idiot je suis ! Voici une nouvelle version sans le mot de passe.

J'ai aussi pensé à repartir de l'UF existante. Cependant je préfère que l'utilisateur voit une UF à l'aspect similaire à celle qu'il a utilisée pour ajouter des ST à la base de données.

Merci pour votre aide, et désolé pour ma réponse un peu tardive...

Batoine

Petit up pour espérer avoir une réponse,

Merci d'avance !

Batoine

Bonsoir,

Je suis donc parti sur mon idée...

1 seul USF...

Si tu changes le nom d'un sous-traitant, que tu en supprimes 1, que tu en rajoutes 1, tu n'auras dans la listbox (et dans la combobox) que le nom des sous-traitants valides.

Si tu as supprimé un sous-traitant, et qu'il apparaissait auparavant dans la liste du chantier, son nom n'apparaitra plus dans la listbox

Il faut pour cela que tu effectues tes modifications de sous-traitants dans l'onglet "Sous-traitant"

Et dès l'appui sur "Valider", la liste sera à jour dans l'onglet.

J'ai modifié le code pour déterminer la dernière colonne (je ne comprends pas pourquoi la valeur était fausse...)

Bonne soirée

Rechercher des sujets similaires à "suppression element selectionne listbox"