Mise à jour d'une combobox en fonction d'une textbox
Bonjour,
J'ai un souci avec la mise à jour d'une combobox lorsque je change la valeur d'une textbox.
J'ai un userform dans lequel la date du jour est automatiquement rentrée dès son ouverture.
Cet date est affichée dans une textbox "TxtDateSeance"
En fonction de cette date, je mets à jour à l'ouverture la combobox "CboNomDP" en fonction des données de la colonne C de la feuille "Présence piscine".
Option Explicit
Dim a, b, i, j, L, PrLig_Date, DrLig_Date As Long
Dim Date_Existe As String
Dim tabsansdoublon As New Collection
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Private Sub Recherche_Date()
With Sheets("Présence Piscine")
L = .Range("A65536").End(xlUp).Row
Date_Existe = "non"
For j = L To 2 Step -1
If .Range("A" & j).Text = TxtDateSeance.Text Then Date_Existe = "oui"
Exit For
Next j
End With
End Sub
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Private Sub Recherche_LigneDate()
'===================================================
'pour déterminer la dernière ligne à la date du jour
'===================================================
With Sheets("Présence Piscine")
L = .Range("A65536").End(xlUp).Row
For j = L To 2 Step -1
If .Range("A" & j).Text = TxtDateSeance.Text Then Exit For
Next j
DrLig_Date = j
'===================================================
'pour déterminer la première ligne à la date du jour
'===================================================
For j = DrLig_Date To 2 Step -1
If .Range("A" & j).Text <> TxtDateSeance.Text Then Exit For
Next j
PrLig_Date = j + 1
End With
End Sub
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Private Sub TxtDateSeance_Change()
'====================
'pour le DP de séance
'====================
Recherche_Date
If Date_Existe = "oui" Then
Recherche_LigneDate
With Sheets("Présence Piscine")
CboNomDP.Value = .Range("C" & DrLig_Date).Value
End With
End If
End Sub
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Private Sub UserForm_Initialize()
Dim z As Currency
z = 1.5
Usf_Presence.Height = 270 * z
Usf_Presence.Width = 490 * z
Usf_Presence.Zoom = 100 * z
'======================
'pour la date de séance
'======================
TxtDateSeance.Value = Format(Now, "dd/mm/yyyy")
'===========================
'pour la liste des adhérents
'===========================
With Sheets("Data_Membre")
L = .Range("A65536").End(xlUp).Row
If L > 1 Then 'si l'onglet Data_Membre comporte au moins 1 membre
On Error Resume Next
For i = 2 To L
If .Range("C" & i) = "Oui" Then 'si l'emprunteur est adhérent du club
'Ajoute ce membre à la collection sans doublon
tabsansdoublon.Add .Range("A" & i).Value, CStr(.Range("A" & i).Value) 'récupérer tous les adhérents
'La clé CSTR() est unique dans une collection.
'Si le membre existe déjà, il n'est pas ajouté à la collection et on passe au suivant
'grâce à 'On error resume next".
End If
Next i
On Error GoTo 0
'Transfert la collection dans notre liste
For i = 1 To tabsansdoublon.Count
CboNom1.AddItem tabsansdoublon(i)
CboNom2.AddItem tabsansdoublon(i)
CboNom3.AddItem tabsansdoublon(i)
CboNom4.AddItem tabsansdoublon(i)
CboNom5.AddItem tabsansdoublon(i)
CboNom6.AddItem tabsansdoublon(i)
CboNom7.AddItem tabsansdoublon(i)
CboNom8.AddItem tabsansdoublon(i)
CboNom9.AddItem tabsansdoublon(i)
CboNom10.AddItem tabsansdoublon(i)
CboNomDP.AddItem tabsansdoublon(i)
Next i
Else
MsgBox "Aucun adhérent dans l'onglet Membre"
End
End If
End With
'vérouiller en read only les combobox
CboNom1.Style = fmStyleDropDownList
CboNom2.Style = fmStyleDropDownList
CboNom3.Style = fmStyleDropDownList
CboNom4.Style = fmStyleDropDownList
CboNom5.Style = fmStyleDropDownList
CboNom6.Style = fmStyleDropDownList
CboNom7.Style = fmStyleDropDownList
CboNom8.Style = fmStyleDropDownList
CboNom9.Style = fmStyleDropDownList
CboNom10.Style = fmStyleDropDownList
CboNomDP.Style = fmStyleDropDownList
End Sub
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Private Sub CmdAnnuler_Click()
Unload Usf_Presence
End Sub
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Private Sub CmdValider_Click()
Application.ScreenUpdating = False
'=======================================================
'On verifie que l'on n'a pas de doublon dans les textbox
'=======================================================
For a = 1 To 10
For b = 1 To 10
If a < b Then
If Controls("Cbonom" & a).Value = Controls("Cbonom" & b).Value And Controls("Cbonom" & a).Value <> "" And Controls("Cbonom" & b).Value <> "" Then
MsgBox Controls("cbonom" & b).Value & " a été rentré plusieurs fois. Saisissez un autre nom ou laissez la case vide"
Controls("Cbonom" & b).Value = ""
Exit Sub
End If
End If
Next b
Next a
'=================================================
'puis on verifie que la date et DP sont renseignés
'=================================================
If TxtDateSeance.Value = "" Then 'date vide
MsgBox "Veuillez renseigner la date de la séance piscine"
ElseIf CboNomDP.Value = "" Then 'Nom DP vide
MsgBox "Veuillez renseigner le nom du DP"
Else 'si tout va bien
'===================================
'remplir l'onglet "Présence Piscine"
'===================================
With Sheets("Présence Piscine")
L = .Range("A65536").End(xlUp).Row
For a = 1 To 10
'=============================
' On boucle pour chaque CboNom
'=============================
If Controls("Cbonom" & a).Value <> "" Then 'si la ligne est bien complétée
If Date_Existe = "oui" Then
For i = PrLig_Date To DrLig_Date
If .Range("B" & i).Value = Controls("Cbonom" & a).Value Then
MsgBox "La présence de " & Controls("Cbonom" & a).Value & " est déjà enregistrée. Saisissez un autre nom ou laissez la case vide."
Controls("Cbonom" & a).Value = ""
Exit Sub
End If
Next i
End If
.Range("A" & L + 1).Value = Format(TxtDateSeance.Value, "mm/dd/yyyy") 'jour/mois inversés car excel le comprend en inversé... alors que la userform le comprend comme on le veut
.Range("B" & L + 1).Value = Controls("Cbonom" & a).Value
.Range("C" & L + 1).Value = CboNomDP.Value
L = L + 1
End If
Next a
End With
'on décharge le formulaire pour qu'il soit de nouveau initialisé lors de son prochain affichage
Unload Usf_Presence
'Tri par date chronologique
L = Sheets("Présence Piscine").Range("A65536").End(xlUp).Row
Sheets("Présence Piscine").Range("A2:C" & L).Sort Key1:=Sheets("Présence Piscine").Range("A1")
'mise en forme des cellules
For i = 2 To L
If i Mod 2 = 0 Then
Sheets("Présence Piscine").Range("A" & i & ":C" & i).Interior.Color = 12566463 'Gris foncé
Else
Sheets("Présence Piscine").Range("A" & i & ":C" & i).Interior.Color = 14277081 'Gris clair
End If
Next i
End If
Application.ScreenUpdating = True
End SubMon souci est que lorsque je modifie la date manuellement dans "TxtDateSeance", je n'arrive pas à mettre à jour en instantané "CboNomDP"
Je débute en VBA, et je n'arrive pas à trouver la solution.
Ci joint le fichier
Si une âme charitable peut m'apporter son aide , elle est la bien venue.
Merci
Bonjour
Sans le fichier qui va avec, on n'a pas trop envie de se plonger dans toutes ces macros....
Bye !
Bonjour,
Mes premières réactions, tu en feras ce que tu veux !
Tu dis :
J'ai un userform dans lequel la date du jour est automatiquement rentrée dès son ouverture.
Cet date est affichée dans une textbox "TxtDateSeance"
Là je me dis que la date du jour étant fournie à tout moment par la fonction Date, tu la recueilles dans une variable et tu n'as besoin de rien d'autre, notamment pas d'une TextBox qui ne peut que poser problème pour stocker une date...
Regardant panoramiquement... je vois :
1) que tu utilises Now !? Quand on veut la date on utilise Date, si on veut la date et l'heure on utilise Now, je n'ai pourtant entendu parler que de date, donc mauvais choix a-priori !
2) tu convertis en String... ! Si tu veux utiliser une date comme date, mieux vaut la garder en type date (sinon en type Long, mais type String c'est aller au devant de problèmes...
3) je tombe sur la déclaration : Dim Date_Existe As String Vu le nom donné, on s'attendrait à un Boolean... Je commence à trouver donc que tu cumules les mauvais choix !
Et tant qu'on est sur les déclarations, je me trouve contrains de te signaler qu'il faut apprendre à déclarer des variables !
La déclaration de tabsansdoublon me conduit à vérifier si tu serais sur MAC. Il ne semble pas, donc si ce n'est pas le cas je ne comprends pas la non utilisation du Dictionary...
J'ai le temps de noter que tu confirmes le choix de méthodes lentes avec AddItem... La constitution de tableaux et l'utilisation de List seraient mieux venues en principe... mais c'est l'énumaration de 11 Combo alimentés avec les mêmes données qui m'arrêtent... Pas tant le fait de le faire avec AddItem en boucle pour tous, histoire de ralentir un max !!!
Mais bon courage tout de même !
Bonjour MFerrand
Merci de te pencher sur mon problême.
Comme je l'ai dit dans mon message, je débute en VBA.
Je devrais plutot dire je bricole
J'ai écris ce code en me servant de mes recherches sur le net, et je pense qu'il est très loin d'être parfait.
Concernant la date, je ne souhaite pas qu'elle soit figée à la date du jour, et donc pouvoir la modifier si besoin. C'est pour cette raison que j'ai utilisé une Textbox..
1) que tu utilises Now !? Quand on veut la date on utilise Date, si on veut la date et l'heure on utilise Now, je n'ai pourtant entendu parler que de date, donc mauvais choix a-priori !
Ok, je modifie
2) tu convertis en String... ! Si tu veux utiliser une date comme date, mieux vaut la garder en type date (sinon en type Long, mais type String c'est aller au devant de problèmes...
Pas faux
Mais c'est en se trompant que l'on apprend, non ?
3) je tombe sur la déclaration : Dim Date_Existe As String Vu le nom donné, on s'attendrait à un Boolean... Je commence à trouver donc que tu cumules les mauvais choix !
Je ne connais pas cette fonction
Et tant qu'on est sur les déclarations, je me trouve contrains de te signaler qu'il faut apprendre à déclarer des variables !
Les variables se typent individuellement : sur 9 variables déclarées tu en as donc 6 qui sont non typées, donc de type Variant...
Tu veux dire que pour chaque variable, il faut ecrire
Dim NomDeVariable as TypeDeVariable?
Si c'est cela, c'est de mon niveau
pour arriver à une telle configuration, c'est qu'on a bâclé la reflexion conceptuelle sur le projet, qu'on ne l'a pas menée à terme et que l'on n'a pas recherché les choix optimaux en termes de fonctionnement avant de commencer la réalisation.
Abscence totale de méthode, je le reconnais. Trop débutant pour cela
En tout cas, merci pour tes conseils.
Bonjour à tous
Un essai à tester, pour répondre à ta question initiale, si cela peut t'aider...
Mais surtout, essaie de suivre les conseils de MFERRAND, ils sont toujours excellents !
Bye !
merci GMB pour ton aide.
Je viens de tester, et j'ai un souci lorsque je rentre la date.
Par exemple, lorsque je veux rentrer 20/01/2018 au lieu de la date du jour, je suis obligé de m'y prendre à plusieurs fois.
Et comme je ne connais pas les fonctions que tu as utilisé, je suis un peu pommé.
As tu une idée ?
Par contre, une fois que la date est rentrée, le nom du DP se met bien à jour.
Une petite question : pourquoi dans la déclaration des variables tu as mis i& et L& à la place de i et L ?
Autre chose, lorsque je valide, je n'ai plus de vérification qu'un nom n'ai pas déjà été rentré à la date donnée.
Mais surtout, essaie de suivre les conseils de MFERRAND, ils sont toujours excellents !
J'ai commencé à les suivre en modifiant ce que je peux dans mon code. Et pour le reste, j'essaye de me documenter pour apprendre.
C'est vrai que cette fonction dico a l'air bien pratique
- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour Citro38 et toutes et tous,
Pour répondre à une de tes questions, pour les variables i& et L&
Dim i As Long ou
Dim L As Long ou
voir ici sur le forum ici (Déclarations des variables)
cdrlt,
Andre
Merci André13
J'y vois plus clair maintenant
Re,
Tu as déjà avancé sur quelques points, très bien
Tu pourrais étudier l'usage que tu pourrais faire d'une ListBox à multisélection en remplacement de tes Combos (sauf le DP) [C'est quoi DP ?]
Cordialement.
Bonjour à tous
j'ai un souci lorsque je rentre la date.
Nouvel essai ci-joint : la prise en compte exige que l'on saisisse la date au format indiqué et ne se fait qu'après la saisie que 10° caractère
Merci à André pour sa réponse, plus rapide que la miennepourquoi dans la déclaration des variables tu as mis i& et L& à la place de i et L ?
Curieux ! Je n'ai pas touché à ce code. Et après un essai rapide, il me semble fonctionner...lorsque je valide, je n'ai plus de vérification qu'un nom n'ai pas déjà été rentré à la date donnée.
Bye !
Tu pourrais étudier l'usage que tu pourrais faire d'une ListBox à multisélection en remplacement de tes Combos (sauf le DP) [C'est quoi DP ?]
Cordialement.
Concernant le DP, c'est le "Directeur de Plongée". Il ne peut y en avoir qu'un pendant la séance.
Et pour l'utilisation d'une Listbox à multiselection, cela doit être à mon niveau. Je regarde cela et vous tiens au courant
En tout cas, merci des conseils
Bonjour
Voici mon projet avec les modifications faites suites aux conseils de vous tous.
Il me reste à le modifier encore un peu pour pouvoir enregistrer la présence de qq'un qui n'est pas du club (je pense utiliser une combobox modifiable), et ce sera nickel
Si vous voyez des choses que je peux encore améliorer, je suis preneur de vos conseils.
Bravo !
Tu as fait de gros progrès !
Continue !
Bye !
Voila, j'ai peaufiné mon formulaire
Il reste un dernier point sur lequel je bute depuis plusieurs heures.
Si dans mon fichier ci dessus, je choisi par exemple la date du 03/02/2018, il va me donner comme liste de DP plusieurs fois "Jim" puis la liste des différents nom récupérés dans la feuille Data_membres.
Or, à une date définie, il ne peut y avoir qu'un seul DP.
Comment faire pour n'avoir, à la date entrée, qu'une seule fois le nom du DP correspondant, et sans la liste des autres noms de la feuille Data_membres ?
Je ne sais pas si je suis clair
Bonjour
Nouvelle version.
Mais, dans ces conditions, je ne vois pas l'intérêt du cboNomDP si on ne doit pas le modifier.Autant mettre un Textbox ou encore un label...
Bye !
Bonjour GMB et merci de ton aide
Je vais essayer d’être plus clair dans ma demande.
Il y a 2 cas pour remplir la combo DP :
1- lorsque la date n'a jamais été enregistrée dans la feuille "présence piscine", je dois avoir la combo DP alimentée avec tous les membre de la feuille "Data_membres"
2- lorsque la date a déjà été enregistrée dans la feuille "présence piscine", je ne dois avoir la combo DP alimentée qu'avec le nom du DP à cette date (colonne C de la feuille "présence piscine").
Et comme la nuit porte conseil, je me suis appuyé sur ton code pour trouver un début de solution.
Du coup, le cas 2- passe nickel.
Par contre, le cas 1- me pose des soucis.
--> à l'ouverture du formulaire, la combo DP est bien alimentée avec tous les membre de la feuille "Data_membres"
--> lorsque je modifie la date et rentre une date qui n'est pas renseignée dans la feuille "présence piscine", la combo DP reste vide.
Une idée sur l'origine du problème ?
Je sèche
Merci GMB, t'es un chef
Je ne vois pas trop pourquoi ton code marche, et pas le mien, mais l'essentiel, c'est que cela tourne nickel
Merci à tous pour votre aide, et surtout à toi GMB.
Sans vous, je n'y serais jamais arrivé