XL 2016 Alimenter textbox en fonction d'une listbox

troopers87

XLDnaute Occasionnel
Bonjour à tous,

Le sujet a été parcouru sur de nombreux aspects, mais il semble que j'ai une particularité qui pose souci...

Je souhaite tenir une base listant des comptes d'épargne : Livret A, PEL... Je ne veux pas que l'utilisateur touche directement à Excel, donc j'ai recours à un UserForm.

L'objectif de ce UserForm est que l'utilisateur puisse sélectionner le compte à modifier via la ListBox : par exemple, il clique sur "Livret A" et les TextBox "Montant compte" et "Taux compte" se mettent à jour avec les données du compte en question.

Grosse particularité : il faut que l'utilisateur puisse paramétrer un nouveau compte en modifiant le nom d'un compte disponible ("Compte 4 dispo" devient "LEP", par exemple), ce qui complique énormément le problème, j'en ai peur... Il faut peut-être passer par une clé unique du type #01, #02, #03...

Petite précision : le fichier ne doit pas gérer un nombre infini de compte. Du coup, j'ai nommé les cellules Excel correspondantes, ce qui peut aider à développer la fonction ?

Merci d'avance pour votre aide !
 

Pièces jointes

  • test.xlsm
    23.4 KB · Affichages: 33

youky(BJ)

XLDnaute Barbatruc
Bonjour Troopers,
Regarde si cela conviens, attention j'ai renommé listbox1 et les textbox1 2 3
J'ai renommé car si beaucoup de textbox avec 3 lignes on peut tout remplir ou écrire alors que si c'est nommé rien à faire.
Regarde bien les macros on évite les points pour mettre des virgules.
Donc à éviter
Bruno
 

Pièces jointes

  • test (1).xlsm
    24.7 KB · Affichages: 108

troopers87

XLDnaute Occasionnel
Bonjour Youky et merci beaucoup pour ce retour !

C'est exactement cela que je cherche ! Il va falloir que je me concentre davantage sur le code pour comprendre comment vous parvenez à faire remonter les valeurs de la ligne concernée, mais c'est impressionnant : bravo ! :)

Deux choses me gênent :
1. lorsque je modifie le taux ou le montant, les données ne se mettent pas à jour dans le tableau : mais je pense que je pourrai m'en charger moi-même en me basant sur le code existant,
2. plus problématique : je tiens à utiliser le tableau nommé Excel et le nom des champs. Par exemple [TABLEAU2[MONTANT COMPTE]] car le tableau est susceptible d'être déplacé ou l'ordre des colonnes changé. Est-ce possible de faire évoluer le code en ce sens ?

Je vous remercie encore !
 

youky(BJ)

XLDnaute Barbatruc
Bonsoir,
Je pense le fichier un peu simplet mais bon c'est un exemple
1 - Le bouton de l'userform mets bien à jour les données si on les modifies "Mettre à jour"
2 - Le code n'utilise pas les noms des tableaux donc tu peux encore les utiliser à ta guise.
Par contre OUI si le tableau change de place et en plus avec d'autres colonnes ou tout mélangé là tout se complique.
Je m'attends à une usine à gaz donc essaye de bien étudier le truc avant toute chose.
Bruno
 

troopers87

XLDnaute Occasionnel
Bonjour Youby,

Oui, il est vrai que le fichier est un exemple type : le fichier que j'utilise me permet de gérer mes comptes et est bien plus complet ! De plus, il est amené à évoluer régulièrement et l'ajout de colonnes est vraiment courant...
Voici un exemple de code que j'utilise, par exemple :
VB:
If ListBoxG = "" Then Exit Sub
[BD[DETAIL]].End(xlDown)(2) = ListBoxG.Value

Selon moi, c'est très pratique car cela réduit le risque d'une colonne qui se décale. Au final, je crois limiter le côté usine à gaz en passant par les tableaux et colonnes nommées.

En suivant cette logique, je me suis permis de modifier votre code de la manière suivante :
VB:
Private Sub CommandButton_MAJ_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
With Feuil1
lig = ListBox1.ListIndex + 2
.Cells(lig, [COLOR=#ff0000][Tableau2[NOM COMPTE][/COLOR]]) = TextBox1
If TextBox2 = "" Then
.Cells(lig, [COLOR=#ff0000][Tableau2[MONTANT COMPTE][/COLOR]]) = ""
Else
.Cells(lig, [COLOR=#ff0000][Tableau2[MONTANT COMPTE]][/COLOR]) = CDbl(TextBox2)
End If
.Cells(lig, [COLOR=#ff0000][Tableau2[TAUX COMPTE]][/COLOR]) = CDbl(Replace(TextBox3, "%", "")) / 100
End With
If ListBox1 <> TextBox1 Then _
ListBox1.List = Feuil1.Range("A2:A" & Feuil1.[A65000].End(3).Row).Value
End Sub

Il renvoi une incompatibilité de type, ce qui ne m'étonne pas : il attend l'index de colonne et non le nom de la colonne. Je ne maîtrise pas totalement la fonction Listindex, mais je pense que la solution est là ? Pourriez-vous m'aider ?

Merci beaucoup pour votre temps et votre intérêt :)
 

troopers87

XLDnaute Occasionnel
Bonjour Youky,

Je viens de modifier le code qui semble fonctionner à merveille !

Voici où j'en suis :
VB:
Private Sub CommandButton_MAJ_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
With Feuil1
lig = ListBox1.ListIndex + 1
[Tableau2[NOM COMPTE]].Cells(lig) = TextBox1
If TextBox2 = "" Then
.Cells(lig, 2) = ""
Else
[Tableau2[MONTANT COMPTE]].Cells(lig) = CDbl(TextBox2)
End If
[Tableau2[TAUX COMPTE]].Cells(lig) = CDbl(Replace(TextBox3, "%", "")) / 100
End With
If ListBox1 <> TextBox1 Then _
ListBox1.List = Feuil1.Range("A2:A" & Feuil1.[A65000].End(3).Row).Value
End Sub

Je publierai le fichier final pour aider les utilisateurs, mais auparavant, j'aurais deux questions :
1. Afin d'alléger le code, vu que j'utilise des noms de tableaux et de colonnes, je me demande si il y a un intérêt à utiliser "With Feuil1" (sachant que là aussi, le nom de la feuille pourrait un jour être modifié) ?

2. Je ne parviens pas à comprendre ce que signifie la ligne :
VB:
ListBox1.List = Feuil1.Range("A2:A" & Feuil1.[A65000].End(3).Row).Value
Pourriez-vous me l'expliquer ? Je connais pour ma part le End(2).Row qui descend jusqu'en bas de la sélection ?
 

youky(BJ)

XLDnaute Barbatruc
Salut bien,
ListBox1.List = Feuil1.Range("A2:A" & Feuil1.[A65000].End(3).Row).Value
Pour alimenter la Listbox et avoir la dernière ligne de A je pars du bas et remonte le 3=xlUp
Si aucune données le (2) plante.
Pour le With Feuil1 c'est pas le nom de l'onglet mais le codename, le 1er nom dans les propriétés
Ceci permet de renommer l'onglet sans PB pour la macro.
Si on renomme l'onglet Feuil1 en ACCUEIL le codename sera toujours Feuil1.
En variable cela ne passe pas.
exemple
With Feuil1
With Sheets("Accueil")
avec l'index 1er onglet
With Sheets(1)
A+ Bruno
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa