2017-09-18 2 views
2

Je possède ce code pour détecter Entrez est presséévénements d'incendie lorsque la clé est libéré VBA

Private Declare Function GetKeyState Lib "user32" _ 
(ByVal nVirtKey As Long) As Integer 
    Const VK_RETURN As Integer = &HD 

Et j'utiliser cette fonction dans une macro comme celui-ci

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If GetKeyState(VK_RETURN) < 0 Then Enter = True Else Enter = False 
    If Enter = True Then 
     Call IncreaseValue 
    End If 
End Sub 

C'est cependant appelé plusieurs fois lorsque la touche Enter est maintenue enfoncée. Existe-t-il un moyen d'appeler cette fonction seulement une fois chaque fois que vous appuyez sur la touche entrée? Pourquoi ai-je besoin parce que j'ai une feuille d'entrée de données, qui fonctionne comme un formulaire - chaque fois que la touche entrée est enfoncée, il augmente la valeur d'une cellule de 1, qui est utilisé pour la recherche valeurs. Mais en maintenant enfoncé, vous passerez à travers les enregistrements.

+0

Dites ensuite aux utilisateurs de ne pas appuyer sur la touche Entrée. Ou pourquoi avez-vous besoin de le maintenir? N'importe quelle raison? C'est un comportement normal dans Windows que si vous maintenez une touche, il commence à répéter le signal après une courte période. Je pense que ça vaut la peine de repenser votre approche. Pour moi ce n'est pas vraiment clair ce que vous voulez réaliser. Pouvez-vous donner plus de détails? –

+0

Je suis d'accord avec @Peh. Cela semble être un problème d'utilisateur. Cependant, vous pouvez utiliser quelque chose comme 'Application.DataEntryMode' pour" désactiver le clavier "après la touche initiale. Plein de dangers cependant! – Zac

+0

Il n'y a pas de raison particulière pour maintenir l'entrée - juste en passant par-dessus des choses entrées j'ai remarqué que certains ont été sautés. Donc je suppose qu'ils tombent dans la réflexion profonde tout en maintenant enfoncée la touche d'entrée pendant 2 secondes ou quelque chose. Juste pour le rendre "infaillible" vous savez, quelques mesures supplémentaires – Renet

Répondre

4

Bien sûr, il y a! Tout ce dont vous avez besoin est de suivre Enter clé toggling (notez les valeurs de retour).

L'idée principale qui est de suivre le bit de poids faible (bascule/untoggle), et chaque fois qu'il change et le bit de poids fort est 1 (pressé) - nous sommes libres d'augmenter ce nous désirons.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Static StatePreservedResponse As Long 
    Dim StateResponse As Long 

    StateResponse = GetKeyState(VK_RETURN) 

    If StateResponse < 0 And StateResponse <> StatePreservedResponse Then 
     Call IncreaseValue 
    End If 

    StatePreservedResponse = StateResponse 
End Sub