XL 2010 "xlMaximized" une application

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'avoue que le titre n'est pas très explicite. J'expose donc le problème.
Au moyen d'une icône à laquelle est affectée cette macro :
VB:
Sub BlocNote()
'Appelle le Bloc Note
    Shell "c:\windows\system32\notepad.exe", vbNormalFocus  'ouvre le Bloc Note & l'affiche à l'écran
End Sub
j'ouvre le Bloc Note.
Je clique sur la feuille, tout naturellement le Bloc Note vient se ranger dans la barre des tâches.
Si je veux récupérer le Bloc Note, je dois faire apparaître la barre des tâches et cliquer sur l'icône du Bloc Note.
Peut-on, directement à partir de la feuille, en cliquant sur un bouton que l'on appellerait "Montrer le Bloc Note" faire apparaître le Bloc Note sans devoir passer par la barre des tâches ? J'ai un peu tout essayé, mais je n'y suis pas arrivé.
 
Solution
Re,

En effet, ça marche. Je m'y étais mal pris.
Comme depuis la feuille je peux appeler la calculatrice ou le Bloc Note, j'ai écrit ceci qui marche bien.
La fonction qui détecte s'il y a plus d'une application du même nom ouverte :
VB:
Function IsProcessRunning(process As String) As Boolean
'********************************************************************************************
'Vérifie si une application est ouverte
'https://stackoverflow.com/questions/29807691/determine-if-application-is-running-with-excel
'********************************************************************************************
'- process : le nom de l'application (ex : "calc.exe" --> calculatrice Windows)

    Dim objList As Object
    
    Set objList =...

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour Magic_Doctor, le forum

En référençant l'Id de ton shell, tu peux ensuite l'appeler directement avec appactivate.

Cordialement, @+
VB:
Dim Notepad_Id
Sub BlocNote()
    'Appelle le Bloc Note
    Notepad_Id = Shell("c:\windows\system32\notepad.exe", vbNormalFocus) 'ouvre le Bloc Note & l'affiche à l'écran
End Sub

Sub Afficher_Notepad()
    AppActivate Notepad_Id
End Sub
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour Bernard_XLD,

J'avais bien tenté ce que tu proposes, mais voilà, chaque fois que j'appelle le Bloc Note, je me retrouve avec un NOUVEAU Bloc Note. On peut se retrouver ainsi avec un paquet de Blocs Note ouverts et c'est ce que je veux éviter.
Pour ce faire, quand j'appelle le Bloc Note (aucun Bloc Note est déjà ouvert), pour bloquer l'ouverture d'un nouveau Bloc Note, j'ai mis ceci :
VB:
Function IsProcessRunning(process As String) As Boolean
'********************************************************************************************
'Vérifie si une application est ouverte
'https://stackoverflow.com/questions/29807691/determine-if-application-is-running-with-excel
'********************************************************************************************
'- process : le nom de l'application (ex : "calc.exe" --> calculatrice Windows)

    Dim objList As Object
    
    Set objList = GetObject("winmgmts:") _
        .ExecQuery("select * from win32_process where name='" & process & "'")
    
    IsProcessRunning = objList.Count > 0
End Function
Et, dans la macro qui lance le Bloc Note :
VB:
Sub BlocNote()
'Appelle le Bloc Note

    If IsProcessRunning("notepad.exe") Then Exit Sub  'si le Bloc Note est déjà ouvert on sort
    Shell "c:\windows\system32\notepad.exe", vbNormalFocus  'ouvre le Bloc Note & l'affiche à l'écran
End Sub
Ainsi, je me retrouve toujours qu'avec un seul et même Bloc Note, même si je déclenche plusieur fois la macro.
Est-ce alors possible de pouvoir, depuis la feuille, "maximiser" le Bloc Note qui se trouve dans la barre des tâches ?
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
re,

tu n'as pas du essayer les codes que je t'ai donné, appactivate ne fait qu'activer et afficher l'application, elle n'ouvre pas une nouvelle instance, cela fait exactement ce que tu demandes ou alors je n'ai rien compris.
testes sur le fichier joint, lance la macro Blocnote, cela ouvre une instance notepad
reviens sur le fichier excel
lance la macro activer_notepad, ton notepad s'affiche et il n'y en a toujours qu'une seule instance, facile à vérifier.
Ce mode de fonctionnement entre shell et appactivate est d'ailleurs bien précisé sur le site de microsoft
https://docs.microsoft.com/fr-fr/of...nce/user-interface-help/appactivate-statement
Je te mets un fichier de test en pièce jointe

Cordialement, @+
 

Pièces jointes

  • Test_Magic.xlsm
    11.7 KB · Affichages: 1

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
re,

et voila ta macro de lancement modifiée
et tu devrais aussi pouvoir te passer de ta fonction en testant Notepad_Id (édition: ce serait sans doute mieux d'ailleurs, référençant l'instance lancée par le shell au vba de l'application sans s'occuper d'une instance préexistante ou utilisée par une autre appli]

VB:
Public Notepad_Id
Sub BlocNote()
'Appelle le Bloc Note

    If IsProcessRunning("notepad.exe") Then
        AppActivate Notepad_Id
    Else
        Notepad_Id = Shell("c:\windows\system32\notepad.exe", vbNormalFocus)   'ouvre le Bloc Note & l'affiche à l'écran
    End If
End Sub
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re,

En effet, ça marche. Je m'y étais mal pris.
Comme depuis la feuille je peux appeler la calculatrice ou le Bloc Note, j'ai écrit ceci qui marche bien.
La fonction qui détecte s'il y a plus d'une application du même nom ouverte :
VB:
Function IsProcessRunning(process As String) As Boolean
'********************************************************************************************
'Vérifie si une application est ouverte
'https://stackoverflow.com/questions/29807691/determine-if-application-is-running-with-excel
'********************************************************************************************
'- process : le nom de l'application (ex : "calc.exe" --> calculatrice Windows)

    Dim objList As Object
    
    Set objList = GetObject("winmgmts:") _
        .ExecQuery("select * from win32_process where name='" & process & "'")
    
    IsProcessRunning = objList.Count > 0
End Function
Pour la calculatrice :
VB:
Calculatrice_Id

Sub Calculatrice()
'Appelle la calculatrice Windows
'Magic_Doctor / Bernard_XLD

    If IsProcessRunning("calc.exe") Then Afficher_Calculatrice: Exit Sub  'si la calculatrice est déjà ouverte, elle s'affiche et on sort
    Calculatrice_Id = Shell("c:\windows\system32\calc.exe", vbNormalFocus) 'ouvre la calculatrice Windows
End Sub
VB:
Sub Afficher_Calculatrice()
'Bernard_XLD
    AppActivate Calculatrice_Id
End Sub
Pour le Bloc Note :
VB:
Notepad_Id

Sub BlocNote()
'Appelle le Bloc Note ("IconeBlocNote")
'Magic_Doctor / Bernard_XLD
  
    If IsProcessRunning("notepad.exe") Then Afficher_Notepad: Exit Sub  'si le Bloc Note est déjà ouvert, il s'affiche et on sort
    Notepad_Id = Shell("c:\windows\system32\notepad.exe", vbNormalFocus) 'ouvre le Bloc Note & l'affiche à l'écran
End Sub
VB:
Sub Afficher_Notepad()
'Bernard_XLD
    AppActivate Notepad_Id
End Sub
Un grand merci pour ton aide.
Buenas noches
 

Statistiques des forums

Discussions
312 104
Messages
2 085 332
Membres
102 864
dernier inscrit
abderrashmaen