Faire venir excel devant les autres applications par macro VBA

VIKING30 Messages postés 11 Date d'inscription dimanche 24 juillet 2011 Statut Membre Dernière intervention 14 août 2013 - 8 août 2013 à 22:14
VIKING30 Messages postés 11 Date d'inscription dimanche 24 juillet 2011 Statut Membre Dernière intervention 14 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

---FIN CODE---

5 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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

0
VIKING30 Messages postés 11 Date d'inscription dimanche 24 juillet 2011 Statut Membre Dernière intervention 14 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 !
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
Modifié par cs_Le Pivert le 10/08/2013 à 08:20
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
0
jordane45 Messages postés 38155 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 344
9 août 2013 à 10:45
0
VIKING30 Messages postés 11 Date d'inscription dimanche 24 juillet 2011 Statut Membre Dernière intervention 14 août 2013
Modifié par VIKING30 le 9/08/2013 à 22:17
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

FIN CODE
0
jordane45 Messages postés 38155 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 mai 2024 344
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
0
VIKING30 Messages postés 11 Date d'inscription dimanche 24 juillet 2011 Statut Membre Dernière intervention 14 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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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 !!!!
0
VIKING30 Messages postés 11 Date d'inscription dimanche 24 juillet 2011 Statut Membre Dernière intervention 14 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 !
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
11 août 2013 à 07:58
Pour utiliser l'UserForm voir ce site:

http://silkyroad.developpez.com/VBA/UserForm/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
14 août 2013 à 19:02
0
VIKING30 Messages postés 11 Date d'inscription dimanche 24 juillet 2011 Statut Membre Dernière intervention 14 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 !
0
Rejoignez-nous