Bonjour,
D'habitude j'arrive à bricoler mes routines excel dans mon coin, en m'appuyant de recherches sur les forums, et en adaptant à mon petit projet...mais là...je m'arrache les cheveux depuis pas mal de jours sur un (petit ?) problème.

J'ai un classeur avec plusieurs pages. J'y engrange des informations de pannes de systèmes de soins, et souhaite l'assortir d'une recherche sur les données enregistrées afin de retrouver les solutions des pannes du passé. ça marche sur une version qui scanne tous les enregistrements à ce jour. J'anticipe le jour où il y aura beaucoup, beaucoup d'enregistrements, et souhaite que l'utilisateur puisse filtrer sa recherche sur une période de dates définies.
J'ai trouvé sur developpez.net quelques (élégantes) solutions qui utilisent des textbox.
Le code que j'ai construit, avec votre aide donc, permet la saisie de la date de début et de la date de fin de la recherche. IL teste que l'utilisateur saisisse bien des chiffres (autre chose que des chiffres met le fond de la box en rouge et affiche un message d'alerte). Au 8e caractère saisit, je voudrais que la date soit reconstruite (JJ/MM/AAAA).

Soucis :
  • si je met longueur=7, il faut taper un 8e caractère pour que le résultat s'affiche dans la box (et l'année est fausse puisqu'au moment du calcul il n'y a que 7 caractères dans la texbox).
  • si je met longueur=8, il faut taper un 9e caractère pour que le résultat s'affiche dans la box (pas intuitif pour l'utilisateur). Je sais pas utiliser la touche entrée pour valider ma saisie (je sais pas la gérer dans VBA).
  • Je n'arrive pas non plus à transférer le focus de ma textebox "date début" vers ma texbox"datefin" quand la première saisie est terminée.


Mon souhait : qu'à la frappe du 8e caractère de la date le code affiche dans la texbox la date reformatée avec les "/", et positionne le curseur sur la texbox suivante.

Existe-t-il une solution à mes tourments ?
merci de votre aide !

La macro que je dépose est pour la textbox de saisie de la date de fin. L'autre est exactement la même pour la date de début.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
Private Sub TextBoxDateFinSearch_KeyPress(ByVal Cancel As MSForms.ReturnBoolean)
 
Dim jour, mois, annee As String
 
    If Len(TextBoxDateFinSearch) = 8 Then '(testé avec "7", mais dans ce cas l'année est fausse)
 
        jour = Left(TextBoxDateFinSearch.Value, 2)
        mois = Mid(TextBoxDateFinSearch.Value, 3, 2)
        annee = Right(TextBoxDateFinSearch.Value, 4)
 
        'ci-après tests de validité de la date saisie
 
        If jour = 0 Or jour > 31 Then
        MsgBox "Jour impossible : recommencez votre saisie."
        GoTo finsaisieDateFin
        End If
 
        If mois = 0 Or mois > 12 Then
        MsgBox "Mois impossible : recommencez votre saisie."
        GoTo finsaisieDateFin
        End If
 
        If annee < 2020 Then
        MsgBox "Pas de données antérieures à l'année 2020 : recommencez votre saisie."
        GoTo finsaisieDateFin
        End If
 
        If annee > Year(Date) Then
        MsgBox "Les recherches dans le futur ne sont pas encore possibles : recommencez votre saisie (année)."
        GoTo finsaisieDateFin
        End If
 
        'construction de la date formatée comme je la veux
        TextBoxDateFinSearch.Value = jour & "/" & mois & "/" & annee
 
    'message si utilisateur continue à saisir des chiffres
    MsgBox "Nombre de caractères maximaux atteint. Cliquez dans le champs de DATE FIN, ou appuyer sur RAZ pour recommencer une nouvelle saisie", vbOKOnly, "GESPAN"
    KeyAscii = 0
 
    GoTo finsaisieDateFin
    End If
 
'Si utilisateur continue à rentrer des caractères, pour éviter un recalcul de la date
If Len(TextBoxDateFinSearch) >= 8 Then
KeyAscii = 0
MsgBox "Nombre de caractères maximaux atteint. Lancez la recherche ou appuyer sur RAZ pour recommencer une nouvelle saisie", vbOKOnly, "GESPAN"
End If
 
    If Len(TextBoxDateFinSearch.Value) < 8 Then
 
        If InStr("0123456789", VBA.Chr(KeyAscii)) = 0 Then
            TextBoxDateFinSearch.BackColor = &H80000005
            KeyAscii = 0
            TextBoxDateFinSearch.BackColor = &HFF&
            MsgBox "Format de saisie JJMMAAAA (chiffres uniquement, sans Slash)", vbOKOnly, "GESPAN"
            TextBoxDateFinSearch.BackColor = &H80000005
        End If
 
    End If
 
 
finsaisieDateFin:
 
End Sub