XL 2016 Actualiser la ComboBox après saisie dans TextBox

Yoyo01000

XLDnaute Occasionnel
Bonsoir le forum,
je suis à nouveau confronté à un problème :

Lorsque je mets une valeur dans une TextBox, je ne l'ai pas de suite dans la ComboBox. Je suis obligé de fermer l'UserForm et ensuite le relancer pour que la dernière valeur apparaisse dans la ComboBox.

Voici le code de l'UsF :

VB:
 ''UserForm de gestion des postes
    
     'Objet "ComboBox1" - Propriété "Change"
    
     ''Fenêtre de la ComboBox

     Private Sub ComboBox1_Change()

     End Sub

     'Objet "CommandButton1" - Propriété "Click"

     ''Bouton "Supprimer le poste"

     Private Sub CommandButton1_Click()
     Dim v As String
            v = Me.ComboBox1.Value
         Sheets("listes").Rows(ComboBox1.ListIndex + 2).Delete
         Application.DisplayAlerts = True
         Unload Me
         UserForm1.Show
    
     End Sub
    
     'Objet "CommandButton"-----Procédure "Click"
    
     ''bouton de validation de la TextBox1

     Private Sub CommandButton2_Click()

     Dim feuilleTravail As Worksheet
     Set feuilleTravail = ActiveWorkbook.Sheets("listes") 'Inscrit la valeur de la TextBox dans l'onglet "listes"
     Dim numLigne As Integer
     numLigne = 2 'Commence la saisie de la TextBox à la ligne 2

     While feuilleTravail.Cells(numLigne, 1).Value <> ""
     numLigne = numLigne + 1
     Wend

     feuilleTravail.Cells(numLigne, 1).Value = TextBox1.Text 'Saisie des valeurs de la TextBox dans la colonne A

     'Unload Me 'permet de quitter l'UsF après validation de la valeur dans la TextBox
     Me.TextBox1 = "" 'Permet de décharger la TextBox après validation de la saisie précédente
     Me.TextBox1.SetFocus 'Permet de garder le curseur dans la TextBox

     End Sub

     'Objet "Label1" - Propriété "Click"

     ''Texte de définition de saisie à ajouter dans la TextBox
    
     Private Sub Label1_Click()

     End Sub
    
     'Objet "Label2" - Procédure "Click"
    
     ''Texte de définition de saisie à ajouter dans la TextBox
    
     Private Sub Label2_Click()

     End Sub

     'Objet "TextBox1" - Procédure "Change"
    
     ''Fenêtre de la TextBox
    
     Private Sub TextBox1_Change()

     End Sub

     'Objet "UserForm" - Propriété "Initialize"
    
     ''Récupération de la liste en colonne A de la feuille "listes"
    
     Private Sub UserForm_Initialize()
     Sheets("listes").Activate
     ComboBox1.List = Range("Poste_d_appel").Value 'Menu déroulant de la ComboBox via "Gestionnaire de noms"
     End Sub

S'il le faut, je joindrais le fichier mais je devrais le retravailler car il contient des données personnelles...

Par avance merci :)
 

Pièces jointes

  • TextBox.PNG
    TextBox.PNG
    53.6 KB · Affichages: 26

Dranreb

XLDnaute Barbatruc
Bonsoir.
Mon objet ComboBoxLiées est muni d'une méthode Actualiser qui recalcule toutes les listes de toutes les ComboBox dont on lui a confié la charge. Pourquoi personne ne veut jamais me croire quand je dis qu'il est très facile à utiliser ? …
 

Dranreb

XLDnaute Barbatruc
Êtes vous intéressé par un Complément .xlam permettant des gérer des ComboBox liées se rapportant à différentes colonnes d'un même tableau ainsi que les contrôles associés, ne participant pas à la recherche ou à l'identification d'une ligne existante, se rapportant à d'autres colonnes du même tableau ?
 

job75

XLDnaute Barbatruc
Bonsoir Yoyo01000, Bernard,

Si je comprends bien c'est vraiment très simple, voyez le fichier joint et le code de l'UserForm :
VB:
Private Sub CommandButton1_Click() 'OK
If TextBox1 = "" Then Exit Sub
ComboBox1 = TextBox1
If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem TextBox1
ComboBox1 = ""
TextBox1.SetFocus: TextBox1.SelStart = 0: TextBox1.SelLength = Len(TextBox1)
ComboBox1.DropDown
End Sub
A+
 

Pièces jointes

  • MAJ ComboBox(1).xlsm
    22.5 KB · Affichages: 26

Yoyo01000

XLDnaute Occasionnel
Bonjour,
tout d'abord : merci de vous être penchés sur mon sujet !

Bernard, je n'hésiterai pas à vous solliciter pour un éventuel .xlam, si j'en ai besoin (sans trop savoir ce que c'est pour le moment)

Job75, merci pour le fichier mais il ne convient pas précisément à ce que je recherche (désolé).

Je vous joins le mien, que j'ai purgé, pour que cela vous aide sans doute un peu plus vis-à-vis de ma demande.

Si par exemple, je mets la valeur E dans la TextBox, elle s'affiche bien dans la colonne A de la feuille "listes", à la suite de A;B;C;D

Par contre, la valeur E ne s'affiche pas dans la ComboBox.
Pour cela, je suis obligé de quitter l'UsF pour ensuite le relancer pour que E s'affiche dans la ComboBox.

J'espère être précis dans ma demande.

Encore merci d'avoir utiliser votre énergie pour moi :)
 

Pièces jointes

  • UsF-Forum.xlsm
    31.8 KB · Affichages: 12

job75

XLDnaute Barbatruc
Bonjour Yoyo01000, Bernard,

Voyez le fichier joint et le code de l'UserForm :
VB:
Private Sub CommandButton2_Click() 'Ajouter le poste
If TextBox1 = "" Then Exit Sub
Dim lig As Variant
With Sheets("listes")
    lig = Application.Match(TextBox1, .Columns(1), 0)
    If IsNumeric(lig) Then MsgBox "'" & TextBox1 & "' existe déjà...": Exit Sub 'évite les doublons
    lig = .Columns(1).Find("", , xlValues).Row
    .Cells(lig, 1) = TextBox1
    TextBox1 = ""
    UserForm_Initialize
    ComboBox1.DropDown 'facultatif, déroule la liste
End With
End Sub

Private Sub CommandButton1_Click() 'Supprimer le poste
If ComboBox1.ListIndex = -1 Then Exit Sub
Sheets("listes").Rows(ComboBox1.ListIndex + 2).Delete
ComboBox1 = ""
UserForm_Initialize
End Sub

Private Sub UserForm_Initialize()
Dim h&
With Sheets("listes")
    h = .Columns(1).Find("", , xlValues).Row - 2
    If h < 1 Then ComboBox1.Clear: Exit Sub
    ComboBox1.List = .Cells(2, 1).Resize(h, 2).Value '2 colonnes pour avoir au moins 2 éléments
End With
End Sub
A+
 

Pièces jointes

  • UsF-Forum(1).xlsm
    32.2 KB · Affichages: 19

Dranreb

XLDnaute Barbatruc
Bonjour.
Mon code :
VB:
Option Explicit
Private RngPostes As Range, LCou As Long, ExInduite As Boolean
Private Sub UserForm_Initialize()
   Set RngPostes = Feuil8.[Poste_d_appel]
   Set RngPostes = RngPostes.Resize(RngPostes(1000, 1).End(xlUp).Row - RngPostes.Row + 1)
   ComboBox1.List = RngPostes.Value
   End Sub
Private Sub TextBox1_Change(): If ExInduite Then Exit Sub
   ComboBox1.Text = TextBox1.Text
   End Sub
Private Sub ComboBox1_Change(): If ExInduite Then Exit Sub
   ExInduite = True: TextBox1.Text = ComboBox1.Text: ExInduite = False
   If ComboBox1.MatchFound Then LCou = ComboBox1.ListIndex + 1 Else LCou = 0
   CommandButton1.Enabled = LCou > 0
   CommandButton2.Enabled = ComboBox1.Text <> "" And LCou = 0
   End Sub
Private Sub CommandButton2_Click()
   LCou = RngPostes.Rows.Count + 1
   Set RngPostes = RngPostes.Resize(LCou)
   RngPostes(LCou, 1).Value = ComboBox1.Text
   ThisWorkbook.Names.Add "Poste_d_appel", RngPostes
   ComboBox1.List = RngPostes.Value
   ComboBox1.Text = ""
   End Sub
Private Sub CommandButton1_Click()
   If RngPostes.Rows.Count <= 2 Then
      MsgBox "Il doit rester au moins 2 postes dans la liste", vbCritical, CommandButton2.Caption
      Exit Sub: End If
   RngPostes(LCou, 1).Delete xlShiftUp
   ComboBox1.List = RngPostes.Value
   ComboBox1.Text = ""
   End Sub
Je n'ai pas trop compris à quoi servait votre TextBox1 alors j'ai simplement veillé à ce qu'il y ait toujours la même chose que dans la ComboBox1, laquelle aurait suffit. J'ai supposé qu'il ne devait pas y avoir de doublon dans la liste.

Attention, ce code peut introduire des #REF! dans la colonne B. C'est normal, vous n'avez rien expliqué à son sujet.

Un "Complément Excel (*.xlam)" est un fichier non visible dont ce sont essentiellement des macros de son projet VBA qui sont destinées à être utilisées. S'il est autre que "VBAProject", le nom de son projet peut être coché dans les références de celui d'un classeur utilisateur.
Je propose souvent un CBxLCtlA.xlsm muni d'une procédure d'installation automatique en CBxLCtlA.xlam sur le dossier des compléments Excel et dont le projet VBA s'appelle "CLsCAs". Il contient principalement des définitions d'objets ComboBoxLiées et ControlsAssociés, bien adaptés à la mise à jour d'un tableau (de préférence régi par Excel) dont chaque ligne est identifiée par une combinaison de valeurs dans une ou plusieurs colonnes.
 
Dernière édition:

Yoyo01000

XLDnaute Occasionnel
Bonjour Yoyo01000, Bernard,

Voyez le fichier joint et le code de l'UserForm :
VB:
Private Sub CommandButton2_Click() 'Ajouter le poste
If TextBox1 = "" Then Exit Sub
Dim lig As Variant
With Sheets("listes")
    lig = Application.Match(TextBox1, .Columns(1), 0)
    If IsNumeric(lig) Then MsgBox "'" & TextBox1 & "' existe déjà...": Exit Sub 'évite les doublons
    lig = .Columns(1).Find("", , xlValues).Row
    .Cells(lig, 1) = TextBox1
    TextBox1 = ""
    UserForm_Initialize
    ComboBox1.DropDown 'facultatif, déroule la liste
End With
End Sub

Private Sub CommandButton1_Click() 'Supprimer le poste
If ComboBox1.ListIndex = -1 Then Exit Sub
Sheets("listes").Rows(ComboBox1.ListIndex + 2).Delete
ComboBox1 = ""
UserForm_Initialize
End Sub

Private Sub UserForm_Initialize()
Dim h&
With Sheets("listes")
    h = .Columns(1).Find("", , xlValues).Row - 2
    If h < 1 Then ComboBox1.Clear: Exit Sub
    ComboBox1.List = .Cells(2, 1).Resize(h, 2).Value '2 colonnes pour avoir au moins 2 éléments
End With
End Sub
A+

Je n'ai qu'une chose à dire : PARFAIT :)

Vous répondez à merveille à ce que je voulais.

Je reste admiratif face à vos compétences et face à des personnes compétentes comme vous !

Je souhaite un jour "être de l'autre côté", pour moi mais aussi bien sûr pour les autres :)

Merci à vous !
 

Yoyo01000

XLDnaute Occasionnel
Bonjour.
Mon code :
VB:
Option Explicit
Private RngPostes As Range, LCou As Long, ExInduite As Boolean
Private Sub UserForm_Initialize()
   Set RngPostes = Feuil8.[Poste_d_appel]
   Set RngPostes = RngPostes.Resize(RngPostes(1000, 1).End(xlUp).Row - RngPostes.Row + 1)
   ComboBox1.List = RngPostes.Value
   End Sub
Private Sub TextBox1_Change(): If ExInduite Then Exit Sub
   ComboBox1.Text = TextBox1.Text
   End Sub
Private Sub ComboBox1_Change(): If ExInduite Then Exit Sub
   ExInduite = True: TextBox1.Text = ComboBox1.Text: ExInduite = False
   If ComboBox1.MatchFound Then LCou = ComboBox1.ListIndex + 1 Else LCou = 0
   CommandButton1.Enabled = LCou > 0
   CommandButton2.Enabled = ComboBox1.Text <> "" And LCou = 0
   End Sub
Private Sub CommandButton2_Click()
   LCou = RngPostes.Rows.Count + 1
   Set RngPostes = RngPostes.Resize(LCou)
   RngPostes(LCou, 1).Value = ComboBox1.Text
   ThisWorkbook.Names.Add "Poste_d_appel", RngPostes
   ComboBox1.List = RngPostes.Value
   ComboBox1.Text = ""
   End Sub
Private Sub CommandButton1_Click()
   If RngPostes.Rows.Count <= 2 Then
      MsgBox "Il doit rester au moins 2 postes dans la liste", vbCritical, CommandButton2.Caption
      Exit Sub: End If
   RngPostes(LCou, 1).Delete xlShiftUp
   ComboBox1.List = RngPostes.Value
   ComboBox1.Text = ""
   End Sub
Je n'ai pas trop compris à quoi servait votre TextBox1 alors j'ai simplement veillé à ce qu'il y ait toujours la même chose que dans la ComboBox1, laquelle aurait suffit. J'ai supposé qu'il ne devait pas y avoir de doublon dans la liste.

Attention, ce code peut introduire des #REF! dans la colonne B. C'est normal, vous n'avez rien expliqué à son sujet.

Un "Complément Excel (*.xlam)" est un fichier non visible dont ce sont essentiellement des macros de son projet VBA qui sont destinées à être utilisées. S'il est autre que "VBAProject", le nom de son projet peut être coché dans les références de celui d'un classeur utilisateur.
Je propose souvent un CBxLCtlA.xlsm muni d'une procédure d'installation automatique en CBxLCtlA.xlam sur le dossier des compléments Excel et dont le projet VBA s'appelle "CLsCAs". Il contient principalement des définitions d'objets ComboBoxLiées et ControlsAssociés, bien adaptés à la mise à jour d'un tableau (de préférence régi par Excel) dont chaque ligne est identifiée par une combinaison de valeurs dans une ou plusieurs colonnes.

Oui, désolé, je n'ai rien expliqué au sujet des autres colonnes qui n'ont pour l'instant aucune utilité actuellement mais elles en auront plus tard :)

Je veux bien, à l'occasion et si vous possédez cela, un exemple de fichier .xlam, pour me rendre un peu plus compte de vos explications y étant liées :)

Je vous remercie aussi pour votre aide, votre patience, votre dévouement auprès de personnes comme moi ayant besoin de personnes comme vous !

MERCI !
 

Discussions similaires

Réponses
15
Affichages
425

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof