XL 2010 Savoir si la calculatrice est présente ou pas

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

À partir d'un CommandButton que j'ai nommé perspicacement "Bouton_Calculatrice" je peux appeler la calculatrice :
VB:
Private Sub Bouton_Calculatrice_Click()
'CommandButton "Bouton_Calculatrice" permettant d'afficher la calculatrice

Application.ScreenUpdating = False

Dim x
      
     x = Shell("C:\Windows\System32\calc.exe", 1)

Range("C2500").Select: Application.ScreenUpdating = True

End Sub
Mais si, pour des raisons éthyliques, on clique plusieurs fois de suite sur ce même bouton, à chaque fois apparaîtra une nouvelle calculatrice.
Je voudrais tout simplement court-circuiter cet appel si la calculatrice est déjà présente. J'ai tenté ceci sans succès (du reste, je m'y attendais) :
VB:
Private Sub Bouton_Calculatrice_Click()
'CommandButton permettant d'afficher la calculatrice

Application.ScreenUpdating = False

Dim x

    If Not x Is Nothing Then Exit Sub
    x = Shell("C:\Windows\System32\calc.exe", 1)
      
Range("C2500").Select: Application.ScreenUpdating = True

End Sub
Comment s'y prendre ?
 
Dernière édition:
Solution
Bonsoir,

J'ai trouvé ça. C'est simple et, ma foi, ça marche bien pour la calculatrice.
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...

Dranreb

XLDnaute Barbatruc
Bonsoir.
Pour pouvoir la réutiliser ultérieurement, il faudrait que votre variable x soit globale.
Private x As Double. Ce n'est pas un objet et il ne peut par conséquent pas être Nothing
Essayez If x <> 0 then AppActivate x
 

Dranreb

XLDnaute Barbatruc
En effet, contrairement à ce qui est dit dans la doc Microsoft
ça ne marche pas non plus chez moi
En revanche ça ça marche :
VB:
Private Sub Bouton_Calculatrice_Click()
   On Error Resume Next
   AppActivate "Calculatrice"
   If Err Then Shell "C:\Windows\System32\calc.exe", 1
   End Sub
Attention à bien spécifier le titre de la fenêtre de la calculatrice dans votre langue
 

Magic_Doctor

XLDnaute Barbatruc
Merci pour votre réponse,

Je viens d'essayer, je clique plusieurs fois sur le bouton et à chaque fois une nouvelle calculatrice apparaît. Je clique 10 fois --> 10 calculatrices...
Le problème, simple au demeurant, me paraît plus compliqué que prévu.
Savoir si la calculatrice est présente ou pas, ma foi, ce doit être du domaine du possible.
Si la calculatrice est là, alors on court-circuite la macro du CommandButton, afin que d'autres calculatrices n'apparaissent plus si on venait à cliquer sur le CommandButton.
Maintenant, en supposant que l'on ait réglé ce problème (non encore réglé...), on ferme la calculatrice, pour éventuellement la réouvrir, toujours avec le même CommandButton ; il faudrait alors trouver un moyen de signaler que la calculatrice a bien été fermée pour rendre à nouveau opérationnel le CommandButton si on venait à cliquer dessus. Et j'ai l'impression qu'il faut alors passer par les APIs.
En fouinant un peu, j'ai trouvé ceci que j'ai tenté d'essayer – toujours sans succès – mais qui conforte mon impression : ici
Bref, c'est une histoire simple en apparence, mais finalement à la mords-moi-le-nœud.
 

Dranreb

XLDnaute Barbatruc
Je suis assez fortement fondé à penser que vous n'avez pas corrigé comme je disais, et que chez vous il faudrait plutôt :
AppActivate "Calculadora"
Il cherche vraiment dans toutes les applications ouvertes le titre de la fenêtre qu'on a spécifié. Alors si ça provoque une erreur même quand la calculatrice est ouverte ça doit être parce que vous avez laissé "Calculatrice" alors que sa fenêtre ne porte pas ce titre chez vous.
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Effectivement, cette fois-ci ça marche. La calculatrice n'apparaît qu'une seule fois, même si on clique 36 fois sur le CommandButton. Et quand on la ferme, le CommandButton la rappelle.
Maintenant, la question à 1 millón de pesos : si on utlise ce fichier en France, est-ce que ça marchera ?
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Peut-être un scan des processus actifs ?
VB:
Option Explicit

Sub test()
    MsgBox CalculatriceActive
End Sub

'------------------------------------------
'Retourne VRAI si calc.exe est présent dans
'les processus du Gestionnaire de Tâches
'------------------------------------------
Function CalculatriceActive() As Boolean
    Dim T() As Variant
    Dim i As Integer
   
    T = TaksManagerProcessIDList
   
    For i = 1 To UBound(T, 1)
        If T(i, 1) = "calc.exe" Then Exit For
    Next i
   
    If i <= UBound(T, 1) Then CalculatriceActive = True    
End Function

'--------------------------------------------------
'Retourne un tableau des noms de programmes du
'Gestionnaire de tâches et leur process ID associés
'--------------------------------------------------
Function TaksManagerProcessIDList() As Variant()
    Dim Process As Object
    Dim T() As Variant
   
    For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
        If Not (Not T) Then
            ReDim Preserve T(1 To 2, 1 To UBound(T, 2) + 1)
        Else
            ReDim T(1 To 2, 1 To 1)
        End If
       
        T(1, UBound(T, 2)) = Process.Caption
        T(2, UBound(T, 2)) = Process.ProcessId
    Next
   
    TaksManagerProcessIDList = Application.Transpose(T)
End Function
 

sylvanu

XLDnaute Barbatruc
Supporter XLD

Pièces jointes

  • ListAppli.xlsm
    18.8 KB · Affichages: 16

Magic_Doctor

XLDnaute Barbatruc
Bonjour tout le monde,

Merci pour vos interventions. Finalement, c'est bien compliqué pour si peu, et tout ça à cause d'une histoire de langues. La programmation ne devrait être qu'en anglais, comme l'anatomie en latin (ce que font les Anglo-Saxons) ou encore les poids & mesures en SI (ce que ne font pas les Anglo-Saxons). Ça simplifierait la vie et la compréhension.
 

patricktoulon

XLDnaute Barbatruc
bonsoir
en fr et us windows c'est "calc.exe"

la même fonction lance OU ferme la calculatrice
VB:
Sub test()
    calculatrice
End Sub

Function calculatrice()
Dim Process As Object, x As Boolean
    For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
        If Process.Caption = "calc.exe" Then
            Process.Terminate: Exit Function
        End If
    Next
     Shell "C:\Windows\System32\calc.exe", 1
End Function

PRAtique dans un bouton du ruban perso ;) pour faire des calculs non prévus dans des formules
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 811
dernier inscrit
caroline29260