2017-03-14 4 views
1

J'ai un gestionnaire d'événements KeyDonw sur mon formulaire dans MS Access 2007, je l'utilise à la place des masques, car ils ne fonctionnent pas comme je le souhaite.MS Access obtient la zone de texte de l'expéditeur sur l'événement KeyDown dans vba

Voici mon code:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer) 
    If ([Forms]![aForm].Form.date_rogd_s_d.SelLength = 2) Then 
     [Forms]![aForm].Form.date_rogd_s_d.Text = "" 
    End If 

    If (val([Forms]![aForm].Form.date_rogd_s_d.Text) > 31) Then 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
       X = Y 
       Exit Sub 
     Case Else 
      KeyCode = 0 
      Exit Sub 
     End Select 
    End If 


    If (Len([Forms]![aForm].Form.date_rogd_s_d.Text) < 2) Then 
     Select Case KeyCode 
      Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 
      Case 96, 97, 98, 99, 100, 101, 102, 103, 104, 105 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
      X = Y 
     Case Else 
      KeyCode = 0 
     End Select 
    Else 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
       X = Y 
       Exit Sub 
     End Select 
     [Forms]![aForm].Form.date_rogd_s_m.SetFocus 
    End If 
End Sub 

ce code fonctionne très bien, mais j'ai plus 5 mêmes champs que j'ai besoin de basculer entre.

N'importe quel moyen d'obtenir l'expéditeur d'un événement, je veux dire l'objet textbox dans la touche enfoncée, je veux créer une fonction universelle pour toutes les zones de texte et je dot copier pour coller ce code.

Répondre

0

je résoudre ce problème avec cette fonction:

Private Sub onKeyDownForDateFields(KeyCode As Integer, Shift As Integer, Sender As Object, NextObject As Object, count As Integer, maxValue As Integer, Is_submit As Boolean) 
    If (Sender.SelLength = count) Then 
     Sender.Text = "" 
    End If 

    If (val(Sender.Text) > maxValue) Then 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack 
       X = Y 
       Exit Sub 
     Case Else 
      KeyCode = 0 
      Exit Sub 
     End Select 
    End If 


    If (Len(Sender.Text) < count) Then 
     Select Case KeyCode 
      Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 
      Case 96, 97, 98, 99, 100, 101, 102, 103, 104, 105 
      Case vbKeyDelete, vbKeyBack, vbKeyReturn 
      X = Y 
     Case Else 
      KeyCode = 0 
     End Select 
    Else 
     Select Case KeyCode 
      Case vbKeyDelete, vbKeyBack 
       X = Y 
       Exit Sub 
      Case vbKeyReturn 
       Êíîïêà48_Click 
       Exit Sub 
     End Select 
     If (Is_submit = True) Then 
      Êíîïêà48_Click 
     Else 
      NextObject.SetFocus 
     End If 
    End If 
End Sub 

Sender est TextBox en cours et NextObject objet que je dois se concentrer ensuite.

Il vérifie également si les symboles de nombre maxi sont entrés dans la zone de texte et si, par exemple, il n'a pas atteint le nombre maximum autorisé, 31 pour les jours par exemple.

Maintenant, si je dois gérer l'événement que je fais comme ça:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer) 

    onKeyDownForDateFields KeyCode, Shift, [Forms]![aForm].Form.date_rogd_s_d, [Forms]![aForm].Form.date_rogd_s_M, 2, 31, False 

End Sub 
-1

Renommez votre procédure, il faut garder tout le reste du code:

Private Sub On_KeyDown(KeyCode As Integer, Shift As Integer) 

puis dans toutes vos commandes/textboxes, passer les paramètres à cette procédure: par exemple, si vous avez ci-dessus serait tout simplement transmettre le code de touche, passer comme référence au même sous:

Private Sub date_rogd_s_d_KeyDown(KeyCode As Integer, Shift As Integer) 
Call On_KeyDown(KeyCode, Shift) 
End Sub