Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Dans mon application j'ai supprimé la ComboBox (ceux qui me suivent comprendront - https://excel-downloads.com/threads...omboBox à 3 colonnes avec les données d'un TS ) et je l'ai remplacé par une ListBox.
La ListBox est bien alimentée selon le code ci-joint, cependant je souhaiterai que la 4ème colonne soit au format [h]:mm.
Avec le code ci-joint, la 4ème colonne donne le résultat ":12".
Qu'ai-je fais qui ne convienne pas ?
Merci par avance pour votre aide
VB:
Sub RempliListBox()
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim I As Long, Col As Long
Dim Data As Variant
'Définir la feuille de calcul et le tableau structuré
Set Ws = Sheets("Liste_agents")
Set Tbl = Ws.ListObjects("t_Noms")
'On récupére les données du TS
Data = Tbl.DataBodyRange.Value
With UfGestTemps.MultiPage1.Pages(0)
'On définie le nbre de colonnes de la ListBox
.Lst_Employ.ColumnCount = 4
'On remplit la ListeBox avec les données du TS
For I = 1 To UBound(Data, 1)
.Lst_Employ.AddItem
For Col = 1 To 4
'On formate la 4ème colonne au format "[h]:mm"
If Col = 4 Then
.Lst_Employ.List(I - 1, Col - 1) = Format(Data(I, Col), "[h]:mm")
Else
.Lst_Employ.List(I - 1, Col - 1) = Data(I, Col)
End If
Next Col
Next I
End With
End Sub
Sub RempliListBox()
'
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim I As Long, Col As Long
Dim Data As Variant
' Définir la feuille de calcul et le tableau structuré
Set Ws = Sheets("Liste_agents")
Set Tbl = Ws.ListObjects("t_Noms")
' On récupére les données du TS
Data = Tbl.DataBodyRange.Value
With UfGestTemps.MultiPage1.Pages(0)
' On définie le nbre de colonnes de la ListBox
.Lst_Employ.ColumnCount = 4
' On remplit la ListBox avec les données du TS
For I = 1 To UBound(Data, 1)
.Lst_Employ.AddItem
For Col = 1 To 4
' On formate la 4e colonne au format "[h]:mm"
If Col = 4 Then...
Je profite de votre dégression pour en apporter une nouvelle. 😉
- Quand le UserForm de saisie du MdP s'affiche, le champ de saisie a-t-il le focus chez toi ?
(pas chez moi)
- Si tu valides la saisie par la touche <Entrée>, cela valide-t-il immédiatement la saisie ?
(chez moi je dois appuyer une seconde fois)
- Si tu appuies sur la touche <Echap>, cela ferme-t-il le UserForm ?
(chez moi il ne se passe rien. Je suis obligé d'aller cliquer sur le bouton "Annuler")
Voici une proposition pour le UserForm de saisie du MdP.
- Le bouton [Annuler] :
Il a une macro qui sert à décharger le UserForm.
VB:
Private Sub But_Annul_Click()
'
' Si on clique sur "Annuler" - Le formulaire se ferme
Unload Me
' La feuille "Accueil" est activée
Sheets("Accueil").Activate
End Sub
Normalement, la touche <Echap> doit faire la même chose.
Pour cela, dans VBE, on met son paramètre "Cancel" à True.
- Le bouton [Valider] :
Il a une macro qui sert à tester la saisie.
VB:
Private Sub But_Valide_Click()
'
' On vérifie que l'on a bien saisi le bon mot de passe
If Me.Tbx_MdP.Value = PassAdmin Then
' On ferme le formulaire
Unload Me
' On appelle le formulaire du menu - Le formulaire est focus
UfMenusAdmin.Show (0)
' Sinon
Else
' Si le mot de passe n'est pas bon - Un message s'affiche
MsgBox "Le Mot de Passe saisi est erroné - Recommencez ou quittez !"
' La TextBox est vidée
Me.Tbx_MdP = ""
' La TextBox prend le focus
Me.Tbx_MdP.SetFocus
' Fin de la condition
End If
End Sub
Normalement, la touche <Entrée> à la fin de la saisie du MdP doit faire la même chose.
Pour cela, dans VBE, on met son paramètre "Default" à True.
- Le focus du champ de saisie :
Le champ de saisie n'a pas de macro. 😉 En revanche il y a une macro d'initialisation du
UserForm.
VB:
Private Sub UserForm_Initialize()
'
' On enlève la croix de fermeture
SansCroix Me
End Sub
Là, j'avoue ne pas comprendre pourquoi, mais tu avais des .SetFocus, dans UserForm_Initialize et dans UserForm_Activate, qui semblaient ne pas agir sur le focus...
Est-ce à cause du mode "modal" ou "non modal" ??? Je ne sais pas.
Du coup je les ai supprimés, et tout semble fonctionner comme l'utilisateur doit s'y attendre. 😉
L'ordre des Object du UserForm :
J'ai modifié l'ordre des objets du UserForm, en modifiant le paramètre "TabIndex" de chacun d'eux, en partant de 0 et en allant jusqu'à 3.
Ainsi, quand on appuie sur la touche <Tab>, on passe de l'un à l'autre de façon plus logique :
champ de saisie, bouton [Valider], bouton [Annuler], et l'image.
Remarque : je pense qu'on devrait pouvoir cacher (voire supprimer) le bouton [Valider], mais ça risquerait très probablement de perturber le haut commandement... 🤣 🤣 🤣
Ainsi, quand on appuie sur la touche <Tab>, on passe de l'un à l'autre de façon plus logique :
champ de saisie, bouton [Valider], bouton [Annuler], et l'image.
En mettant le paramètre Enabled à False, c'est encore mieux car elle apparaît toujours dans le UserForm, mais elle n'est plus sélectionnable, donc avec la touche <Tab> on passe du champ de saisie au bouton [Valider] puis au bouton [Annuler] et ensuite on revient sur le champ de saisie.
Si quelqu'un a d'autres corrections à apporter à #50, que ce soit sur ce que j'ai écrit, sur le code du UserForm "UfMotPasse" ou son utilisation, merci de le signaler.
Voici une proposition pour le UserForm de saisie du MdP.
- Le bouton [Annuler] :
Il a une macro qui sert à décharger le UserForm.
VB:
Private Sub But_Annul_Click()
'
' Si on clique sur "Annuler" - Le formulaire se ferme
Unload Me
' La feuille "Accueil" est activée
Sheets("Accueil").Activate
End Sub
Normalement, la touche <Echap> doit faire la même chose.
Pour cela, dans VBE, on met son paramètre "Cancel" à True.
- Le bouton [Valider] :
Il a une macro qui sert à tester la saisie.
VB:
Private Sub But_Valide_Click()
'
' On vérifie que l'on a bien saisi le bon mot de passe
If Me.Tbx_MdP.Value = PassAdmin Then
' On ferme le formulaire
Unload Me
' On appelle le formulaire du menu - Le formulaire est focus
UfMenusAdmin.Show (0)
' Sinon
Else
' Si le mot de passe n'est pas bon - Un message s'affiche
MsgBox "Le Mot de Passe saisi est erroné - Recommencez ou quittez !"
' La TextBox est vidée
Me.Tbx_MdP = ""
' La TextBox prend le focus
Me.Tbx_MdP.SetFocus
' Fin de la condition
End If
End Sub
Normalement, la touche <Entrée> à la fin de la saisie du MdP doit faire la même chose.
Pour cela, dans VBE, on met son paramètre "Default" à True.
- Le focus du champ de saisie :
Le champ de saisie n'a pas de macro. 😉 En revanche il y a une macro d'initialisation du
UserForm.
VB:
Private Sub UserForm_Initialize()
'
' On enlève la croix de fermeture
SansCroix Me
End Sub
Là, j'avoue ne pas comprendre pourquoi, mais tu avais des .SetFocus, dans UserForm_Initialize et dans UserForm_Activate, qui semblaient ne pas agir sur le focus...
Est-ce à cause du mode "modal" ou "non modal" ??? Je ne sais pas.
Du coup je les ai supprimés, et tout semble fonctionner comme l'utilisateur doit s'y attendre. 😉
L'ordre des Object du UserForm :
J'ai modifié l'ordre des objets du UserForm, en modifiant le paramètre "TabIndex" de chacun d'eux, en partant de 0 et en allant jusqu'à 3.
Ainsi, quand on appuie sur la touche <Tab>, on passe de l'un à l'autre de façon plus logique :
champ de saisie, bouton [Valider], bouton [Annuler], et l'image.
Remarque : je pense qu'on devrait pouvoir cacher (voire supprimer) le bouton [Valider], mais ça risquerait très probablement de perturber le haut commandement... 🤣 🤣 🤣
Merci TooFatBoy. J'ai modifié le code dans mon application. Par contre, concernant la TextBox où l'on saisie le mot de passe, dans ses propriétés, j'avais mis une Autotab après la saisie de 7 caractères, donc ça passait directement au bouton "Valider".
Par contre, concernant la TextBox où l'on saisie le mot de passe, dans ses propriétés, j'avais mis une Autotab après la saisie de 7 caractères, donc ça passait directement au bouton "Valider".
Comme ça le gars qui essaye de trouver le MdP sait qu'il ne doit travailler que sur 7 caractères. C'est sympa pour lui, ça lui simplifie le boulot... 😅
😎 Maintenant que les problèmes du UserForm de saisie du MdP sont résolus, je me permet une nouvelle digression.
VB:
'Initialisation de la date du début de la semaine en partant du lundi
If Weekday(Now, 2) <> 1 Then
Me.Tbx_DebSem = Format(Now - Weekday(Now + 2) + 1, "dd/mm/yyyy")
Else
Me.Tbx_DebSem = Format(Now, "dd/mm/yyyy")
End If
Me.Tbx_NumSem = WorksheetFunction.IsoWeekNum(Now)
Me.Tbx_FinSem = CDate(Me.Tbx_DebSem) + 6
Pourquoi le lundi traite-t-on le premier jour de la semaine différemment ???
Aujourd'hui la macro me donne "04/10/2024" (qui est un vendredi) dans Me.Tbx_DebSem. Drôle de début de semaine. 😉
A toi de voir si tu veux utiliser ou non cette modification :
VB:
' Initialisation de la date du début de la semaine en partant du lundi
Me.Tbx_DebSem = Format(Now - Weekday(Now, 2) + 1, "dd/mm/yyyy")
' On calcule la fin de la semaine
Me.Tbx_FinSem = Format(Now - Weekday(Now, 2) + 7, "dd/mm/yyyy")
' On calcule le numéro ISO de la semaine
Me.Tbx_NumSem = WorksheetFunction.IsoWeekNum(Now)
Ca me donne "07/10/2024" (qui est un lundi) dans Me.Tbx_DebSem.
😎 Maintenant que les problèmes du UserForm de saisie du MdP sont résolus, je me permet une nouvelle digression.
VB:
'Initialisation de la date du début de la semaine en partant du lundi
If Weekday(Now, 2) <> 1 Then
Me.Tbx_DebSem = Format(Now - Weekday(Now + 2) + 1, "dd/mm/yyyy")
Else
Me.Tbx_DebSem = Format(Now, "dd/mm/yyyy")
End If
Me.Tbx_NumSem = WorksheetFunction.IsoWeekNum(Now)
Me.Tbx_FinSem = CDate(Me.Tbx_DebSem) + 6
Pourquoi le lundi traite-t-on le premier jour de la semaine différemment ???
Aujourd'hui la macro me donne "04/10/2024" (qui est un vendredi) dans Me.Tbx_DebSem. Drôle de début de semaine. 😉
A toi de voir si tu veux utiliser ou non cette modification :
VB:
' Initialisation de la date du début de la semaine en partant du lundi
Me.Tbx_DebSem = Format(Now - Weekday(Now, 2) + 1, "dd/mm/yyyy")
' On calcule la fin de la semaine
Me.Tbx_FinSem = Format(Now - Weekday(Now, 2) + 7, "dd/mm/yyyy")
' On calcule le numéro ISO de la semaine
Me.Tbx_NumSem = WorksheetFunction.IsoWeekNum(Now)
Ca me donne "07/10/2024" (qui est un lundi) dans Me.Tbx_DebSem.
Je n'avais pas fait attention à ce problème. J'ai repris mon ancien code sans regarder ce qu'il faisait vraiment car j'étais sur un autre problème.
Merci toutefois de l'avoir soulevé, je vais faire les modifications selon ta proposition.
Faut-il que je remplace tout ce code, ou juste une partie. Je pense que je dois garder les deux dernières lignes, ai-je raison ?
celles-ci :
Me.Tbx_NumSem = WorksheetFunction.IsoWeekNum(Now)
Me.Tbx_FinSem = CDate(Me.Tbx_DebSem) + 6
Pendant que tu posais cette question que je devinais arriver 😉 j'ai justement édité mon message précédent pour y inclure ces deux lignes et donc répondre à cette question. 😉
Du coup #54 est-il suffisamment clair, ou veux-tu d'autres informations à ce sujet ?
Comme ça le gars qui essaye de trouver le MdP sait qu'il ne doit travailler que sur 7 caractères. C'est sympa pour lui, ça lui simplifie le boulot... 😅
Pendant que tu posais cette question que je devinais arriver 😉 j'ai justement édité mon message précédent pour y inclure ces deux lignes et donc répondre à cette question. 😉
Du coup #54 est-il suffisamment clair, ou veux-tu d'autres informations à ce sujet ?
C'était juste pour question de facilité, une fois les 7 caractères tapés, il n'y a plus qu'à cliquer sur Valider ou la touche Entrée du clavier. Mais tu as tout à fait raison...
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD