Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Focus dans un MsgBox

  • Initiateur de la discussion Initiateur de la discussion thilam
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

T

thilam

Guest
Bonjour à tous,
j'ai une icone dans la barre d'outil qui déclenche une macro se terminant par l'affichage d'un MsgBox. Je voudrais que le pointeur de souris se positionne sur le bouton OK du MsgBox (il reste sur l'icone de la barre d'outils). A priori on ne peut pas utiliser setfocus puisque l'objet MsgBox n'est pas identifié (en tout cas je ne sais pas comment).
Je précise que le positionnement automatique du pointeur est activé au niveau du gestionnaire de souris et que ça fonctionne.
L'un de vous a-t-il une solution?
Merci
Th
 
Re : Focus dans un MsgBox

Bonjour,

Je ne comprends pas... Je viens de le faire.... Si j'ai un bouton de barre d'outils qui me lance un code dans lequel j'ai un MsgBox ; lorsque ce MsgBox est affiché, le focus est déjà sur le bouton OK (même si l'on ne voit pas le curseur) puisque si j'appuie sur Entrée, je sors de ce MsgBox...

Cordialement
 
Re : Focus dans un MsgBox

Ok, je vois ce que tu veux dire. Ce que je voudrais c'est pouvoir faire un click gauche sans devoir déplacer la souris. Plus que le focus, c'est le pointeur de la souris que j'aimerais positionner sur le bouton OK. C'est du détail mais ça m'intéresse de savoir si c'est possible.
 
Re : Focus dans un MsgBox

Bonjour,

Une solution avec les 2 codes suivants

1) Premier code à copier dans un module standard (CE CODE N'A PAS A ETRE ADAPTE on le laisse tel quel)
Code:
Private Declare Function FindWindow& Lib "user32" _
  Alias "FindWindowA" (ByVal lpClassName As String, _
  ByVal lpWindowName As String)
Private Declare Function SetTimer& Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent As Long, _
  ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Declare Function GetWindowText& Lib "user32" _
  Alias "GetWindowTextA" _
  (ByVal hwnd As Long, ByVal lpString As String, _
   ByVal cch As Long)
Private Declare Function GetWindowRect& Lib "user32" _
  (ByVal hwnd As Long, lpRect As RECT)
Private Declare Function SetCursorPos& Lib "user32" _
  (ByVal x As Long, ByVal y As Long)

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private OnTimer As Long
Private DECALH As Long
Private DECALV As Long
Private TITRE_MSGBOX As String
  
'___________________________
Private Sub API_PointeurSourisMsgBox()
Dim HwndMsgBox&
HwndMsgBox& = FindWindow(vbNullString, TITRE_MSGBOX)
Dim Ch$
Dim Tampon&
Dim reponse&
Dim R As RECT
Ch$ = Space(1024)
Tampon& = Len(Ch$)
reponse& = GetWindowText(HwndMsgBox&, Ch$, Tampon&)
Ch$ = Trim(Replace(Ch$, Chr$(0), ""))
If Ch$ = TITRE_MSGBOX Then
  reponse& = GetWindowRect(HwndMsgBox&, R)
  reponse& = SetCursorPos(((R.Left + R.Right) / 2) + DECALH, ((R.Top + R.Bottom) / 2) + DECALV)
  Call OffTimer
End If
End Sub
'___________________________
Public Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf API_PointeurSourisMsgBox)
End Sub
'___________________________
Private Sub OffTimer()
If OnTimer& > 0 Then
  OnTimer& = KillTimer(0&, OnTimer&)
  OnTimer& = 0
End If
End Sub
'___________________________
Public Sub PointeurSourisMsgBox(TitreMsgBox As String, DecalageH As Long, DecalageV As Long)
TITRE_MSGBOX = TitreMsgBox
DECALH = DecalageH
DECALV = DecalageV
OnTimer& = 0
Call RunTimer(Delai:=0)
End Sub

2) Deuxième code (qu'il faudra adapter) à copier dans un autre module standard
Code:
'####################################################################################
'###  Pointeur de la souris sur le bouton OK - Un exemple avec 3 MsgBox           ###
'###              La Sub "PointeurSourisMsgBox" a 3 arguments                     ###
### 1) TitreMsgBox - le titre de la MsgBox (par défaut "Microsoft Excel")        ###
'### 2) DecalageH - décalage horizontal pour bien situer le pointeur de la souris ###
'### 3) DecalageV - décalage horizontal pour bien situer le pointeur de la souris ###
'####################################################################################

'___________________________
Sub test_pmo()
  '*** Votre traitement ***
  
'///// à ajouter avant la 1ère MsgBox ////
Call PointeurSourisMsgBox( _
    TitreMsgBox:="Microsoft Excel", DecalageH:=0, DecalageV:=28)
MsgBox "Bonjour"
'/////////////////////////////////////////

  '*** Suite de votre traitement ***
  
'///// à ajouter avant la 2ème MsgBox ////
Call PointeurSourisMsgBox( _
    TitreMsgBox:="Test      ''PointeurSourisMsgBox''", DecalageH:=0, DecalageV:=45)
MsgBox prompt:="Ceci est un essai pour illustrer ''PointeurSourisMsgBox''" & vbCrLf & vbCrLf & _
               "Le pointeur de la souris doit se trouver sur le bouton OK." & vbCrLf & vbCrLf, _
       Title:="Test      ''PointeurSourisMsgBox''"
'/////////////////////////////////////////

  '*** Suite de votre traitement ***
  
'///// à ajouter avant la 3ème MsgBox ////
Call PointeurSourisMsgBox( _
    TitreMsgBox:="Dernier test ''PointeurSourisMsgBox''", DecalageH:=-85, DecalageV:=69)
MsgBox prompt:="Un dernier essai." & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & _
               "Le pointeur de la souris doit se trouver sur le bouton OUI." & vbCrLf & vbCrLf, _
       Title:="Dernier test ''PointeurSourisMsgBox''", _
       Buttons:=vbYesNoCancel + vbCritical
'/////////////////////////////////////////

End Sub

Ce dernier code n'est qu'un exemple pour illustrer.
Pour votre usage, il suffit de mettre, avant chaque MsgBox de votre programme, la ligne de code suivante
Call PointeurSourisMsgBox(TitreMsgBox:="toto", DecalageH:=-85, DecalageV:=69)
en adaptant TitreMsgBox avec le titre de la MsgBox (par défaut : "Microsoft Excel") puis en faisant tourner
votre programme afin de peaufiner les paramètres DecalageH et DecalageV, qui acceptent des entiers positifs ou négatifs,
pour que le pointeur de la souris soit bien à l'endroit désiré (voir l'exemple en pièce jointe).

Pour faire un essai, lancez la macro test_pmo. Bon courage.

Cordialement.

PMO
Patrick Morange
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…