Probléme de format de date entre VBA et BDD

Bonjour et meilleurs voeux pour 2023 à toute la communauté !

Pas trop à l'aise avec le VBA, j'ai tout de même créé un petit fichier pour une gestion de vestiaires dans une entreprise.

D'après le fichier joint, voici mes différentes difficultés:

1- Quand je rentre une date d'entrée ou de sortie dans le formulaire (tableau de bord puis Administrateur et/ou Créer une fiche), je retrouve la date inversée dans ma base de donnée (Feuille PERSONNEL). Je précise que je ne peux pas avoir l'extension Date Picker du fait de l'utilisation de ce programme en réseau d'entreprise.

2- Quand j'effectue une recherche de nom, je n'arrive pas à afficher le nom + le prénom sauf de cliquer sur la flèche à droite pour faire apparaitre les différentes déclinaisons ... Cela implique donc parfois quelques erreurs !

Vous trouverez ci-joint mon fichier. Je remercie toutes celles et ceux qui décideront de m'aider !! A très vite, Gabriel.

Hello,

1- Quand je rentre une date d'entrée ou de sortie dans le formulaire (tableau de bord puis Administrateur et/ou Créer une fiche), je retrouve la date inversée dans ma base de donnée (Feuille PERSONNEL). Je précise que je ne peux pas avoir l'extension Date Picker du fait de l'utilisation de ce programme en réseau d'entreprise.

    Cells(Derligne, 5) = CDate(TextBox_dateEntrée.Value)

2- Quand j'effectue une recherche de nom, je n'arrive pas à afficher le nom + le prénom sauf de cliquer sur la flèche à droite pour faire apparaitre les différentes déclinaisons ... Cela implique donc parfois quelques erreurs !

Pas bien compris .... quel formulaire ? quel bouton ?

Bonjour et merci beaucoup pour votre aide ! Cela fonctionne !!

Pour la seconde question, effectivement, pas évident de comprendre. Quand on passe par le tableau de bord, recherche en tant qu'administrateur, dans le champ "recherche" en haut, si je rentre un nom, je peux faire apparaitre le prénom en cliquant sur la flèche de sélection sur la droite du champ. Il arrive qu'il y ait deux prénoms différents pour un même nom, et si je ne le sélectionne pas en passant par la flèche de sélection, cela m'affiche automatiquement le premier trouvé ....

J'espère que ce sera clair ?!!!!

Merci pour votre retour ...

Il te faut dans la rowsource de ta combobox, une colonne avec nom + prenom et non 2 colonnes séparées

bonjour le fil,

une macro nouvelle "ComboBox1_Change" et une macro modifiée "UserForm_Initialize"

Private Sub ComboBox1_Change()
     ComboBox1.DropDown
End Sub

Private Sub UserForm_Initialize()
     Dim f     As Long
     Dim i     As Long

     With Sheets("Personnel")
          i = Application.Max(4, .Range("A" & Rows.Count).End(xlUp).Row)    'dernière cellule A de personnel
          .Range("A3:A" & i).Name = "MesNoms"
     End With
     aa = [MesNoms & ", " & offset(MesNoms,,1,,)]
     With ComboBox1
          .RowSource = ""     'ne plus utiliser ce rowsource
          .List = aa     'mais directement livrer par VBA
          .ListRows = 30
     End With

     Sheets("VESTIAIRES").Select
     f = Range("A65536").End(xlUp).Row
     i = Range("K65536").End(xlUp).Row
     For Each cel In Range("A4:A" & f)
          If cel.Value <> "" Then ComboBox_vestiaireZn.AddItem cel.Value
     Next cel
     For Each cel In Range("K4:K" & i)
          If cel.Value <> "" Then ComboBox_VestiaireZb.AddItem cel.Value
     Next cel

End Sub

Bonjour,

J'y avait pensé Rag02700, mais il aurait fallu que je modifie tous mes codes ....

Merci quand même, mais BsAlv m'a trouvé la solution qui fonctionne super bien, super boulot !!

Par contre Rag02700, le CDate fonctionne bien, mais si je l'applique sur DateEntrée et sur DateSortie, et que je laisse le champ vide dans DateSortie, j'ai une "erreur d'exécution 13: incompatibilité de type" à la validation de la modification. Je dois pouvoir indiquer une date d'entrée et renseigner une date de sortie plus tard ...

En tout cas, merci à vous 2, super boulot !!

hello,

à tester :

Cells(Derligne, 5) = iif(TextBox_dateEntrée.Value = "","", CDate(TextBox_dateEntrée.Value))

Bonjour Rag02700,

Désolé, mais ça ne fonctionne pas ... Merci quand même pour ton intérêt.

re, un début ...

Une date dans le future, c'est quoi ? Donc à modifier

  

     ...
    Cells(no_ligne, 4) = ComboBox_contrat.Value
          If Len(TextBox_dateEntrée.Value) > 0 Then
               sp = Split(Replace(Replace(TextBox_dateEntrée.Value, ".", "/"), "-", "/"), "/")     'remplacer les "-" et "." par "/" et séparer sur ce "/"
               If UBound(sp) >= 2 Then année = sp(2) Else année = Year(Now)     'année inconnue = cette année
               If UBound(sp) >= 1 Then Cells(no_ligne, 5) = DateSerial(année, sp(1), sp(0))     'au minimum jour et mois connu !
               If Len(TextBox_dateSortie.Value) > 0 Then
                    sp = Split(Replace(Replace(TextBox_dateSortie.Value, ".", "/"), "-", "/"), "/")
                    If UBound(sp) >= 2 Then année = sp(2) Else année = Year(Now)
                    If UBound(sp) >= 1 Then Cells(no_ligne, 6) = DateSerial(année, sp(1), sp(0))
               Else
                    Cells(no_ligne, 6) = DateSerial(Year(Now) + 1, 1, 1)     '1ier janvier de l'année prochaine
               End If
          End If
          Cells(no_ligne, 7) = ComboBox_service.Value
          ....
     

C'est magnifique BsAlv !!

Désolé de te prendre du temps, mais j'aime bien comprendre plutôt que de recopier bêtement le code. Si je pouvait avoir une explication plus détaillée pour comprendre ce codage, ce serait super !

En revanche, cela fonctionne bien, mais si je ne connais pas la date d'entrée (ou si on oublie de l'indiquer), je ne peux pas ajouter une date de fin. Aussi, comment modifier ce code pour que l'on imagine une date de fin plus proche, du genre 1 mois après la date d'entrée ?

Voici pourquoi cela ....:

Un employé rentre, on lui donne un vestiaire pour une période souvent non connu (intérimaire). Il arrive que cet intérimaire s'en aille sans que l'on soit averti par le service et donc ce vestiaire reste en statut occupé ...! C'est pour cela que nous sommes obligés de vérifier en réel si le vestiaire a été ou non libéré, et quand bien même, au bout d'un mois, le libérer s'il est effectivement vide.

Il y a aussi les anciens, les CDI, qui n'auront jamais de date de fin, sauf pour leur départ en retraite ou démission. Et ceux-là, on ne connais par forcément leur date d'arrivée ....

On pourrait par exemple déterminer une date de présence en fonction de la nature du contrat (variable si temporaire, fixe si CDI).

En bref, ce fichier serait hyper intéressant s'il devenait vraiment intelligent. Il sera prévu, par la suite, qu'il serve à piloter des vestiaires "connectés" avec autorisation d'accès avec la lecture du badge du salarié et selon les dates de présence.

En tout cas, merci pour ce super boulot !!

Cordialement,

Gabriel.

re, l'explication est pour demain ...

          Cells(no_ligne, 4) = ComboBox_contrat.Value
          If Len(TextBox_dateEntrée.Value) > 0 Then     'date entrée est connu
               sp = Split(Replace(Replace(TextBox_dateEntrée.Value, ".", "/"), "-", "/"), "/")     'remplacer les "-" et "." par "/" et séparer sur ce "/"
               If UBound(sp) >= 2 Then année = sp(2) Else année = Year(Now)     'année inconnue = cette année
               If UBound(sp) >= 1 Then
                    Cells(no_ligne, 5) = DateSerial(année, sp(1), sp(0))     'au minimum jour et mois connu = résultat est une date réel !

                    If Len(TextBox_dateSortie.Value) > 0 Then     'date sortie est connue
                         sp = Split(Replace(Replace(TextBox_dateSortie.Value, ".", "/"), "-", "/"), "/")
                         If UBound(sp) >= 2 Then année = sp(2) Else année = Year(Now)
                         If UBound(sp) >= 1 Then Cells(no_ligne, 6) = DateSerial(année, sp(1), sp(0))
                    Else     'date sortie n'est pas connue = regarder vers le type de contrat
                         Select Case UCase(ComboBox_contrat.Value)     'quelle contrat ? alors combien de jours ????
                              Case "CDI", "CDD", "INT": d = 14
                              Case "STAGE", "ALT": d = 60
                              Case "EXT": d = 100
                              Case "APPRENTI", "DEPART": d = 1
                              Case "AUTRE": d = 7
                              Case Else: d = -1
                         End Select
                         If d < 0 Then     'nombre de jours est négative ?
                              Cells(no_ligne, 6).Value = ""     'alors date de sortie est inconnue
                         Else
                              Cells(no_ligne, 6).Value = Cells(no_ligne, 5).Value + d     'date de sortie = date d'entrée + d
                         End If
                    End If
               Else     'date d'entrée n'est pas correcte  (jour ou mois inconnu)
                    Cells(no_ligne, 5).Value = ""     'date de entrée est inconnue
                    Cells(no_ligne, 6).Value = ""     'date de sortie est inconnue
               End If
          Else     'date d'entrée est inconnue
               Cells(no_ligne, 5).Value = ""     'date de entrée est inconnue
               Cells(no_ligne, 6).Value = ""     'date de sortie est inconnue
          End If

          Cells(no_ligne, 7) = ComboBox_service.Value
       

re,

une date, c'est par exemple 16/01/2023 ou 16-1-2023 ou 16.1.23, donc le jour, mois et année séparé par un / - ou .

sp = Split(Replace(Replace(TextBox_dateEntrée.Value, ".", "/"), "-", "/"), "/") 'remplacer les "-" et "." par "/" et séparer sur ce "/"

la partie orange change ces 3 possibilités en 16/1/23 ou 16/01/2023 (ce zéro supplémentaire n'est pas important pour le moment). Le reste, donc le "split" avec l'argument "/" sépare ce texte en plusieurs souschaînes dans une matrice , normallement 3, le jour, le mois et l'année. Le premier a index 0 (!), donc l'Ubound (=index de la dernière souschaîne) sera 2 (https://learn.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/split-function)

Si l'Ubound est <2, votre TextBox_dateEntrée.Value n'était pas 16/01/2023 mais par exemple 16/01 ... (plus tard)

C'est excellent !!!! Merci Bart !

Comment fait-on pour donner une note à un membre sur ce forum ????

Un énorme merci, pro et réactif.

Cordialement,

Gabriel.

Rechercher des sujets similaires à "probleme format date entre vba bdd"