Microsoft 365 Mettre la 4ème colonne d'une ListBox au format [h]:mm

NONO14

XLDnaute Impliqué
Bonjour à toutes et à tous,

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
1728460462766.png

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
 
Dernière édition:
Solution
Bonjour,

Ta macro de #1 :
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 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...

NONO14

XLDnaute Impliqué
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")
1 non je n'ai pas le focus
2 je n'ai pas encore testé par ce moyen
3 comme toi, le bouton annuler
 

TooFatBoy

XLDnaute Barbatruc
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... 🤣 🤣 🤣


Le classeur en pièce jointe.
 

Pièces jointes

  • GestPersonnnel (3) (TFB-001).xlsm
    479.9 KB · Affichages: 2

TooFatBoy

XLDnaute Barbatruc
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.
 

NONO14

XLDnaute Impliqué
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... 🤣 🤣 🤣


Le classeur en pièce jointe.
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".
 

TooFatBoy

XLDnaute Barbatruc
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".
Oui, et ça marche toujours.

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... 😅
 

TooFatBoy

XLDnaute Barbatruc
😎 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.
 
Dernière édition:

NONO14

XLDnaute Impliqué
😎 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
 

TooFatBoy

XLDnaute Barbatruc
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 ?
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 ?
 

NONO14

XLDnaute Impliqué
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 ?
Merci, c'est suffisamment clair. Mes petites neurones commencent à tirer la langue, mais ça rentre encore un peu. ;)
 

Discussions similaires

Réponses
6
Affichages
552

Statistiques des forums

Discussions
315 083
Messages
2 116 041
Membres
112 640
dernier inscrit
rachidqadmir