Faire venir excel devant les autres applications par macro VBA
VIKING30
Messages postés11Date d'inscriptiondimanche 24 juillet 2011StatutMembreDernière intervention14 août 2013
-
8 août 2013 à 22:14
VIKING30
Messages postés11Date d'inscriptiondimanche 24 juillet 2011StatutMembreDernière intervention14 août 2013
-
14 août 2013 à 22:16
Bonjour à tous,
Je travaille sur le code ci dessous dans Excel2003 dans le but de fermer un fichier Excel inutilisé depuis 1 minute. Le code est contenu dans le fichier Excel à fermer. La version "brutale"(thisworkbook.FermeFichier) fonctionne bien mais je désire poser une question avant de fermer.(thisworkbook.Interroger)
Je rencontre 2 problèmes :
1) si l'utilisateur est passé à une autre application, ma question est cachée par celle ci et il faudrait donc que j'oblige Excel à passer devant toutes les applis !
2) si l'utilisateur ne répond pas à la question qui lui est posée (msgbox reste ouverte et attend la réponse donc bloque le déroulement du code macro) alors j'aimerais que cette msgbox se ferme et passer à la version "brutale" qui ferme le fichier après enregistrement du fichier
---DEBUT CODE PRESENT DANS ThisWorkbook---
Sub Minuteur() 'ferme le fichier si inutilisé pendant 1 minute
'Application.OnTime Now + TimeValue("00:01:00"), "thisworkbook.FermeFichier", False
Application.OnTime Now + TimeValue("00:01:00"), "thisworkbook.Interroger", False
End Sub
Sub FermeFichier()
If Application.Wait(Now + TimeValue("00:00:15")) Then 'après un délai de 15 secondes
ThisWorkbook.Close savechanges:=True
End If
End Sub
Public Sub Interroger()
Réponse = MsgBox("Ce fichier se fermera dans 15 secondes. Acceptez-vous ?", vbYesNo)
Select Case Réponse
Case vbNo
Minuteur
Exit Sub
Case Else
FermeFichier
Exit Sub
End Select
End Sub
Private Sub Workbook_Open()
Minuteur
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
Minuteur
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
Minuteur
End Sub
cs_Le Pivert
Messages postés7903Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention11 mars 2024137 9 août 2013 à 08:11
Bonjour,
Pour la 2ème question tu peux obliger l'utilisateur à répondre en supprimant la croix de fermeture comme cela:
Dim Rep As Integer
Rep = MsgBox("Voulez-vous continuez ?", vbYesNo + vbQuestion, "Mon appli")
If Rep = vbYes Then
' ici le traitement si réponse positive
' ...
Else
' ici le traitement si réponse négative
' ...
End If
VIKING30
Messages postés11Date d'inscriptiondimanche 24 juillet 2011StatutMembreDernière intervention14 août 2013 9 août 2013 à 21:48
Merci pour ton aide
la fenêtre ne disparait plus si je mets vbYesNo + vbSystemModal
à la condition expresse qu'Excel sot la fenêtre active
Mais si l'utilisateur est sur une autre appli Excel se contente de clignoter sur la barre des taches
Et s'il n'est plus devant son écran pas de fermeture puisque la procédure en cours bloque tout !
Je te propose de faire un msgBox avec un UserForm. De cette façon ton message se fermera quand tu le désireras. voici le code:
Option Explicit
Private Sub UserForm_Activate()
Dim dtDate As Date
dtDate = Now()
Do Until (Now() - dtDate) > (1 / 24 / 60 / 60 * 5) 'Boucle d'attente de 5 secondes
DoEvents 'Permet à l'utilisateur de cocher la case
Loop
Unload Me 'Effacer le formulaire
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then Cancel = True
End Sub
Je te laisse le soin d'ajouter les button Yes et No avec les procédures qui vont avec
J'ai lu ce que tu m'as envoyé et j'ai lancé ce code à partir d'un fichier Excel.
le code fonctionne et positionne Internet Explorer devant
mais je n'arrive pas à comprendre ce qu'il va chercher (IEframe)
Moi je désire qu'Excel revienne au top : Que dois-je modifier ?
Merci pour ton aide.
DEBUT CODE
Option Explicit
Private Declare Function BringWindowToTop Lib "user32" (ByVal _
hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName _
As Any) As Long
Public Sub IEFrameToTop()
Dim THandle As Long
THandle = FindWindow("Ieframe", vbEmpty)
If THandle = 0 Then
MsgBox "Impossible de trouver la fenêtre.", vbOKOnly
Else
BringWindowToTop THandle
End If
End Sub
jordane45
Messages postés38155Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention 4 mai 2024344 9 août 2013 à 23:03
IEfram, c'est ce que l'utilisateur voulait mettre au premier plan... n gros c'est le nom de sa fenetre....
Il faut que toi tu mettes celui qui t'interesse
Il ne faut pas seulement faire du copier/coller... il faut comprendre le code que l'on recupere et l'adapter a ses besoins...
Les autres utilisateurs n'ont pas toujours fais la même chose que ce que vous cherchez à faire, mais leurs codes peuvent s'en rapprocher
VIKING30
Messages postés11Date d'inscriptiondimanche 24 juillet 2011StatutMembreDernière intervention14 août 2013 9 août 2013 à 23:16
Salut jordane45 et merci de ton aide
Je suis "autodidacte" en VBA et j'ai essayé de comprendre le code (ce n'est pas qu'un copié collé car il y avait des mots traduits au milieu) malheureusement je n'ai pas tout pigé !
Est ce que tu veux dire qu'il faut que je récupère le nom qui est au dessus de ma fenêtre par un code du style
thisworkbook.name (qui me donne le nom du fichier mais pas le reste)
Faut pas croire, j'ai déjà dû passer plusieurs heures sur ce code et là je cale ! Lorsqu'il sera finalisé j'en ferai profiter tout le monde à qui ça peut servir.
cs_Le Pivert
Messages postés7903Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention11 mars 2024137 10 août 2013 à 08:18
Je te propose de faire un msgBox avec un UserForm. De cette façon ton message se fermera quand tu le désireras. voici le code:
Option Explicit
Private Sub UserForm_Activate()
Dim dtDate As Date
dtDate = Now()
Do Until (Now() - dtDate) > (1 / 24 / 60 / 60 * 5) 'Boucle d'attente de 5 secondes
DoEvents 'Permet à l'utilisateur de cocher la case
Loop
Unload Me 'Effacer le formulaire
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then Cancel = True
End Sub
Je te laisse le soin d'ajouter les button Yes et No avec les procédures qui vont avec
bonne programmation.
cs_Le Pivert
Messages postés7903Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention11 mars 2024137 10 août 2013 à 08:38
Excusez ce doublon, je n'ai pas encore compris la façon de répondre au message qui concerne une question particulière. Je ne me décourage pas, cela va venir !!!!
VIKING30
Messages postés11Date d'inscriptiondimanche 24 juillet 2011StatutMembreDernière intervention14 août 2013 10 août 2013 à 21:44
Merci beaucoup cs_Le Pivert
Déjà, je le sens bien ! L'idée d'une userbox me séduit et je crois que j'ai déjà utilisé cela dans un autre projet !
Pour l'instant, je m'étais bloqué sur la msgbox et ne savais comment la fermer ! Je tenais à la faire réapparaitre pour lui envoyer un "Enter" avec un sendkeys !
Je m'envoie ce code au boulot, je teste ça dés lundi et je te tiens au courant !
cs_Le Pivert
Messages postés7903Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention11 mars 2024137 11 août 2013 à 07:58
VIKING30
Messages postés11Date d'inscriptiondimanche 24 juillet 2011StatutMembreDernière intervention14 août 2013 14 août 2013 à 22:16
Salut CerberusPau et merci
J'ai testé ton fichier et ça fonctionne (sans Beethoven pour l'instant ! J'essayerais bien la musique de Mission Impossible)
Il me faudra le mettre à ma sauce au boulot avec un EXCEL 2003 et tester toutes les options que je veux proposer : Fermer avec enregistrement , Fermer sans enregistrement ou obtenir plus de temps.
L'avantage de ton programme sur tout ce que j'ai essayé auparavant est qu'il ramène Excel sur le devant de la scène !
9 août 2013 à 21:48
la fenêtre ne disparait plus si je mets vbYesNo + vbSystemModal
à la condition expresse qu'Excel sot la fenêtre active
Mais si l'utilisateur est sur une autre appli Excel se contente de clignoter sur la barre des taches
Et s'il n'est plus devant son écran pas de fermeture puisque la procédure en cours bloque tout !
Modifié par cs_Le Pivert le 10/08/2013 à 08:20
Je te laisse le soin d'ajouter les button Yes et No avec les procédures qui vont avec
bonne programmation