Comportement étrange avec SendKeys

Mic13710

XLDnaute Junior
Bonjour,

Afin de maximiser la zone d'affichage de mon tableau et avoir accès à la barre d'accès rapide, je cache le ruban à l'ouverture du fichier, et je le restitue dans son état initial à la fermeture avec les codes suivants :

A l'ouverture :
Code:
Private Sub Workbook_Open()

With Application
    If .CommandBars.Item("Ribbon").Height > 80 Then
        Ruban = True
        .SendKeys "^{F1}" 'pour masquer le ruban sur la feuille impression
          DoEvents
    End If
    .ScreenUpdating = False
    .EnableEvents = False
    .DisplayFormulaBar = False
    .DisplayStatusBar = False
    .WindowState = xlMaximized
End With
etc.....
La variable Ruban est à Vrai si le ruban est visible

A la fermeture :
Code:
.
.
.
If Application.CommandBars.Item("Ribbon").Height < 80 And Ruban Then
    Application.SendKeys "^{F1}"
    DoEvents
End If
etc....
Ça fonctionne bien, sauf qu'à l'ouverture du fichier, si la commande .SendKeys "^{F1}" réduit bien le ruban, elle me supprime aussi le verrouillage numérique ! Et chose encore plus étrange, la même commande n'a pas ce comportement à la fermeture.
Depuis hier je triture mon code dans tous les sens pour comprendre pourquoi j'ai le verrouillage numérique qui change uniquement au démarrage de ma macro et uniquement lorsqu'il est verrouillé car bien entendu, l'inverse ne se produit pas s'il n'est pas verrouillé au départ, sinon ce serait trop simple...

Si quelqu'un à une idée, je suis preneur.

Merci d'avance pour votre aide.
 

Mic13710

XLDnaute Junior
Re : Comportement étrange avec SendKeys

Salut MJ13 et merci pour ta réponse. Il s'agit donc bien d'un bug d'excel. J'ai effectivement mis un SendKeys "{NUMLOCK}" dans mon code pour résoudre temporairement le problème, mais apparemment il va me falloir le laisser !
Mais si c'est un bug, il ne doit alors se produire qu'à la première occurrence du SendKeys car je ne l'ai pas à la fermeture pour la même combinaison de touches.

En voyant ton code, deux remarques :
- es-tu sûr des parenthèses et si oui pourquoi ?
- la fonction Wait n'a pas l'air de fonctionner chez moi car si j'écris - .SendKeys "^{F1}", True - le ruban ne change pas. Je suis obligé d'utiliser le DoEvents pour que ça fonctionne.

Donc mon code avec le verrouillage est le suivant :
Code:
With Application
    If .CommandBars.Item("Ribbon").Height > 80 Then
        Ruban = True
        .SendKeys "^{F1}" 'pour masquer le ruban sur la feuille impression
        .SendKeys "{NUMLOCK}" 'pour reverrouiller le clavier numérique !
        DoEvents
    End If
    .ScreenUpdating = False
    .EnableEvents = False
    .DisplayFormulaBar = False
    .DisplayStatusBar = False
    .WindowState = xlMaximized
End With
etc.....
Perso, je trouve ça assez bizarre que ce bug ne soit pas corrigé car je viens de vérifier et il existe aussi sur la version 2007.
 

jmps

Nous a quitté
Repose en paix
Re : Comportement étrange avec SendKeys

Bonjour,

Ce "bug" existe depuis bien plus longtemps que la version 2007. Je trouve pas mal de références à ça sur différents forums, y compris les KB Microsoft. Ce n'est pas inhérent à Excel, on en parlait déjà pour Access 97 !

Je pense que c'est plus dû à la gestion hardware du clavier pour les touches spéciales (num lock, impr écran, etc...) que les développeurs ont du mal à maîtriser en soft. Même en passant par les API ça ne semble pas évident.

Pour ma part, j'évite le SendKeys au maximum sauf pour des touches normales et quand je ne vois pas d'autre alternative.

Bon week-end.
 

Mic13710

XLDnaute Junior
Re : Comportement étrange avec SendKeys

Je ne suis pas non plus un adepte du SendKeys et c'est même la première fois que je l'utilise, ce pourquoi je ne découvre ce bug que maintenant, mais j'ai cherché comment faire pour masquer le ruban 2007/2010 et je n'ai rien trouvé de vraiment convaincant que le SendKeys. Mais peut-être as-tu une solution à me proposer parce que là je sèche.
P.S. : j'ai compris pour les parenthèses : c'est pour pouvoir envoyer une série de touches avec la même instruction. Inutiles donc si une seule touche est envoyée.
 

Mic13710

XLDnaute Junior
Re : Comportement étrange avec SendKeys

Merci MJ13 pour ton code. Il fonctionne bien, mais je ne comprends pas bien l'intérêt d'envoyer 2 fois le numlock. Il y a t'il une raison particulière ?
Parce que le code dans mon message #3 fonctionne impec, et je l'ai même modifié pour n'avoir qu'une seule instruction SendKeys :
Code:
With Application
    If .CommandBars.Item("Ribbon").Height > 80 Then
        Ruban = True
        .SendKeys ("^{F1}{NUMLOCK}")
        DoEvents
    End If
    .ScreenUpdating = False
    .EnableEvents = False
    .DisplayFormulaBar = False
    .DisplayStatusBar = False
    .WindowState = xlMaximized
End With
etc.....
Et pour la fermeture, je n'ai pas rajouté de NUMLOCK puisque comme je le disais dans mon premier message, je n'ai pas de déverrouillage. Le problème ne se pose que pour mon premier SendKeys.

Merci en tout cas pour ton aide et merci aussi à jmps pour ses explications sur le bug.
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Comportement étrange avec SendKeys

Bonjour Mic

Merci pour ton code.

Mais, en général, je fais des tests et quand cela fonctionne chez moi, je poste la solution. Je n'ai pas (ou plutôt plus) le temps de tester toutes les solutions qui existent :eek:.

Bon Week-end :).
 

Mic13710

XLDnaute Junior
Re : Comportement étrange avec SendKeys

Mea culpa MJ13. J'ai repris ton code et c'est toi qui a raison : bien que ça soit surprenant, il faut bien 2 NUMLOCK pour que ça fonctionne.
En effet, j'étais parti du postulat que le pavé numérique était verrouillé au départ, et en effet mon code fonctionne bien pour ça. Et puis j'ai réalisé que ce pavé n'était pas toujours verrouillé (sur les portables avec petits claviers par exemple) et que forcer le verrouillage n'était pas du tout la bonne solution. Or mon code verrouille le pavé quel que soit son état avant la macro.
J'ai donc repris ton code et bingo ! : en fin de macro le pavé est bien restitué dans sont état de départ. C'est incompréhensible mais ça marche.
Le code qui fonctionne dans toutes les situations est bien le tien que j'ai simplement modifié en regroupant les 2 NUMLOCK.
Code à l'ouverture :
Code:
With Application
    If .CommandBars.Item("Ribbon").Height > 80 Then
        Ruban = True
        .SendKeys "^{F1}"
        DoEvents
        .SendKeys ("{NUMLOCK} {NUMLOCK}"), True
    End If
    .ScreenUpdating = False
    .EnableEvents = False
    .DisplayFormulaBar = False
    .DisplayStatusBar = False
    .WindowState = xlMaximized
End With
etc.....
Et à la fermeture :
Code:
With Application
    If .CommandBars.Item("Ribbon").Height < 80 And Ruban Then
        .SendKeys "^{F1}"
        DoEvents
        .SendKeys ("{NUMLOCK} {NUMLOCK}"), True
    End If
etc....
J'avoue que celle là, je ne l'aurais pas trouvée sans ton aide.
Problème résolu.
Merci mille fois et bon WE.

Edit : j'ai rajouté les accolades que j'avais oublié sur les NUMLOCK
 
Dernière édition: