Focus sur la fenetre pointee

Bonjour a tous, je me demande si lorsqu'on a 2 fenetre il est possible d'activer la fenetre sur la quel le pointeur de souris se trouve. Y a t-il un evennement qui existe pour ca?

Bonsoir,

Question trop imprécise.

Tu peux toujours activer un objet activable en utilisant son nom ou son numéro d'index dans la collection à laquelle il appartient.

Ceci étant, l'objet Window n'est pas à privilégier, hormis lors de positionnements de l'interface utilisateur. De même l'action activer, généralement inutile pour VBA ne sert aussi utilement que pour permettre à l'utilisateur de voir, si besoin de voir il y a.

Il serait donc plus opportun que tu indiques la véritable nature de ton problème.

Cordialement.

Salut, Je ne comprend pas tres bien tes explications.

Voici mon objectif ultime: dans excel j'ai 2 fenetres. Il y a donc seulement une fenetre active a la fois. Si par exemple la fenetre de droite est active et que j'ai des boutons sur la fenetre de droite, je dois faire 2 clic pour activer un bouton, le premier servant a activer la fenetre de droite. Y a t-il un moyen d'eliminer le premier clic?

Deux fenêtres ou une fenêtre fractionnée ? Même classeur dans les deux ou deux classeurs différents ? Le cas échéant même feuille ou deux feuilles différentes ?

Difficile de se prononcer sur ce qu'il est possible de faire hors contexte... Ton premier clic active, le second te permet d'intervenir, c'est toujours le cas dans une action manuelle. Savoir si un évènement antérieur peut permettre d'activer préalablement, implique que tu soies toujours dans la même configuration lorsque tu veux cliquer sur ton bouton (et qu'il y ait un évènement interceptable...)

Dans un autre sens, si tu n'actives que pour aller cliquer sur le même bouton, il est possible d'intercepter cette activation pour lancer la procédure liée au bouton, ce qui économiserait le clic sur le bouton.

Le problème dans ce genre de manipulations est de veiller à prévoir tous les cas possibles de façon que l'action voulue se déclenche quand elle le doit mais pas quand elle serait inopportune.

Difficile de te faire une réponse simple sur un problème de ce type...

2 fenetres du meme classeur, disons par exemple la fenetre de gauche est la feuille1 et celle de droite la feuille 2. Si j'ai un bouton sur la feuille de gauche et la fenetre de droite est active, alors il me faut un premier clic pour activer la fenetre de droite et un 2ieme pour declencher le sub du bouton. J'ai essaye des evenement sur le bouton comme focus, mouse_down, sans succes. J'ai egalement creer un sub evenementiel activate, sans succes.

Ca fonctionne presque, car lorsque mon curseur de souris pointe le bouton de la fenetre de gauche la macro est lancé et le msgbox fonctionne mais la ligne Windows("LOGICIEL 60.xls:1").Activate n'a aucun effet! As-tu une explication?

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Windows("LOGICIEL 60.xls:1").Activate 
MsgBox "mouse move"
End Sub

Tu peux toujours essayer une système de ce type : Feuil1 contient un bouton.

Private Sub CommandButton1_Click()
    MsgBox "oui"
End Sub

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If ActiveSheet.Name <> "Feuil1" Then
        CommandButton1_Click
    End If
End Sub

Au survol du bouton, la fenêtre n'étant pas active, cela déclenche le bouton (sans clic !!), si la fenêtre est active il n'est pas déclenché (il faut cliquer alors).

Mais prudence avec ce genre manip. on n'est jamais à l'abri d'effets inattendus. Et un clic est vite donné, on en fait des milliers dans la journée...

En manipulant un peu ton code, je m'apercoit que ca fonctionne en mode etape par etape mais Excel plante en sortant du sub. J'ai ajouté "Application.EnableEvents = False" sans succes. On y est presque. As-tu une idee du probleme ? J'obtient l'erreur memoire insuffisante, on dirait que ca boucle.

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If ActiveSheet.Name <> "Feuil1" Then
       Windows("LOGICIEL 60.xls:1").Activate 'fenetre principale
       MsgBox "mousemove"
       twowindows5
       Application.EnableEvents = False   'désactive les procédures évènementielles
     ' CommandButton2_Click
    End If
End Sub

Tu n'es pas sur le système que j'ai proposé.

Activer la fenêtre n'est pas une bonne idée, d'une part l'objectif étant d'agir sur le bouton lorsque la fenêtre est inactive, d'autre part le numéro d'index de la fenêtre pouvant changer d'une fois à l'autre, ce n'est pas une donnée stable.

Il n'y a pas lieu de désactiver les évènements si l'évènement cesse d'être pris en charge lorsque la fenêtre devient active.

Enfin, il s'agit de déclencher la procédure liée au bouton (objectif initial) et je ne vois rien de tel. Ah! non pardon, désactivée (mais à ce moment-là ce n'est plus testable). Je ne vois pas non plus ce que signifie twowindows5 : une autre procédure ? qui joue peut-être un rôle parasite alors.

excuses-moi. J'ai repris ton code. Ca fonctionne tres bien. Par contre si je lui ajoute le sub qui est suppose se declenche lors d'un clic sur le bouton, ca plante a l'occasion. J'ai un message disant qu'Excel doit fermé. J'appel ce sub apres le msgbox. je t'envoi egalement le sub Close_Window qui est apele dans mon sub.

Voici le sub:

[code]Sub twowindows5() 'apeler par <2nd>

         Application.ScreenUpdating = False
         Application.EnableEvents = False
       If actif2 = True And actif9 = True Then 'si la fenetre 2nd est deja ouverte, on ferme la fenetre
          Close_Window 'on ferme la 2ieme fenetre
       Exit Sub
       ElseIf actif2 = True Then  'on a une fenetre autre que 2nd d'ouverte
          Close_Window 'on ferme la 2ieme fenetre
       End If

        'on ouvre la fenetre 2nd
         actif2 = True
         actif9 = True
         toggle1 = 1
         Set Oldcel1 = ActiveCell    ' On sauvegarde la position de la cellule active avant de se deplacer
         ActiveWindow.DisplayHorizontalScrollBar = True
         ActiveWindow.DisplayWorkbookTabs = False

         ActiveWindow.NewWindow
         Sheets("ASS").Select 'associe la feuille "ASS" a la nouvelle fenetre
         ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlVertical
         Rows("3:3").Select
         ActiveWindow.FreezePanes = True
         Cells(3, 1).Select
         ActiveWindow.DisplayWorkbookTabs = False
         ActiveWindow.DisplayHeadings = False
         ActiveWindow.DisplayHorizontalScrollBar = True
         ActiveWindow.DisplayVerticalScrollBar = True
         ActiveWindow.zoom = 100
    With ActiveWindow 'fenetre ASS
        .Top = -20
        .Left = 700
        .Width = 560
        .Height = 800
    End With
        Windows("LOGICIEL 60.xls:1").Activate 'fenetre principale
        ActiveWindow.DisplayWorkbookTabs = False
    With ActiveWindow
        .Top = -20
        .Left = 0
        .Width = 700
        .Height = 800
    End With
        Windows("LOGICIEL 60.xls:2").Activate

        Application.EnableEvents = True
        Application.CommandBars(1).Enabled = True  'ces 2 lignes permettent d'eliminer la barre "vide"
        Application.CommandBars(1).Enabled = False

End Sub

[/code]

Sub Close_Window() 'on ferme la windows 2

          actif2 = False
          actif4 = False
          actif6 = False
          actif7 = False
          actif8 = False
          actif9 = False
          actif10 = False
          Windows("LOGICIEL 60.xls:2").Close  ' 2ieme fenetre
    With ActiveWindow
        .Top = -20
        .Left = 0
        .Width = 1260
        .Height = 800
    End With
         'Oldcel1.Select        ' On reprend la position de depart sauvegarde
         ActiveWindow.DisplayHorizontalScrollBar = False
End Sub

Ta macro citée précédemment devrait être :

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If ActiveSheet.Name <> Me.Name Then
       twowindows5
    End If
End Sub

En effet, Feuil1 n'est en principe pas le nom de ta feuille, et cette macro se trouvant dans le module de la feuille concernée qui contient le bouton, on peut appeler son nom directement. Le message était destiné aux fins de test et n'avait d'intérêt que dans la procédure bouton pour vérifier que cela lançait bien la procédure Click. Si twowindows5 est la procédure lancée par le bouton, sans autre élément, tu peux effectivement l'appeler directement, ce qui sera alors strictement équivalent à un clic sur le bouton.

Je ne vois pas pour la suite de relation avec le problème que tu indiques, le curseur n'est pas supposé rester sur le bouton, donc l'évènement n'a aucune raison de se déclencher à répétition.

Pour la procédure déclenchée proprement dite, je ne sais pas comment sont initialisées tes variables actif? ni ce que fait ta procédure Close_Window...

Par contre ce qui me surprend, c'est que la suite du code rétablit une double-fenêtre laissant penser à un retour à la situation de départ (à moins que ce ne soit d'autres feuilles, mais je n'ai pas à entrer dans le détail de tes activités). Il me me semble qu'il faut regarder de plus près d'abord ce que fait cette procédure.

Pour la suite du code, je peux t'assurer que tout fonctionne bien. En fait ce qui se passe avec TwoWindows5 c'est: s'il n'y a pas de 2ieme fenetre, on ajoute la fenetre 2nd, et si on a cette fenetre ou une autre, on l'a ferme (toggle). Mais comme tu dis, ce n'est pas vraiment necessaire que tu saches ca.

j'ai envie d'essayer de lancer un autre sub que Twowindows5, pour verifier si ca va planter.

Je dois te rapeler que dans la version modifie de ton code, si je me mettais en mode etape par etape, ca plantais lorsqu'on sortait de ton sub. Mais je ne sais pas si c'est une piste.

En tout cas, je pense qu'on est pas loin d'une solution car ca ne plante pas a chaque fois!

Quand ça plante pas à chaque fois, c'est pas plus facile à trouver !!!

Finalement, tu as raison.

Je vais essayer d'isoler le probleme. Il semblerait maintenant que ca plante a tout coup, Je t'en redonne des nouvelles.

Merci pour le temps alloué!

Capucin.

Si ça coince toujours demain, j'essaierai de monter un test avec ta procédure (en simplifiant mais pour avoir une procédure de même type).

Bonne nuit.

Salut! j'ai compris le probleme. Apres avoir simplifie au max le sub evenementiel, je me suis apercu visuellement et aussi avec la variable passe que lorsqu'on se deplace sur le bouton, de nouveau evenements sont relancés. Il y avait jusqu'a une centaine de reactivation du sub a chaque fois.Avec un delais, c'est pas mal mieux mais il arrive encore que ca plante et si je met le delais trop long, ca ne vas pas pour le mieux pour l'utilisateur.

J'ignore s'il y a une solution. J'ai essaye des evenement comme focus, mais ca ne marche que si on clic et pour cliquer, il faut un premier clic pour activer la fenetre.

Private Sub CommandButton2_Click()
    twowindows5
End Sub

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

         passe = passe + 1
         Sleep 1000
         'twowindows5
End Sub

Rien vu de tel pour le moment... J'ai commencé un essai et noté que le bouton n'était actif que dans la fenêtre 1, inactif dans l'autre.

Ce qui me chagrine : s'agit-il d'un comportement normal ?

Je poursuivrai plus tard.

Salut, j'ai essaye plein de chose mais sans succes. Ca doit etre une histoire de sub evenementiel dans mon application qui cause probleme. Si tu peux m'envoyer de petit fichier afin que je l'essai et compare, peut etre que ca me mettra sur une piste.

Je t'envoi une capture d'ecran.

2016 02 16 1
Rechercher des sujets similaires à "focus fenetre pointee"