Afficher dans un UserForm les cellules de ma base de données [Résolu/Fermé]

Signaler
Messages postés
341
Date d'inscription
mercredi 16 décembre 2015
Statut
Membre
Dernière intervention
7 novembre 2019
-
mijean94
Messages postés
341
Date d'inscription
mercredi 16 décembre 2015
Statut
Membre
Dernière intervention
7 novembre 2019
-
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 : http://www.cjoint.com/c/FDfu4zXbIJt

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

Merci d’avance

Cordialement

10 réponses

Messages postés
4612
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
11 décembre 2019
118
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


http://www.cjoint.com/c/FDgjJ3CmIrI
pijaku
Messages postés
12254
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 décembre 2019
2250
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+
mijean94
Messages postés
341
Date d'inscription
mercredi 16 décembre 2015
Statut
Membre
Dernière intervention
7 novembre 2019
7 > pijaku
Messages postés
12254
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 décembre 2019

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
ThauTheme
Messages postés
4612
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
11 décembre 2019
118 > pijaku
Messages postés
12254
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 décembre 2019

Merci pour ton aide toujours précise et précieuse !...
Messages postés
4612
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
11 décembre 2019
118
Re,

Je n'ai pas touché à cette partie du code mais je vais y jeter un coup d'œil...
mijean94
Messages postés
341
Date d'inscription
mercredi 16 décembre 2015
Statut
Membre
Dernière intervention
7 novembre 2019
7
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
Messages postés
4612
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
11 décembre 2019
118
Re,

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

Unload Me
UserForm1.Show

mijean94
Messages postés
341
Date d'inscription
mercredi 16 décembre 2015
Statut
Membre
Dernière intervention
7 novembre 2019
7
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 : http://www.cjoint.com/c/FDijYmW1ldt

Merci de ton aide

Cordialement
mijean94
Messages postés
341
Date d'inscription
mercredi 16 décembre 2015
Statut
Membre
Dernière intervention
7 novembre 2019
7
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