Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Je suis sur la dernière étape de mon fichier et je bloque !!!
Explications:
il y a 3 feuilles : ACCUEIL / BD (base de données) / RECHERCHE dans la BD
Lorsqu'on ouvre au niveau de la page accueil, un userform appararait
1) Nouvelle saisie : cela agrémente la base de données
2) Recherche : Recherche suivant un numéro article (CA)
3) Visualisation/ Modification : Voir toutes les entrés de BD
Le but du jeu, là je sèche..
étape 1 et 2 = ça marche nickel !!
Etape 3 : Le but est de sélectionner une ligne dans la listbox, que les données de la listbox remplissent les 7 textbox et si je viens modifier une valeur dans une des 7 textbox alors la donnée sera modifiée dans la feuille BD donc en même temps dans la listbox
J'ai commencé avec listbox.index mais je coince..
Ce type de code me servira pour pas mal d'autres fichiers du même style
Pour que cela se fasse, voici les macros que tu dois avoir dans ton UserForm4 (visualisation)
(annule et remplace tout le code que tu avais mis)
Code:
Private Sub ListBox1_Click()
Dim DernièreLigneBD As Long
DernièreLigneBD = Sheets("bd").[A65536].End(xlUp).Row
With Sheets("bd")
For i = 7 To DernièreLigneBD
If .Cells(i, 1) = ListBox1.Value Then
For j = 1 To 7
Controls("TextBox" & j).Value = .Cells(i, j)
Next j
End If
Next i
End With
End Sub
Private Sub UserForm_INITIALIZE()
Sheets("bd").Activate
With ListBox1
.RowSource = ("A6:F" & [A65536].End(xlUp).Row)
.ColumnCount = 7
End With
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Sheets("accueil").Activate
End Sub
J'ai remplacé ton code :
Code:
.RowSource = ("A6:F4000")
Par le code suivant :
Code:
.RowSource = ("A6:F" & [A65536].End(xlUp).Row)
Cela permet que la liste de ta BD présente dans ta ListBox1 fasse exactement le même nombre de ligne que ta base de donnée, et non pas qu'il y ait plusieurs millier de lignes vide!
Je regarde pour la seconde partie de ta question : si je viens modifier une valeur dans une des 7 textbox alors la donnée sera modifiée dans la feuille BD
J'aime bien apprendre de nouvelles choses sur Excel. Donc j'essaye de me perfectionner aux travers des réponses que je donne et en regardant les réponses des autres!
Pour la seconde partie de ta question, quelqu'un avait trouvé une astuce sympa, mais je n'ai pas trop la tête à décortiquer et reproduire cela ce soir!
En résumé, il récupérait le numéro de la ligne où tu avais cliqué dans ta ListBox (avec index),et après roulé jeunesse! Le reste n'est plus qu'une partie de rigolade!
Private Sub ListBox1_Click()
Dim DernièreLigneBD As Long
[COLOR="Green"]' Définition de la variable DernièreLigneBD. Long cela signifie que la variable va contenir des nombres entier compris entre -2.147.483.648 à 2.147.483.648
[/COLOR]
DernièreLigneBD = Sheets("bd").[A65536].End(xlUp).Row
[COLOR="Green"]' Aller sur l'onglet "bd", se mettre sur la cellule A65536, puis se déplacer vers le haut jusqu'à la première cellule pleine,
' et prendre le numéro de la ligne qu'on place dans la variable DernièreLigneBD
' en partant du principe que la cellule A65536 soit vide et qu'il n'y a pas d'autres lignes remplis en dessous du tableau
[/COLOR]With Sheets("bd")
For i = [COLOR="Gray"][B]7[/B][/COLOR] To [COLOR="Gray"][I]DernièreLigneBD[/I][/COLOR]
[COLOR="Green"][B]' Début de la première boucle For ... To ... Next[/B][/COLOR]
If .Cells(i, 1) = ListBox1.Value Then
[COLOR="Green"][B][i]' Début de la seconde boucle For ... To ... Next[/i][/B][/COLOR]
[COLOR="Green"]' Boucle qui se trouve à l'intérieur de la première[/COLOR]
For j = 1 To 7
Controls("TextBox" & j).Value = .Cells(i, j)
Next j
[COLOR="Green"][B][i]' Fin de la seconde boucle For ... To ... Next[/i][/B][/COLOR]
End If
Next i
[COLOR="Green"][B]' Fin de la première boucle For ... To ... Next[/B][/COLOR]
End With
End Sub
La première boucle balaye ta BD de la ligne 7 (-> i), jusqu'à la dernière ligne de ta base de donnée (-> DernièreLigneBd)
Il regarde si la cellule "A+numéro de la ligne" (7 -> "A7" puis 8 -> "A8"puis ... jusqu'à la dernière ligne de ta BD)
est égale au contenu de la valeur se trouvant dans la ListBox1
Si oui : deuxième boucle : la cellule "A+numéro de la ligne" prend la valeur de la TextBox1, la cellule "B+numéro de la ligne" prend la valeur de la TextBox2, ...
Plus clairement :
Code:
For [COLOR="Blue"][B]j[/B][/COLOR] = [COLOR="Blue"][B]1[/B][/COLOR] To [COLOR="Blue"][B]7[/B][/COLOR]
Controls("TextBox" & [COLOR="Blue"][B]j[/B][/COLOR]).Value = .Cells([COLOR="Red"][B]i[/B][/COLOR], [COLOR="Blue"][B]j[/B][/COLOR])
Next [COLOR="Blue"][B]j[/B][/COLOR]
Une variable pour le numéro de la ligne, une variable pour le numéro de la colonne, une boucle, et on raccourcis le code de x lignes!
Avec au passage la fonction Controls pour concaténer le "TextBox" et la variable, et ainsi obtenir les noms de chaque TextBox, les unes après les autres!
J'utilise la même variable pour le numéro des TextBox et le numéro des colonnes, car comme par hasard, le contenu de la TextBox 1 va dans la première colonne, le contenu de la TextBox 2 va dans la seconde colonne, ...
(je n'y suis pour rien, c'est toi qui sans le savoir, en nommant tes TextBox et en disposant l'ordre de tes colonnes qui m'a facilité la vie!!!! Merci à toi ).
Si cela peut t'aider voici ci-joint le fichier de ...
L'UserForm1 contient une ListeBox : "LstCat" (Catégorie), dans laquelle l'utilisateur choisi la catégorie voulu, et en fonction de la valeur sélectionné, Excel alimente la seconde ListBox en fonction de la valeur sélectionné!
(seul différence, pour toi, au lieu d'être une ListBox, c'est des TextBox)
Voici les deux macro contenu dans l'UserForm ("UserForm1") a décortiquer et adapter à ton cas de figure :
Code:
Private Sub ListBox1_Click()
With Sheets("ListePlantes")
TxtNomC = .Cells(ListBox1.List(ListBox1.ListIndex, 1), 4)
TxtProv = .Cells(ListBox1.List(ListBox1.ListIndex, 1), 6)
TxtAn = .Cells(ListBox1.List(ListBox1.ListIndex, 1), 5)
End With
End Sub
Private Sub LstCat_Change()
Dim Index&, V$, Cel As Range
With LstCat
Index = .ListIndex + 1
V = .List(.ListIndex)
Set Cel = RgCat.Columns(2).Cells.Find(V, , , xlWhole)
With Cel
LabID = .Cells(1, 0)
End With
End With
AjCat
End Sub
Plus précisement, toujours dans le même fichier, même UserForm : lorsqu'on clic sur la première ListBox : Catégorie, la seconde ListBox se rempli en fonction.
En fonction de la valeur sélectionné dans la seconde listBox : "Nom Latin", les TextBox : "nom commun", "provenance", ... s'alimente automatiquement! Bref exactement ce que tu cherche à faire!
Le code remplissant les TextBox :
Code:
Private Sub ListBox1_Click()
With Sheets("ListePlantes")
TxtNomC = .Cells(ListBox1.List(ListBox1.ListIndex, 1), 4)
TxtProv = .Cells(ListBox1.List(ListBox1.ListIndex, 1), 6)
TxtAn = .Cells(ListBox1.List(ListBox1.ListIndex, 1), 5)
End With
End Sub
Je suis sure qu'il n'y a pas grand chose à modifier
La listbox remplit bien les 7 textbox mais dès que je change une valeur et que j'appuie sur MODIFIER, il envoie les nouvelles données dans la bonne feuille mais pas sur la bonne ligne
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.