Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Combobox ajouter si n'existe pas dans Liste

  • Initiateur de la discussion Initiateur de la discussion eric72
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

eric72

XLDnaute Accro
Bonjour à tous,
Je me retrouve face à un problème avec une combobox(exemple CbFournisseur1), je souhaiterai lors de l'entrée d'une valeur non présente dans le TB TbFournisseur, l'ajouter à ce tableau, j'ai donc mis ce code

VB:
'**************************************************************************************
'TEST SI LA SOCIETE EXISTE DEJA
'**************************************************************************************
    'nom de la feuille
    Set ws = ThisWorkbook.Sheets("Données")
    ' nom du tableau structuré
    Set TbFourn = ws.ListObjects("TbFournisseur")
    ' Récupérez les valeurs des TextBox du UserForm
    valeurA = UsfAchats.CbFournisseur1.Value
    ' Réinitialiser les indicateurs
    trouveA = False
    ' Recherche de la valeur A dans la colonne du tableau structuré correspondant à "cbfournisseur1"
If ws.ListObjects("TbFournisseur").ListRows.Count <> 0 Then
    For Each cell In TbFourn.ListColumns(1).DataBodyRange
        If cell.Value = valeurA Then
            trouveA = True
            Exit For
        End If
    Next cell
End If

    ' Vérifier si la valeur ont été trouvée
    If trouveA Then
    
    Else
    
        With ws.ListObjects("TbFournisseur")
                Dim W
                ' On constitue la liste de données à Ajouter à la liste
                W = Array(CbFournisseur1)
                .ListRows.Add.Range.Cells(1).Resize(, 1) = W ' On ajoute la ligne à la base
        End With
        
  End If

End Sub

dans l'évènement Afterupdate de ma combobox (code déjà utilisé à maintes reprises sans problème), mais cette fois il plante au moment d'ajouter la ligne et me sors carrément du fichier, il doit y avoir une incohérence, mais je ne la vois pas.
Auriez-vous une petite idée du pourquoi?
Merci beaucoup de votre aide!
Eric
 

Pièces jointes

Solution
Salut,
L'erreur se produit car les comboboxs 1 à 5 sont liés par des rowsource à la table des fournisseurs, ce qui interdit la mise à jour de la table
Il faut donc rompre ce lien, mettre à jour la table et rétablir les liens .
VB:
Private Sub CbFournisseur1_Enter()
    CbFournisseur1.DropDown
End Sub
Private Sub CbFournisseur1_AfterUpdate()
    If CbFournisseur1 = "" Then Exit Sub
    
    With ThisWorkbook.Sheets("Données").[TbFournisseur[Fournisseur]] 'nom de la feuille
        Set f = .Find(Me.CbFournisseur1.Value, , , xlWhole)
        If f Is Nothing Then ' Le fournisseur n'existe pas, on doit l'ajouter
            ' Rupture des liens avec la table des fournisseurs qu'on doit mettre à jour
            For i = 1 To 5...
Bien sur tu as raison, d'ailleurs j'ai bien mis le code lors de la validation, si tu relis le post14 j'ai expliqué pourquoi je l'avais mis dans afterupdate!
En fait, tu t'es emmêlé les pinceaux. Cela arrive très souvent lorsqu'on pense que le code d'un projet puisse répondre à son besoin et qu'on essaie d'adapter le code à son propre fichier.

J'ai bien reconnu le style de codage de feu Jacques Boisgontier dans ton fichier.
Ton code plantait en cliquant dans la listbox car le code faisait appel à un autre formulaire.

Mais bon, si tu arrives à tes fins tant mieux, afin que tu puisses finaliser ton projet.
Comme signalé par notre ami @ChTi160 (que je salue), il y a encore des erreurs dans ton projet.

Bonne journée.
 
Je ne crois pas que cette erreur
VB:
Call AjoutValeurComboBox(UsfAchats.CbFournisseur1, "TbFournisseur", "TbFournisseur")
vienne de mon code!!!
Merci et bonne journée également
 
Bonjour,
J'avoue n'avoir pas lu tous les postes alors si mon questionnement a déjà été effectué j'en suis désolé.

Si tu saisie une valeure dans une listebox et qu'elle n'existe pas, listindex passe à -1

Si tu evalue kepressd avec le retour chariot tu pourras évaluer le listindex au moment où tu appuies sur la touche [ENTER] et ainsi faire ton ajoute de données.

Je suis sur mon téléphone portable alors si tu es intéressé, je subodore qu'un internote charitable t'apportera la solution.
 
Je ne crois pas que cette erreur
VB:
Call AjoutValeurComboBox(UsfAchats.CbFournisseur1, "TbFournisseur", "TbFournisseur")
vienne de mon code!!!
Merci et bonne journée également
au temps pour moi. En effet, il y a bien une erreur due au copier coller. Mais dans la fonction, il y a une vérification du nom de la colonne et du coup, sauf erreur de ma part cela n'influe pas sur le résultat.
Bonne journée.
 
Bonjour @ChTi160 ,

Désolé, pour ma réponse tardive, j'avais cru que tu avais posé la question à @eric72.
J'ai lui ai donné une réponse au post#34.
Encore merci "oeil de lynx".
 
Bonjour,
merci pour ta réaction à ce fil, j'ai adopté la solution du post 9, mais je constate que bon nombre de volontaires tentent d'aider à résoudre ce souci et je vous en remercie tous.
Bonne journée et merci encore!!!
 
Rebonjour,
J'ai testé ton fichier et malheureusement toujours le même message (surement du au rowsource qui n'est pas "déconnecté") au moment de la mise à jour de la liste...
Là, mon ami je ne peux plus rien faire étant donné que cela ne se produit pas chez moi.
J'ai vérifié cette propriété pour les comboboxs et la lisbox, elle n'est pas utilisée.
J'aurai dû posé la question à @fanch55.

J’espère que l'on te proposera une solution.

edit: tu ne me donnes pas la ligne de la procédure qui plante.
 
Re
Dans le code de « UsfAchats » du dernier fichier de Cathodique

J’ai trouvé ce qui cause l'erreur !

'On Remplit les listes de combobox
VB:
Sub RemplitlesListes()
CbCompte1.RowSource = "TbComptes"
CbCompte2.RowSource = "TbComptes"
CbCompte3.RowSource = "TbComptes"
CbCompte4.RowSource = "TbComptes"
CbCompte5.RowSource = "TbComptes"
CbFournisseur1.RowSource = "TbFournisseur"  'ici
CbFournisseur2.RowSource = "TbFournisseur"  'ici
CbFournisseur3.RowSource = "TbFournisseur"  'ici
CbFournisseur4.RowSource = "TbFournisseur"  'ici
CbFournisseur5.RowSource = "TbFournisseur"  'ici
End Sub

Ou il y a une référence au Rowsource des Combobox !

Si on supprime ces 5 lignes plus d’erreur.

Bonne continuation

Jean marie
 
c'est cette procédure cause problème (utilisation de RowSource). Remplace-la par cette porcédure.
VB:
'*************************************************************************************************
'On Remplit les listes de combobox
'*************************************************************************************************
Sub RemplitlesListes()
   CbCompte1.List = [TbComptes].Value
   CbCompte2.List = [TbComptes].Value
   CbCompte3.List = [TbComptes].Value
   CbCompte4.List = [TbComptes].Value
   CbCompte5.List = [TbComptes].Value
   CbFournisseur1.List = [tbFournisseur].Value
   CbFournisseur2.List = [tbFournisseur].Value
   CbFournisseur3.List = [tbFournisseur].Value
   CbFournisseur4.List = [tbFournisseur].Value
   CbFournisseur5.List = [tbFournisseur].Value
End Sub
 
rebonjour oeil de Lynx. Ce n'est pas ma procédure. Elle y était déjà.
Je me demande pourquoi, notre ami @eric72 fait toute une gymnastique pour initialiser son formulaire.
 
rebonjour oeil de Lynx. Ce n'est pas ma procédure. Elle y était déjà.
Je me demande pourquoi, notre ami @eric72 fait toute une gymnastique pour initialiser son formulaire.
Mais je n'ai fait aucune gymnastique!!! Il y a mon code d'origine et celui que tu as modifié, les rowsource des combobox y sont depuis le départ(c'est d'ailleurs l'origine du "Bug"), donc tu décides gentiment de trouver la solution et tu laisses une partie de mon code qui fait planter...
Je ne sais pas quoi te dire, tout en sachant que le code de Fanch55 me satisfait.
 
Je parlais dans mon précédent post de ton code ci-dessous (en fait, qui n'est pas le tien, J'ai bien reconnu le style de JB site)
VB:
Private Sub UserForm_Initialize()
Usf_VisibleAchats = True
Application.ScreenUpdating = False
Me.Left = Application.Left + Application.Width / 2 - Me.Width / 2
Me.Top = Application.Top + Application.Height / 2 - Me.Height / 2
        Set f = Sheets("TbAchats")
        Set rng = f.Range("A2:F" & f.[a1000000].End(xlUp).Row)                      ' BD (1 colonne de plus)
            colInterro = Array(1, 2, 3, 4, 5, 6) ' colonnes à interroger (adapter)
            colVisu = Array(1, 2, 3, 4, 5, 6) ' colonnes à visualiser (adapter)
            Decal = rng.Row - 1                                               ' début de la BD
            BD = rng.Value
            col = UBound(BD, 2): For i = LBound(BD) To UBound(BD): BD(i, col) = i + Decal: Next i 'no enreg
            NcolInt = UBound(colInterro) + 1
            Ncol = UBound(colVisu) + 1       ' : ReDim ancien(1 To 1, 1 To Ncol)
            Me.LstCharges.ColumnCount = UBound(colVisu) + 2
            Me.LstCharges.ColumnWidths = "60;200;200;50;0;0;0"
  '-- génération de choix()
    ReDim choix(1 To UBound(BD))
    col = UBound(BD, 2)
  For i = LBound(BD) To UBound(BD)
     For Each k In colInterro
       choix(i) = choix(i) & BD(i, k) & "|"
       If IsDate(BD(i, k)) Then BD(i, k) = Format(BD(i, k), "dd/mm/yyyy")
       BD(i, 1) = CDate(BD(i, 1))
     Next k
     choix(i) = choix(i) & BD(i, col) & "|"   ' no enreg
  Next i

  '--- valeurs initiales dans ListBox
  Dim Tbl(): ReDim Tbl(1 To UBound(BD), 1 To Ncol + 1)
  For i = 1 To UBound(BD)
   C = 0
     For Each k In colVisu
       C = C + 1: Tbl(i, C) = BD(i, k)
     Next k
     C = C + 1: Tbl(i, C) = i + Decal
   Next i
   Me.LstCharges.List = Tbl
   Me.LstCharges.ListIndex = -1
Application.ScreenUpdating = True

    RemplitlesListes
   BtnModifier.Visible = False

End Sub
Plus que tu nous dis que la solution de Fanch55 te convient.
J'en prends note. Bien fait pour moi d'avoir essayé de t'aider pour avoir un fichier qui tienne la route.

Je devais joindre un autre fichier. Dommage, il va aller direct à la poubelle.

Bonne continuation.
 
Je ne comprends pas pourquoi tu le prends mal, j'ai bien dit que je m'intéressais aux autres propositions qui permet aussi de progresser, donc il n'y aucun souci. D'ailleurs je t'ai remercié de l'intérêt que tu as porté à mon problème.
Je te remercie une nouvelle et prends bien en compte ta proposition
Bonne journée à toi
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
182
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…