IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Désactivation du pavé numérique à cause d'un code vba


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Comptable
    Inscrit en
    Octobre 2017
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Octobre 2017
    Messages : 45
    Points : 17
    Points
    17
    Par défaut Désactivation du pavé numérique à cause d'un code vba
    Bonjour tout le monde,

    je me permets de vous demander votre aide pour un truc qui me laisse totalement perplexe...

    j'ai fait un tout petit code (s'inspirant très fortement d'un code trouvé sur un forum) utilisant les fonctions onKey et sendKey permettant de faire un enregistrement automatique d'un fichier toutes les 5 pressions de la touche "entrée" du clavier numérique
    (j'ai fait ça à cause d'un problème de stabilité d'un fichier depuis une migration vers excel 2013 64b dont notre nouvel infogérant semble se moquer totalement, bref...)
    vous trouverez en pièce jointe le fichier en question dont voila le code :

    dans la macro d'ouverture du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Workbook_Open()
     
    countPressEnter = 0
    Application.OnKey "~", "countPressTime"
     
     
     
    End Sub
    dans un module :
    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
    Dim countPressEnter As Integer
     
     
    Private Sub countPressTime()
        countPressEnter = countPressEnter + 1
        Application.SendKeys ("{ENTER}")
     
    If countPressEnter = 5 Then
         ActiveWorkbook.Save
         Application.SendKeys ("{ENTER}")
         countPressEnter = 0
         CreateObject("Wscript.shell").Popup "Sauvegarde effectuée", 1, "Sauvegarde"
         Else: Exit Sub
    End If
    End Sub
    le code fonctionne parfaitement bien : toutes les 5 pressions de la touche entrée, une sauvegarde s'effectue et un pop up s'affiche pour le signaler
    donc tout semble parfait sauf que.......... et ben sauf que pour une raison qui m'échappe totalement, à chaque pression de la touche "entrée" du clavier principal, le pavé numérique se désactive !!!

    et là, j'ai besoin de vous pour comprendre

    un grand merci pour votre aide !
    julienTest sauvegarde toutes les 5 pressions de la touche entrée.xlsm

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour

    Presque personne n'ouvre les fichiers balancés avec la première question.

    Et encore moins les fichiers de macros

    Et puis, il y a bien plus simple que ta patente:
    Le minimum c'est une minute. Au pire le travail perdu se limite à l'intervalle.

    Nom : Excel.jpg
Affichages : 3213
Taille : 75,9 Ko

    Et/ou, développer le réflexe de cliquer dans la barre d'outils Accès rapide:

    Nom : Excel1.jpg
Affichages : 3112
Taille : 13,5 Ko

    Si l'icone n'est pas affichée, tu peux l'afficher et même l'ajouter.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, pb connu et récurrent pour cela utiliser le Shell pour tous les SendKeys. Cela si tu n'as pas opté pour la solution de Clément plus simple et efficace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With CreateObject("WScript.Shell")
        .SendKeys ....
        .....
    End With

  4. #4
    Membre à l'essai
    Homme Profil pro
    Comptable
    Inscrit en
    Octobre 2017
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Octobre 2017
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour

    Presque personne n'ouvre les fichiers balancés avec la première question.

    Et encore moins les fichiers de macros
    Ah ok désolé, j'ignorais, mais c'est vrai qu'en y repensant, c'est assez logique

    Citation Envoyé par clementmarcotte Voir le message
    Et puis, il y a bien plus simple que ta patente:
    Le minimum c'est une minute. Au pire le travail perdu se limite à l'intervalle.

    Nom : Excel.jpg
Affichages : 3213
Taille : 75,9 Ko

    Et/ou, développer le réflexe de cliquer dans la barre d'outils Accès rapide:

    Nom : Excel1.jpg
Affichages : 3112
Taille : 13,5 Ko

    Si l'icone n'est pas affichée, tu peux l'afficher et même l'ajouter.
    En fait je l'ai faite probablement un peu trop courte dans mon premier post pour pas ennuyer avec les détails, mais ça aurait surement valu le coup finalement.
    La sauvegarde automatique ne fonctionne pas correctement car le fichier qui pose problème fonctionne avec des liens OLE vers un logiciel de compta. Et quand le fichier plante et qu'on se fait sortir d'Excel sauvagement, ça "casse" tout, et c'est une vraie galère pour les restaurer. Résultat, c'est beaucoup plus simple de repartir de la dernière sauvegarde propre que l'on a

    Pour le réflexe ctrl+s ou l'icone de sauvegarde, je suis d'accord, mais ce n'est pas le cas de tout le monde, et parfois, quand on est dans le boulot, beaucoup de collègues n'y pensent pas, et perdent plusieurs dizaines de minutes de travail, ce qui peut représenter pas mal de remplissage du fichier...

    julien

  5. #5
    Membre à l'essai
    Homme Profil pro
    Comptable
    Inscrit en
    Octobre 2017
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Octobre 2017
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par kiki29 Voir le message
    Salut, pb connu et récurrent pour cela utiliser le Shell pour tous les SendKeys. Cela si tu n'as pas opté pour la solution de Clément plus simple et efficace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With CreateObject("WScript.Shell")
        .SendKeys ....
        .....
    End With
    Salut Kiki !
    merci pour ton aide
    mais je ne connais pas le shell, peux tu m'en dire un peu plus sur le pourquoi du comment?

    j'ai essayé avec ca :

    Dim countPressEnter As Integer


    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
    Private Sub countPressTime()
        countPressEnter = countPressEnter + 1
     
    With CreateObject("WScript.Shell")
        .SendKeys ("{ENTER}")
    End With
     
     
    If countPressEnter = 5 Then
         ActiveWorkbook.Save
         countPressEnter = 0
         CreateObject("Wscript.shell").Popup "Sauvegarde effectuée", 1, "Sauvegarde"
    '     Application.SendKeys ("{ENTER}")
         Else: Exit Sub
    End If
    End Sub
    mais ça fait tourner la macro en boucle, je suis obligé de l'arrêter à la main...

    julien

  6. #6
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    re, puisque tu sembles partisan de la complexification des applis va voir VERR MAJ et VERR NUM dans userform , à adapter à ton contexte.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Comptable
    Inscrit en
    Octobre 2017
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Octobre 2017
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par kiki29 Voir le message
    re, puisque tu sembles partisan de la complexification des applis va voir VERR MAJ et VERR NUM dans userform , à adapter à ton contexte.
    Merci beaucoup, je vais regarder avec attention
    et comme je sens un peu de sarcasme dans ta réponse , je vais simplement préciser que je suis adepte du plus simple, mais je fais aussi ce que je peux avec ce que j'ai, c'est à dire une bande d'informaticien persuadés que si le fichier plante inopinément, c'est la faute du fichier... alors qu'avant la migration chez eux, ça marchait parfaitement bien, et que sur la version excel installée sur le serveur TSE, ça marche aussi parfaitement bien...
    donc face à un mur qui refuse d'admettre que l'excel installé sur les postes est mal installé, je me débrouille comme je peux et avec l'aide de gens comme toi qui est ultra précieuse !

    julien

  8. #8
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, la version allégée, eh oui les mutawas ... ( j'en ai calmé certains jadis )
    Fichiers attachés Fichiers attachés

  9. #9
    Membre à l'essai
    Homme Profil pro
    Comptable
    Inscrit en
    Octobre 2017
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Octobre 2017
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par kiki29 Voir le message
    Salut, la version allégée, eh oui les mutawas ... ( j'en ai calmé certains jadis )
    merci beaucoup !
    mais pas mieux... je crois que j'essaye de faire un truc qui dépasse largement mon niveau...
    j'ai surement mal compris ton fichier et mal integré au mien


    la marco a l'air de fonctionner mais 2 coups sur 4, je n'ai plus le pavé numérique...
    je saisis "1", je fais "entrée"
    je saisis "2", je fais "entrée"
    et la je peux plus saisir de chiffre, je fais quand meme "entrée"
    je peux toujours pas saisir de chiffre, je ferais "entrée"
    et la je peux a nouveau saisir un chiffre, je fais "entrée"
    je peux encore saisir un chiffre, je fais "entrée"
    je ne peux plus saisir de chiffre, etc.......

    en pj mon fichier...
    Test sauvegarde toutes les 5 pressions de la touche entrée 2 plus propre.xlsm

  10. #10
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 947
    Points : 4 058
    Points
    4 058
    Par défaut
    Bonjour.
    Je suis parti du code donné par Kiki29.
    J'ai simplifié pour qu'il tienne dans un module normal et non plus un module de classe.
    SetNumLock(True) pour activer le clavier numérique.
    SetNumLock(False) pour désactiver le clavier numérique.
    SetCapital(True) pour activer le mode majuscule.
    SetCapital(False) pour désactiver le mode majuscule.

    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
    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 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_CAPITAL = &H14
    Private Const KEYEVENTF_EXTENDEDKEY = &H1
    Private Const KEYEVENTF_KEYUP = &H2
     
    '---------------------------------------------------------------------------------------
    Private 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 ' cas particulier pour VK_CAPITAL
        keybd_event 16, 0, 0, 0
        keybd_event 16, 0, 2, 0
    End If
    End Sub
     
    '---------------------------------------------------------------------------------------
    Public Sub SetNumLock(Etat As Boolean)
    '---------------------------------------------------------------------------------------
    ' Etat = True : Active le clavier numérirque.
    ' Etat = False : désactive le clavier numérique.
    '---------------------------------------------------------------------------------------
    While GetKeyState(VK_NUMLOCK) = 1 + Etat
        SetKeyState VK_NUMLOCK, Etat
        DoEvents
    Wend
    End Sub
     
    '---------------------------------------------------------------------------------------
    Public Sub SetCapital(Etat As Boolean)
    '---------------------------------------------------------------------------------------
    ' Etat = True : Active le mode majuscule.
    ' Etat = False : désactive le mode majuscule.
    '---------------------------------------------------------------------------------------
    While GetKeyState(VK_CAPITAL) = 1 + Etat
        SetKeyState VK_CAPITAL, Etat
        DoEvents
    Wend
    End Sub
    '---------------------------------------------------------------------------------------


    Dites-moi si ça marche ?

    P.-S. : J'ai bien aimé cette ligne de code : NumLock = GetKeyState(VK_NUMLOCK) = 1 dans la fonction Public Property Get NumLock() As Boolean

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut
    re
    normalement si on remplace tout le sendkeys par la meme chose avec l'api keybd_event(down et up!!!)de la librairie user32 le numlok n'est pas affecté
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Candidat au Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Merci du tuyau
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With CreateObject("WScript.Shell")
        .SendKeys "{NUMLOCK}"
    End With
    Fonctionne à merveille, et est très simple à intégrer dans des macros "d'amateur"
    Merci à vous du temps passé pour nous aider
    JML

Discussions similaires

  1. [AC-2003] empêcher l'activation-désactivation du pavé numérique
    Par electrosat03 dans le forum VBA Access
    Réponses: 16
    Dernier message: 17/11/2010, 17h11
  2. pavé numérique désactivé après utilisation d'une VM
    Par trotters213 dans le forum Ubuntu
    Réponses: 0
    Dernier message: 19/02/2009, 18h54
  3. [VB.NET]Virgule sur le pavé numérique
    Par jab dans le forum Windows Forms
    Réponses: 6
    Dernier message: 19/06/2006, 09h27
  4. Réponses: 7
    Dernier message: 06/11/2005, 14h47
  5. désactiver le pavé numérique
    Par soad dans le forum C++
    Réponses: 7
    Dernier message: 08/02/2005, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo