XL 2016 Interdire l'ajout d'un item dans Listbox s'il existe

piga25

XLDnaute Barbatruc
Bonjour,
Je rencontre un petit problème dont je n'arrive pas a trouver la solution.
Je souhaite interdire l'ajout d'un item dans une Listbox en fonction d'une valeur d'une Textbox. Cela fonctionne seulement en partie. En effet, cela ne prends pas en compte les items déjà présents dans cette Listbox mais uniquement ceux qui viennent d'être ajoutés.
Comment faire pour que cela prenne bien en compte tous les items même ceux déjà présents dans la ListBox

VB:
Private Sub CommandButton1_Click()
If Me.TB2 = "" Then Me.ListBox1.ListIndex = -1: Exit Sub
For i = 0 To ListBox3.ListCount - 1 'on boucle sur tout les items de la listbox3
    If ListBox3.List(i, 1) = Me.TB2 Then Exit Sub   'si l'item est déjà en listbox3 on sort
Next i
'sinon on ajout l'item
ListBox3.AddItem
  pos = Me.ListBox3.ListCount - 1
    Me.ListBox3.List(pos, 0) = Me.TB1 'N° Equipe
    Me.ListBox3.List(pos, 1) = Me.TB2 'N° planning
    Me.ListBox3.List(pos, 2) = Me.TB3 'Nom
    Me.ListBox3.List(pos, 3) = Me.TB4 'Prénom
    Me.ListBox3.List(pos, 4) = Me.TB5 ' SSF
ListBox2.AddItem
  pos = Me.ListBox2.ListCount - 1
    Me.ListBox2.List(pos, 0) = Me.TB1 'N° Equipe
    Me.ListBox2.List(pos, 1) = Me.TB2 'N° planning
    Me.ListBox2.List(pos, 2) = Me.TB3 'Nom
    Me.ListBox2.List(pos, 3) = Me.TB4 'Prénom
    Me.ListBox2.List(pos, 4) = Me.TB5 ' SSF
  Me.TB2 = ""
  Me.TB3 = ""
  Me.TB4 = ""
  Me.TB5 = ""
Me.ListBox1.ListIndex = -1
Me.CommandButton5.Visible = True
End Sub
 
Dernière édition:
Solution
Bonjour @piga25, le Fil, le Forum

J'ai essayé ton truc, je choisis l'équipe 1 et ensuite je veux ajouter le Nom4, Planning 1, en effet il l'ajoute dans la ListBox2 alors qu'il est déjà là...
Mais bon je ne comprends pas ta logique, tu check la ListBox3...

Moi j'ai fait ceci, ne sâchant pas en fait la finalité entre ces deux ListBox2 et 3, je suis radical !

VB:
Private Sub CommandButton1_Click()

For i = 0 To ListBox2.ListCount - 1 'on boucle sur tout les items de la listbox3
    If CStr(ListBox2.List(i, 1)) = CStr(Me.TB2.Text) Then
    MsgBox "doublon dans ListBox2 Planning = " & CStr(Me.TB2)
    Exit Sub
    End If
Next i


For i = 0 To ListBox3.ListCount - 1
    If CStr(ListBox3.List(i, 1)) = CStr(Me.TB2.Text) Then
    MsgBox...

jmfmarques

XLDnaute Accro
Bonjour
Regarde ce que fait ce petit test et adapte-le à ton gré :
VB:
Private Sub CommandButton1_Click()
  ListBox1.ListIndex = -1
  On Error Resume Next
  ListBox1.Value = TextBox1.Text
  On Error GoTo 0
  If ListBox1.ListIndex = -1 Then
    ListBox1.AddItem TextBox1.Text
  End If
  ListBox1.ListIndex = -1
End Sub
 

piga25

XLDnaute Barbatruc
Bonjour jmfmarques, le forum
pas trop compris le code
VB:
Private Sub CommandButton1_Click()
  ListBox1.ListIndex = -1 'On enlève la selection de l'item au cas ou.''
  On Error Resume Next ' gestion des erreurs'
  ListBox1.Value = TextBox1.Text ' pour mon cas c'est column (, 1) et je ne comprends pas .value'
  On Error GoTo 0 'si erreur on revient à 0'
  If ListBox1.ListIndex = -1 Then 'Si aucun item on poursuit'
    ListBox1.AddItem TextBox1.Text 'on ajoute l'item qui est egal à la textbox1
  End If
  ListBox1.ListIndex = -1
End Sub

C'est surtout cette ligne : ListBox1.Value = TextBox1.Text
on fait comment pour effectuer la boucle sur la bonne colonne
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir @piga25 , @jmfmarques , le forum

Ce que je ne comprends pas c'est que ce loop, devrait faire son job :
For i = 0 To ListBox3.ListCount - 1 'on boucle sur tout les items de la listbox3 If ListBox3.List(i, 1) = Me.TB2 Then Exit Sub 'si l'item est déjà en listbox3 on sort Next i

A moins que tu ne parles des items contenues dans les 5 colonnes de ta ListBox ?
Là je pense qu'il faudrait faire un double Loop,
For i to ListBox3.ListCount
For c to ListBox3.ColumnCount

@+Thierry
 

piga25

XLDnaute Barbatruc
Re
Je me suis peut-être mal exprimé.
Pour moi l'item c'est bien toute la ligne (colonne 0 à 4)
Mon problème c'est que si j'ajoute un Item (col 0 à 4) et que celui-ci figure déjà dans la listbox cela le rajoute et me fait un doublon.
Par contre si j'en ajoute un qui n'y figure pas cela le met bien et là si je le rajoute de nouveau cela prend bien en compte le doublon.
 

piga25

XLDnaute Barbatruc
Re
Avec le fichier peut être plus compréhensible.
Après avoir choisi une équipe dans la combobox, on choisi une personne dans la liste planning.
 

Pièces jointes

  • Gestion equipe V6.3.xlsm
    74.5 KB · Affichages: 21

jmfmarques

XLDnaute Accro
Je parle bien des items contenues dans les 5 colonnes par contre la vérifications doit se faire que sur la seconde colonne car c'est un numéro unique de référence qui y figure.

Pour moi l'item c'est bien toute la ligne (colonne 0 à 4)

Il est de la plus grande importance, quel que soit le domaine considéré, d'utiliser le même vocabulaire pour parler des mêmes choses. Cette nécessaire discipline fait que n'ont dès lors aucune place les expressions du genre "pour moi, etc ..." et son observation permet d'éviter certaines mésaventures, du genre de celle qu'a connue un couple dans un restaurant asiatique (pour demander que soit servie de la nourriture à leur chien, ils avaient fait le geste de manger en le montrant du doigt, ce qui a eu pour effet de se faire servir leur chien rôti et prêt à être mangé).

Alors non :
1) chaque ligne d'une listbox à plusieurs colonnes n'est pas composée d'un nombres d'items égal à celui des colonnes, mais d'un seul item (en première colonne) et de sous-items (les autres colonnes)
2) "l'item c'est bien toute la ligne" est donc inexact

Je n'ouvre jamais un classeur tiers et n'ouvre donc pas le tien.

Je vais donc attendre de toi (si tu veux mon aide) que, fort, maintenant, de ce que je t'ai fait savoir plus haut, tu exprimes à nouveau ta demande, mais en te montrant cette fois-ci clair, précis et concis . ;)
 
Dernière édition:

piga25

XLDnaute Barbatruc
Bonjour Jmfmarques, le forum
Comme quoi j'en apprends tous les jours.
Dans un premier temps, je choisie une équipe, ce qui à pour effet de trier la listbox3 en ne laissant que les items de cette équipe choisie.
Puis un second temps je choisie dans la listebox1 (n° planning, Nom, Prénom, N° pref) une personne pour lui affecter un numéro d'équipe qui est dans une Textbox (TB1). Pour cela cet item est copié dans des textbox (TB2 à TB4). Jusque là tous va très bien.
Et enfin dans un troisième temps, je valide en cliquant sur le commandbutton1 pour transférer les données des TB1 à TB5 dans les listebox2 et 3, cà c'est toujours OK.
Pour plus de sécurité et Je voudrais interdire l'ajout d'une personne si elle existe déjà dans cette même équipe, d'ou la condition :
If ListBox3.List(i, 1) = Me.TB2 Then Exit Sub

Actuellement, cela ne prends pas en compte les données déjà présente dans la listbox3, seulement celles qui y sont ajoutées.
Après avoir exécuté le code pas à pas, Je pense qu'il y a un conflit texte / numérique
Si je mets en numérique la TB2 cela passe dès le début, par contre cela ne prend plus en compte les données qui y sont ajoutées.

avec ce code cela fonctionne
VB:
Dim i As Integer
If Me.TB2 = "" Then Me.ListBox1.ListIndex = -1: Exit Sub
Me.ListBox3.ListIndex = 0
    For i = 0 To Me.ListBox3.ListCount - 1 'on boucle sur tout les items de la listbox3
    If Me.ListBox3.List(i, 1) = Me.TB2 Then Exit Sub 'si l'item est déjà en listbox3 on sort
    Next i
    For i = 0 To Me.ListBox3.ListCount - 1 'on boucle sur tout les items de la listbox3
    If Me.ListBox3.List(i, 1) = Me.TB2.Value * 1 Then Exit Sub 'si l'item est déjà en listbox3 on sort
    Next i
 

jmfmarques

XLDnaute Accro
Je t'avais demandé de te montrer concis.
Que veux-tu finalement dire techniquement ? (on ne parle ici que d'items et de sous-items, pas d' équipes", etc...°
Serait-ce ne pas ajouter à la listbox un item (et ses sous-items) si le sous-item en seconde colonne existe déjà dans cette colonne de la listbox ?
Si oui : confirme (et nul besoin alors d'une boucle)
Si non : soit bien plus précis
 

jmfmarques

XLDnaute Accro
Enfin ... (dommage d'avoir attendu 12 message pour ce qui s'exprimait si simplement .)

regarde alors ce petit exemple/démo que je viens de bâtir :
- une listbox listbox1 avec sa propriété columncount = 2
- une textbox textbox1 pour saisie simulée de l'item (en première colonne, donc)
- une textbox textbox2 pour saisie simulée du 1er sous-item (en seconde colonne, donc)
- un bouton de commande commandbutton1 pour tester
et ce code :
VB:
Private Sub CommandButton1_Click()
  ListBox1.ColumnCount = 2
  ListBox1.TextColumn = 2
  ListBox1.ListIndex = -1
  On Error Resume Next
  ListBox1.Text = TextBox2.Text
  On Error GoTo 0
  If ListBox1.ListIndex = -1 Then
    ListBox1.AddItem TextBox1.Text
    ListBox1.List(ListBox1.ListCount - 1, 1) = TextBox2.Text
  End If
  ListBox1.ListIndex = -1
End Sub
et regarde ce qui se passe, notamment si tu saisis en textbox2 un sous-item déjà présent en colonne 2 de ta listbox.
Voilà tout et je te laisse maintenant adapter cela à ton outil.
 

piga25

XLDnaute Barbatruc
Re

Cela fonctionne en partie, j'ai exactement le même problème qu'avec le code du post 1
Cela ne prend pas en compte les items et sous items déjà présent dans la listbox3 mais uniquement ceux rajoutés.

VB:
  ListBox3.ColumnCount = 5
  ListBox3.TextColumn = 2
  ListBox3.ListIndex = -1
  On Error Resume Next
  ListBox3.Text = TB2.Text
  On Error GoTo 0
  If ListBox3.ListIndex = -1 Then
    ListBox3.AddItem TB1.Text
    ListBox3.List(ListBox3.ListCount - 1, 1) = TB2.Text
    ListBox3.List(ListBox3.ListCount - 1, 2) = TB3.Text
    ListBox3.List(ListBox3.ListCount - 1, 3) = TB4.Text
    ListBox3.List(ListBox3.ListCount - 1, 4) = TB5.Text
  End If
  ListBox3.ListIndex = -1

Dans le post 10 j'évoquais l'hypothèse d'un conflit entre Texte et numérique d'ou l'ajout d'une seconde condition.
Je ne sais pas si cela peut correspondre également à ce code proposé.
 

Discussions similaires

Réponses
12
Affichages
1 K