Liste intuitive /// adapatation fonction

Bonjour à tous les mordus de VBA,

En faisant des recherches sur une liste intuitive, je suis tombé sur une fonction VBA mais je n'arrive pas à l'adapter.

Comment dans le fichier en PJ, peut-on :

  • Aller chercher la liste dans une feuille nommée « Feuil2 » et qui commence en B2 sur cette même feuille ?
  • Paramétrer la largueur des TextBox / ListBox ? Je ne trouve pas où ces paramètres ont été définis dans visual basic
  • Paramétrer le nombre de ligne affichée dans la ListBox ? Je ne trouve pas où ces paramètres ont été définis dans visual basic

Je pense que c’est assez simple pour vous mais là je sèche

Merci par avance.

Jonathan

12essai.zip (20.51 Ko)

Bonjour,

Tu actives l'onglet Développeur, tu cliques sur Mode création, tu cliques aussi à côté sur Propriétés pour ouvrir la fenêtre de propriétés (tu choisis accessoirement l'affichage des propriétés dans la fenêtre : par ordre alpha ou par catégories).

Tu sélectionnes ta ListBox (par un clic dessus) : la fenêtre de propriétés affichera alors les propriétés de la ListBox...

C'est dans cette fenêtre que l'on définit à la conception les propriétés que l'on souhaite donner par défaut à un contrôle. Tout ce qu'on peut définir directement au départ dans cette fenêtre se fait plus rapidement et plus efficacement et c'est autant de code en moins !

On réserve ainsi le code pour les changements dynamiques qui ne peuvent intervenir qu'en cours d'exécution selon le contexte ou les choix faits par l'utilisateur.

Donc, si tu n'as pas à modifier constamment en cours d'utilisation, les dimensions de ta ListBox, le nombre d'éléments affichés, etc., c'est là qu'il faut le faire.

Même mieux, si ta liste de données parmi lesquelles tu sélectionnes dans la ListBox est toujours affectée en totalité, il est inutile de la reconstituer à chaque fois par la méthode AddItem (ce qui est fait dans ton code, mais tu indiques l'adresse de la plage contenant la liste à la propriété ListFillRange [quand la ListBox est dans un Userform, c'est la propriété RowSource...], ou encore mieux tu nommes ta liste de façon dynamique (le nom s'adaptant aux changements de taille de la liste) et tu indiques le nom à ListFillRange, et c'est fait une fois pour toutes.

Cordialement.

Merci MFerrand,

Je vais tester tout cela

Jonathan

Re MFerrand,

Je n'y arrive pas avec ta proposition.

As-tu la possibilité de m'éclairer sur la fonction VBA et son adaptation pour modifier la source et la prendre à partir de la cellule B2 de la feuil2 ?

Un grand merci par avance.

J.

Dans ton fichier, il n'y a pas de Feuil2. Tu en mets une avec la liste et on pourra illustrer.

Quel idiot

12essai.zip (19.64 Ko)

J'ai nommé ta List2, en dynamique : tu regarderas comment on fait dans le Gestionnaire de noms.

J'ai affecté à plage nommée à ListFillRange : Voir dans les Propriétés.

J'ai invalidé la procédure qui complétait la liste (la dernière dans le module) et j'ai aussi invalidé la procédure Change dut TextBox pour la remplacer par une procédure LostFocus, qui intervient quand tu quittes le TextBox.

Si tu saisis dans le TextBox, cette proc. va lorsque tu le quittes, transférer l'inscription dans la cellule active, vérifier si la saisie est dans la liste, l'ajoute à la liste si elle n'y est pas, réaffecte la liste à ListFillRange (pour mise à jour immédiate),efface le TextBox.

Cela devrait te permettre de mieux voir les possibilités de manipulation que tu as.

Cordialement.

27jonleboss-essai.zip (20.25 Ko)

Merci MFerrand !!!

Beau boulot, y a du niveau là.

Juste une dernière question, comment faire en sorte que cette apparition de la ListBox / TextBox ne se fasse que quand je clique dans une cellule de la colonne B sur la Feuil1 ?

Un grand merci

Jonathan

Tu modifies ainsi la procédure Selection_Change :

Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Sélection d'une cellule
    If Target.Count = 1 And Target.Column = 2 Then
        ' déplacement du TextBox
        TextBox1.Left = Target.Left + Target.Width
        TextBox1.Top = Target.Top
        TextBox1.Visible = True
        ' Déplacement du ListBox
        ListBox1.Left = TextBox1.Left
        ListBox1.Top = TextBox1.Top + TextBox1.Height
        ListBox1.Visible = True        ' Chargement de la ListBox
        'Call ChargeListbox("")
   Else
        TextBox1.Visible = False
        ListBox1.Visible = False
    End If
End Sub

Encore un fois, c'est parfait

Et super la fonction pour que la ListBox / TextBox s'efface !

Par contre, j'ai essayé de modifier différents paramètres pour comprendre, cela me servira dans le futur. Et j'ai un problème : quand je change le nom de l'onglet et que je le modifie dans la partie suivante ( Feuil2 en Data par ex. avec création d'une list3 ) :

Private Sub TextBox1_LostFocus()
    If TextBox1.Text <> "" Then
        ActiveCell.Value = TextBox1.Text
        If WorksheetFunction.CountIf([List3], TextBox1.Text) = 0 Then
            [List3].Cells([List3].Rows.Count + 1) = TextBox1.Text
            ListBox1.ListFillRange = "List3"
        End If
        TextBox1.Text = Empty
    End If
End Sub

Cela ne fonctionne plus, j'ai l'erreur suivante "erreur d'execution 424 objet requis ". J'ai regardé partout dans le code et je ne vois pas d'autre endroit où est mentionné Feuil1. Comment cette erreur peut s'expliquer ?

Merci.

J.

Bnjour,

Avec Combobox au lieu de TextBox+ListBox

Ceuzin

Tu n'avais pas modifié la propriété ListFillRange (dans la fenêtre de propriété, d'où contradiction).

Mais il y a eu autre chose, impossible de modifier quoi que ce soit. Le fichier a du être endommagé (?)

Je suis reparti du précédent pour reconstituer ton essai actuel.

Rechercher des sujets similaires à "liste intuitive adapatation fonction"