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!
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.