À la suite d'un clic droit, par défaut, Excel affiche à la position de la souris la barre de commande "Cell". Cette même barre de commande est affichée lorsque la touche Menu est enfoncée, mais cette fois, `;à la position du "caret", le trait vertical qui clignote dans la cellule sélectionnée. Désolé, mais je n'ai pas trouvé de traduction française convaincante pour "caret".
C'est exactement cette fonctionnalité que je souhaite implanter pour les menus contextuels d'une application qui sera utilisée par des personnes voyantes, mal voyantes ou aveugles, ces dernières utilisant un lecteur d'écran, par exemple JAWS ou NVDA.
Sur les feuilles où des menus contextuels sont prévus, j'ai d'abord tenté de modifier temporairement la barre de commandes "Cell", mais il ne semble pas possible de prendre complétement le contrôle de cette barre de commandes, Excel y rétablissant à la volée des items que j'y avais désactivés, notamment ceux liés au Copier/Coller.
Je me suis donc tourné vers une barre de commande personnalisée de type msoBarPopup qu'il est facile d'afficher à la position de la souris en interceptant le clic droit. Par contre, à partir du clavier, je ne parviens pas à faire afficher ce PopUp à la position du caret. Or, il s'avère qu'afficher ce menu près du point d'intérêt est primordial pour les personnes qui ont un champ visuel restreint et pour qui l'usage de la souris est difficile ou impossible.
-J'utilise Application.OnKey pour associer la macro d'affichage de mon menus contextuel à la touche Alt + FlècheBas. Lorsque la touche est enfoncée, la méthode ShowPopup de l'objet CommandBar affiche la barre de commandes à la position de la souris, ce qui est normal lorsqu'on ne spécifie pas un endroit particulier. Pour afficher à la position du caret, il faut préciser sa position sur l'écran. Les coordonnées du caret peuvent être obtenues de l'APi getcaretpos. Elles sont en pixels, mais relatives au coin supérieur gauche de la grille Excel. Pour qu'elles soient utilisables par ShowPopUp, il faut les corriger pour qu'elles s'expriment par rapport au coin supérieur gauche de l'écran. Le problème est donc maintenant de déterminer les coordonnées d'écran absolues en pixels du coin supérieur gauche de la grille Excel.
En 2017, un fil de discussion intitulé "Positionner-curseur-cellule-selectee" à traité de ce problème. J'ai lu avec grand intérêt une bonne partie des 56 pages de cette discussion, mais il m'a été impossible de retracer le code final permettant de déterminer les coordonnées d'écran du coin supérieur gauche de la grille Excel, ou, alternativement, celles d'un point arbitraire d'une cellule. Ce code existe-t-il et, le cas échéant, où puis-je le trouver ?
À défaut de connaître la position absolue de la grille Excel, on connaît celle de l'application. Dans le code suivant, c'est ce référentiel que l'API ClientToScreen utilisera pour corriger partiellement les coordonnées retournées par getcaretpos. Le décalage horizontal et vertical par rapport au caret est sans doute entièrement dû aux dimensions des structures précédant la grille Excel. Une autre piste serait de réduire ce décalage en tenant compte de la taille de ces objets.
Auriez-vous des suggestions pour trouver une solution à ce problème.
Merci à l'avance.
Pour expérimenter ce code, tout mettre dans un module standard, exécuter PrepareMenuContextuel, se déplacer vers une cellule quelconque puis faire ALT + FlècheBas.
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 Type POINTAPI : x As Long : y As Long : End Type Private Declare PtrSafe Function GetCaretPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare PtrSafe Function ClientToScreen Lib "user32.dll" ( _ ByVal hwnd As Long, ByRef lpPoint As POINTAPI) As Long Dim PositionCaret As POINTAPI Sub PrepareMenuContextuel() Dim CB As CommandBar, CBC As CommandBarControl On Error Resume Next Application.CommandBars("RegDon").Delete On Error GoTo 0 Application.OnKey "%{DOWN}", "AfficherMenuContextuel" Set CB = Application.CommandBars.Add( _ Name:="RegDon", Position:=msoBarPopup, Temporary:=True) Set CBC = CB.Controls.Add(Type:=msoControlButton, before:=1, temporary:=True) CBC.BeginGroup = True CBC.Style = msoButtonCaption CBC.Caption = "Premier choix" CBC.OnAction = "Choix_1" CBC.Enabled = True ' Set CBC = CB.Controls.Add(Type:=msoControlButton, before:=2, temporary:=True) CBC.BeginGroup = True CBC.Style = msoButtonCaption CBC.Caption = "Deuxième choix" CBC.OnAction = "Choix_2" CBC.Enabled = True Set CBC = Nothing Set CB = Nothing End Sub Sub AfficherMenuContextuel() Dim CX As Variant, CY As Variant Call GetCaretPos(PositionCaret) ClientToScreen Application.hwnd, PositionCaret CX = PositionCaret.X CY = PositionCaret.Y Application.CommandBars("RegDon").ShowPopup CX,CY ' MsgBox "Fenêtre Popup " & CommandBars("RegDon").Left & " " & CommandBars("RegDon").Top End Sub Sub choix_1() MsgBox "(Choix 1) Position de la barre de commande" & vbCRLF _ & "X = " & PositionCaret.X & " Y = " & PositionCaret.Y End Sub Sub choix_2() MsgBox "(Choix 2) Position de la barre de commande" & vbCRLF _ & "X = " & PositionCaret.X & " Y = " & PositionCaret.Y End Sub
Partager