Afficher dans un UserForm les cellules de ma base de données

Résolu/Fermé
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 - Modifié par mijean94 le 5/04/2016 à 23:05
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 - 8 avril 2016 à 23:24
Bonjour,

Je souhaiterai faire afficher toutes les cellules de ma base de données, si elles sont renseignées, afin de pouvoir sélectionner les données existantes, en créer des nouvelles ou récupérer les informations pour les transférer sur la feuille 1 sans passer par l’onglet données_clients du classeur.

Je ne sais pas comment pratiquer.

Voici un exemple de mon fichier d’aujourd’hui : https://www.cjoint.com/c/FDfu4zXbIJt

Pouvez-vous m’orienter vers une méthode à appliquer, une solution, des infos pour avancer ?

Merci d’avance

Cordialement

3 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
6 avril 2016 à 11:42
Bonjour Mijean, bonjour le forum,

Dans ce genre de cas j'utilise la méthode appliquée à ton fichier modifié ci-dessous. Une ListBox qui, au clic sur une ligne, renvoie les données de la ligne dans les autres contrôles. Je sais que cette méthode plante sur de très grosses base de données mais elle a l'avantage d'être très rapide. Je n'ai plus en tête la limite qu'elle impose mais elle convient très souvent.

Le code :
'********************
'* UserForm cleints *
'********************
Option Explicit
Private ws As Worksheet
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)

Private Sub UserForm_Initialize()
'********************************************
'* initialise le formulaire données clients *
'********************************************

Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim K As Long 'déclare la variable K (incrément)
Dim I As Long 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Set ws = Sheets("données_clients") 'Correspond au nom de votre onglet dans le fichier Excel
TV = ws.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = ws.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit le nombre de lignes NL
NC = UBound(TV, 2) 'définit le nombre de colonnes NC
Me.ListBox1.ColumnCount = NC 'définit le nombre de colonnes de la listBox1
K = 1 'initialise la variable K
For I = 3 To NL 'boucle 1: de la ligne 3 à la ligne NL
ReDim Preserve TL(1 To NC, 1 To K) ',redimensionne le tableau de lignes TL
For J = 1 To NC 'boucle 2 : sur toutes les colonnes du tableau de valeurs TV
TL(J, K) = TV(I, J) 'renvoie ligne J colonne K de TL la valeur ligne I colonne J de TV (= Tranposition)
Next J 'prochaine colonne de la boucle 2
K = K + 1 'incrémente K (ajoute une colonne à TL
Next I 'prochaine ligne de la boucle 1
If K > 1 Then 'condition : si K est supérieur à 1 (si la liste contient au moins une ligne)
If K = 2 Then ReDim Preserve TL(1 To NC, 1 To 2) 'si la liste ne contient qu'une seule ligne redimensionne TL pour permettre la transposition
Me.ListBox1.List = Application.Transpose(TL) 'alimente la Listbox1 avec le tableau TL ransposé
End If 'din de la condition

ComboBox3.ColumnCount = 1 'Pour la liste déroulante Civilité
ComboBox3.List() = Array("", "M.", "Mme", "Mlle")
With Me.ComboBox2
For I = 2 To ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem ws.Range("A" & I)
Next I
End With
For J = 1 To 7
Me.Controls("TextBox" & J).Visible = True
Next J
End Sub

Private Sub ListBox1_Click() 'au clic dans la ListBox1
Dim LI As Long 'déclare la varaible LI (LIgne)
Dim I As Byte 'déclare la varaible I (Incrément)

LI = Me.ListBox1.ListIndex + 3 'définit la ligne LI
For I = 1 To 2 'boucle sur les deux ComboBoxes
Me.Controls("ComboBox" & I + 1).Value = ws.Cells(LI, I) 'alimente la comboBox avec la valeur ligne LI colonne I de l'onglet WS
Next I 'prochaine ComboBox de la boucle
For I = 1 To 7 'boucle sur les sept TextBoxes
Me.Controls("TextBox" & I).Value = ws.Cells(LI, I + 2).Value 'renvoie dans la TextBox la valeur ligne LI, colonne I+2 de l'onglet WS
Next I 'prochaine TextBox de la boucle
End Sub


https://www.cjoint.com/c/FDgjJ3CmIrI
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
6 avril 2016 à 12:10
Salut ThauTheme,

Pour te répondre sur :
Je n'ai plus en tête la limite qu'elle impose mais elle convient très souvent
Ca c'était avant...
La limite était celle de l'Integer, soit 32767.
Maintenant, depuis les versions supérieures à 2003 (je suppose), il n'y a plus cette limite.
Je viens de tester une listbox jusqu'à 150 000 lignes. Le clic sur la ligne 150000 me retourne bien le .List(.ListIndex).
Donc, à priori, plus de limite.
Néanmoins, c'est longuet avec autant de lignes...
A+
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
6 avril 2016 à 13:32
Bonjour,

Merci pour vos réponses, ça répond parfaitement à mon besoins. je n'aurais pas autant de lignes.

Par contre j'ai un petit pb maintenant.
Lorsque j'ajoute des nouvelles données elles sont toujours placées sur la feuille 1 à la ligne 53 ?????

Merci de votre aide.

Cordialement
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
7 avril 2016 à 08:48
Merci pour ton aide toujours précise et précieuse !...
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
6 avril 2016 à 17:22
Re,

Je n'ai pas touché à cette partie du code mais je vais y jeter un coup d'œil...
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
Modifié par mijean94 le 6/04/2016 à 21:32
Re,

Effectivement, l'ajout de ton code n'a rien à voir.

J'ai fait des essais et sur mon fichier de base posté, il se passe la même chose qu'expliquée au post 3.
Sur mon fichier que j'utilise, sans changement du code, tous marche bien ?

J’ai trouvé l’erreur, qui vient bien sur de mon code.

Dans mon utilisation je travail sur la feuille de base de donnée, là je n’étais pas sur cette feuille. J’ai donc ajouter un Sheets("données_clients").Activate dans mon code et ça marche.

Par contre serait-il possible que la base de donnée soit affichée dans l'UserForm s’il y a un ajout ou modification sans quitter l’UserForm ?

Merci d'avance pour la réponse.

cordialement
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
7 avril 2016 à 08:49
Re,

Pour l'actualiser, il suffit de le fermer et de le rouvrir dans la foulée avec :

Unload Me
UserForm1.Show

0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
8 avril 2016 à 11:51
Bonjour ThauTheme, Bonjour le forum,

Dans la fonction initialisation de l’UserForm, je n’arrive pas à trouver la solution pour supprimer la comboBox2 et la remplacer par la textBox8.

Voici mon programme : https://www.cjoint.com/c/FDijYmW1ldt

Merci de ton aide

Cordialement
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
8 avril 2016 à 23:24
Bonjour,

J'ai adapté le code du post #1 suite à l'ajout d'un TextBox8 à la place de la ComboBox2 et l'ajout d'un ComboBox4, mais je n'arrive pas à comprendre la partie du code ci-dessous pour pouvoir l'adapter à ma modification ???? :

With Me.ComboBox2
For I = 2 To ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem ws.Range("A" & I)
Next I
End With


Merci de votre aide

Cordialement
0