Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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...
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
 
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
 
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.
 
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:
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 ?
 
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
 

Pièces jointes

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.
 
En fait c'est bien en anglais, l'appli windows est : Calculator.exe et je pense est le même quelle soit la langue utilisée.
Cependant pour le savoir il faut rechercher le process Windows . 😉
 
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:
Avec ça, on peut aussi appeler la calculatrice :
VB:
Private Sub Bouton_Calculatrice_Click()

    Application.ActivateMicrosoftApp Index:=0
    
End Sub
Mais idem : si on clique 36 fois sur le CommandButton --> 36 calculatrices
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
467
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…