Pb activation/déactivation num lock (Verr Num)

Y compris Power BI, Power Query et toute autre question en lien avec Excel
e
edlede
Membre dévoué
Membre dévoué
Messages : 649
Appréciations reçues : 2
Inscrit le : 4 novembre 2015
Version d'Excel : 2013

Message par edlede » 17 novembre 2017, 16:42

Bonsoir le forum,

Suite a des contraintes technique je me retrouve à faire fonctionner mon petit fichier qu'avec un clavier numérique (17 touches)

Mon problème est que je dois désactivé la touche verr num lorsque la Colonne "C" est sélectionnée ( activation d'un userform à contrôler avec les flèches directionnelles du pavé numérique)

Après quelques recherche sur le net j'ai trouvé ceci ( sur un forum code vb et non vba) que j'ai mis dans un module de classe,

Je pense qu'il faut que je garde la Private Const VK_NUMLOCK = &H90 mais on ne sais jamais je garde tout pour l'instant
Option Explicit
 
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As _
                                                                 Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) _
                                          As Long
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As _
                                     Integer
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" _
                                       (ByVal wCode As Long, ByVal wMapType As Long) As Long
 
Private Const VK_NUMLOCK = &H90
Private Const VK_SCROLL = &H91
Private Const VK_CAPITAL = &H14
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
 
Public Sub SetKeyState(ByVal Key As Long, ByVal State As Boolean)
 
    keybd_event Key, MapVirtualKey(Key, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0
    keybd_event Key, MapVirtualKey(Key, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    If Key = 20 And State = False Then
        keybd_event 16, 0, 0, 0
        keybd_event 16, 0, 2, 0
    End If
 
End Sub
 
Public Property Get CapsLock() As Boolean
    CapsLock = GetKeyState(VK_CAPITAL) = 1
End Property
 
Public Property Let CapsLock(ByVal Value As Boolean)
    SetKeyState VK_CAPITAL, Value
End Property
 
Public Property Get NumLock() As Boolean
    NumLock = GetKeyState(VK_NUMLOCK) = 1
End Property
 
Public Property Let NumLock(ByVal Value As Boolean)
    SetKeyState VK_NUMLOCK, Value
End Property
 
Public Property Get ScrollLock() As Boolean
    ScrollLock = GetKeyState(VK_SCROLL) = 1
End Property
 
Public Property Let ScrollLock(ByVal Value As Boolean)
    SetKeyState VK_SCROLL, Value
End Property
Autant vous dire que c'est du charabia pour moi,

Donc dans ma feuille1 j'ai mis ceci pour que le verr num se désactive lors de la sélection de la colonne C et se réactive lors de l'arrivé sur la colonne D
Private Sub Worksheet_SelectionChange(ByVal target As Range)
    If Not Application.Intersect(target, Range("C:C")) Is Nothing Then
        If NumLock = True Then NumLock = False
        
        If target.Value = "" Then
        Load formimg
        formimg.Show
        End If
    End If
    If Not Application.Intersect(target, Range("D:D")) Is Nothing Then
    If NumLock = False Then NumLock = True
    End If
    End Sub



je me retrouve avec NumLock = vide



Si quelqu'un à une idée ou une solution pour résoudre mon problème,

je vous laisse mon fichier pour avoir une meilleur idée Merci
Test dépot des prélèvement_2.1.xlsm
(434.25 Kio) Téléchargé 7 fois
e
edlede
Membre dévoué
Membre dévoué
Messages : 649
Appréciations reçues : 2
Inscrit le : 4 novembre 2015
Version d'Excel : 2013

Message par edlede » 17 novembre 2017, 21:30

Rebonsoir à tous,

Ne trouvant pour l'instant aucune solution je me demandais si je pouvais réattribué à la touche 2 du pavé numérique (par exemple) l'action de la flèche du bas mais je n'ai pas trouvé de les correspondances des keycode du clavier en vba.
Je sais que enter = 13 mais je trouve rien sur le net qui corresponde à la valeur du keycode pour le clavier numérique.

il doit bien y avoir une table de correspondance entre la touche pressé et la valeur de du keycode ??

Du coup on pourrait faire un code du style if keycode " paveniumerique2" = true then listbox.index = listbox.index+1

je ne suis pas certain que cela fonctionne mais c'est peut êtres une piste à suivre? qu'en pensez vous?

Si un GP passe dans le secteur pour m'infirmer ou non mon idée je suis preneur :mrgreen:
A
Andre13
Membre impliqué
Membre impliqué
Messages : 1'568
Appréciations reçues : 97
Inscrit le : 13 juillet 2017
Version d'Excel : 2007-2013

Message par Andre13 » 17 novembre 2017, 21:47

Bonsoir
le lien ci-dessous peut être utile
https://msdn.microsoft.com/fr-fr/VBA/La ... -constants

un échantillon du lien ci-dessus:
Les constantes suivantes représentent les touches du pavé numérique :
[...]
Constante | Valeur | Description |
vbKeyNumpad0 0 x 60 Touche 0
vbKeyNumpad1 0x61 Touche 1
vbKeyNumpad2 0x62 Touche 2
vbKeyNumpad3 0 x 63 Touche 3
vbKeyNumpad4 0 x 64 Touche 4
vbKeyNumpad5 0 x 65 Touche 5
vbKeyNumpad6 0x66 Touche 6
vbKeyNumpad7 0 x 67 Touche 7
vbKeyNumpad8 0x68 Touche 8
vbKeyNumpad9 0x69 Touche 9
vbKeyMultiply 0x6A Touche multiplication (*)
vbKeyAdd 0x6B SIGNE PLUS ( + ) clé
vbKeySeparator 0x6C Touche Entrée
vbKeySubtract 0x6D SIGNE moins ( - ) clé
vbKeyDecimal 0x6E Clé de virgule décimale ( **** )
vbKeyDivide 0x6F SIGNE DIVISION ( / ) clé
[...]
/////
Et le lien ci-dessous la gestion des touches que, je trouve très intéressant
http://users.skynet.be/micdub/vba6.htm
crdlt,
André
e
edlede
Membre dévoué
Membre dévoué
Messages : 649
Appréciations reçues : 2
Inscrit le : 4 novembre 2015
Version d'Excel : 2013

Message par edlede » 17 novembre 2017, 22:55

Merci andre13 effectivement je venais de tombé sur un article similaire sur l'utilisation sendkey

Donc mon code fonctionne nickel mais je ne comprend pourquoi


Dans ma feuille 1 j'ai ecrit ce code ( avec trop de if je pense mais bon ca fonctionne) et je lance ma sub VerrNum
  Private Sub Worksheet_SelectionChange(ByVal target As Range)
       
   i = ActiveCell.Column

    If i = 3 Then
        If ActiveCell.Value <> "" Then Exit Sub
        If Not Application.Intersect(target, Range("C:C")) Is Nothing Then
            If i <> 2 Then
            VerrNum
            If target.Value = "" Then
            Load formimg
            formimg.Show
            End If
            End If
        End If
        
    
    Else
        If i = 4 Then
        If ActiveCell.Value <> "" Then Exit Sub
        VerrNum
        End If
    End If
  End Sub
Mais ma sub VerrNum pour qu'elle déactive ou réactive la touche je suis obligé de faire 2 fois le sendkeys ?????? :k'res:
Sub VerrNum()
    i = ActiveCell.Column
'    If i = 3 Or i = 4 Then
If ActiveCell.Value <> "" Then
Exit Sub
Else
If i = 2 Then Exit Sub
SendKeys "{NUMLOCK}"
SendKeys "{NUMLOCK}"
End If
End Sub
Si quelqu'un est capable de me dire pourquoi en lançant 2 fois de suite le sendkeys ça fonctionne je suis preneur !!
Test dépot des prélèvement_2.2.xlsm
(427.2 Kio) Téléchargé 10 fois
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message