Problème applications excel ouvertes [Résolu]

Messages postés
14
Date d'inscription
lundi 9 septembre 2013
Statut
Membre
Dernière intervention
22 septembre 2013
- - Dernière réponse : cs_Le Pivert
Messages postés
6027
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2019
- 16 sept. 2013 à 07:47
Bonjour,

Alors voilà, j'ai fait une macro il y a quelques jours pour analyser des données qui me sont fournies par une autre macro. Le problème est que cette autre macro ne peut se lancer qu'une fois toutes les autres applications excel fermées (il y a un contrôle effectué qui empêche le lancement s'il en détecte d'autres). Le problème est que depuis que j'ai fait ma "macro d'analyse", la première ne veut plus se lancer car elle détecte à chaque fois d'autres applications excel ouvertes or pour moi, toutes les autres sont fermées (j'ai même essayer en fermant le processus excel et en ne redémarrant que le programme). je suis donc maintenant bloqué et ce depuis la première utilisation de la seconde macro. Y-a-t-il un moyen de savoir quelle est l'autre application qu'il détecte ? Et comment faire pour la fermer ? Faut-il "cloturer" une macro avec autre chose que le end sub pour qu'elle ne soit plus considérée par excel comme ouverte ?

En remerciant par avance.

Allan
Afficher la suite 

7 réponses

Messages postés
25568
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 mai 2019
364
0
Merci
Bonjour,

- Vous nous parlez de Macro mais vous ne nous les montrez pas. Peut-être y a t'il quelque chose qui bloque dedans...
- Est-ce que si vous redémarrez votre poste, le souci persiste ?
- Quel est le message d'erreur que vous rencontrez ?
- Dans l'une de vos macros, utilisez-vous une instruction WorkBook.open ?
- Ouvrez-vous un fichier (même texte) dans l'une de vos macros ?


NB: Vous faites des Macro Excel... Donc du VBA... Pas de VB.NET ! (attention où vous postez vos messages sur le forum ! )
A LIRE
Messages postés
6027
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2019
86
0
Merci
Bonjour,

voici un petit code qui affiche le nom des classeurs ouvert.


Option Explicit
Private Sub CommandButton1_Click()
'test pour connaitre le nombre de classeur ouvert
 Dim NombreClasseur As Integer
 NombreClasseur = Workbooks.Count
If NombreClasseur > 1 Then
BoucleClasseurs
End If
End Sub
Sub BoucleClasseurs()
    'Définit une variable qui va représenter un classeur à chaque itération.
    Dim Wb As Workbook
     'Boucle sur chaque classeur de l'application Excel
    For Each Wb In Application.Workbooks
        'Ecrit le nom de chaque classeur dans la fenêtre d'exécution Ctrl+G
       MsgBox Wb.Name
    Next Wb
End Sub


Si cela peut t'aider à fermer le classeur ouvert!
Messages postés
25568
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 mai 2019
364
0
Merci
Bonjour,

Et au cas où ton Excel est paramétré pour ouvrir chaque classeur dans un process différent, voici un code qui te permettra de "killer" tous les process Excel sauf celui en cours d'utilisation (celui d'où tu lance cette macro )

Declare Function GetCurrentProcessId Lib "kernel32" () As Long

Function getProcessInfoXL()
Dim Tbl_Process()
Dim x As Integer

''On Error Resume Next
Dim objProcess, process, strNameOfUser
ComputerName = "."
Set objProcess = GetObject("winmgmts:{impersonationLevel=impersonate}\" _
      & ComputerName & "rootcimv2").ExecQuery("Select * From Win32_Process")
For Each process In objProcess
    If process.Name <> "System Idle Process" And process.Name <> "System" Then
        
        If InStr(1, process.Name, "EXCEL") Then
            x = x + 1
            ReDim Preserve Tbl_Process(1 To 2, 1 To x)
            Tbl_Process(1, x) = process.processId
            Tbl_Process(2, x) = process.Name
        End If
    End If
Next
Set objProcess = Nothing
getProcessInfoXL = Tbl_Process
End Function

Sub test()


Dim ListXLProcess()
' ID du process de l'excel en cours :
    currentID = GetCurrentProcessId()
    Debug.Print "Current Process : " & currentID
' Liste de tous les process EXCEL
  ListXLProcess = getProcessInfoXL()

' Kill Des process Sauf celui qui sert à la macro
Nb_Process = UBound(ListXLProcess) - 1
'Debug.Print Nb_Process
For p = 1 To Nb_Process
    process_ID = ListXLProcess(1, p)
    Debug.Print "Process : " & process_ID
    If process_ID <> currentID Then
        strKillPid = "TASKKILL  /PID " & process_ID
        Shell sKillExcel, vbHide
    End If
Next


End Sub

Messages postés
14
Date d'inscription
lundi 9 septembre 2013
Statut
Membre
Dernière intervention
22 septembre 2013
0
Merci
Bonjour,

Tout d'abord merci pour vos réponses.

Au temps pour moi, effectivement, il faudrait plus de détails.
Alors je lance une première macro qui ne démarre que lorsque toutes les autres applications excel sont fermées. Si ce n'est pas le cas, voici le message d'erreur qui s'affiche :

"Veuillez fermer toutes autres applications excel en cours, puis relancer l'exécution du programme de traçabilité"

Pour automatiser l'analyse qui est nécessaire ensuite, j'ai fait une seconde macro (qui fonctionne correctement d'ailleurs) :

Sub Notetraça()
Dim i As Variant, j As Variant, m As Variant, n As Variant, s As Variant, p As Variant, total As Variant, r As Variant, f As Variant
f = 1
Do While Worksheets("listeArticles").Cells(f, 2) <> ""
    f = f + 1
Loop
i = 2
Do While Worksheets("Resultats").Cells(i, 2) <> ""
    j = 1
    Do While Worksheets("DETAIL_V").Cells(j, 3) <> ""
        codearticlevente = Worksheets("DETAIL_V").Cells(j, 4)
        If Worksheets("DETAIL_V").Cells(j, 3).Value = Worksheets("Resultats").Cells(i, 2).Value Then
            m = 1
            Do While m <= f
                If Worksheets("Resultats").Cells(i, 5) = Worksheets("listeArticles").Cells(m, 1) Then
                    Exit Do
                Else
                    m = m + 1
                End If
            Loop
            lineStart = m
            n = m + 1
            Do While n <= f
                If Worksheets("listeArticles").Cells(n, 1) <> "" Then
                    Exit Do
                Else
                    n = n + 1
                End If
            Loop
            lineEnd = n - 1
            For x = lineStart To lineEnd
                If codearticlevente = Worksheets("listeArticles").Cells(x, 2) Then
                    Worksheets("DETAIL_V").Cells(j, 10) = 0
                    Exit For
                Else
                    Worksheets("DETAIL_V").Cells(j, 10) = Worksheets("DETAIL_V").Cells(j, 8)
                End If
            Next x
            If Worksheets("DETAIL_V").Cells(j, 10) <> 0 Then
                If MsgBox("Article d'achat : " & Worksheets("Resultats").Cells(i, 5) & " Article de vente : " & Worksheets("DETAIL_V").Cells(j, 5) & vbCrLf & "Autoriser ?", vbQuestion + vbYesNo) <> vbYes Then
                    Worksheets("DETAIL_V").Cells(j, 10) = Worksheets("DETAIL_V").Cells(j, 8)
                    Worksheets("Resultats").Cells(i, 17) = Worksheets("Resultats").Cells(i, 17) & " + " & Worksheets("DETAIL_V").Cells(j, 8) & "kg " & Worksheets("DETAIL_V").Cells(j, 5).Value
                Else
                    Worksheets("DETAIL_V").Cells(j, 10) = 0
                End If
            End If
        End If
        j = j + 1
    Loop
    i = i + 1
Loop
s = 2
r = 2
starter = 1
Do While Worksheets("DETAIL_V").Cells(s, 3) <> ""
    If Worksheets("DETAIL_V").Cells(s, 3) <> Worksheets("DETAIL_V").Cells(s + 1, 3) Then
        total = 0
        fin = s
        For p = starter To fin
            total = total + Worksheets("DETAIL_V").Cells(p, 10)
        Next p
        Worksheets("DETAIL_V").Cells(fin, 11) = total
        starter = s + 1
        Do While Worksheets("Resultats").Cells(r, 2) <> ""
            If Worksheets("DETAIL_V").Cells(s, 3) = Worksheets("Resultats").Cells(r, 2) Then
                pourcentage = Worksheets("DETAIL_V").Cells(fin, 11) / Worksheets("Resultats").Cells(r, 10)
                If pourcentage <= 0.01 Then
                    Worksheets("Resultats").Cells(r, 15) = 1
                    Exit Do
                End If
                If (pourcentage <= 0.02 And pourcentage > 0.01) Then
                    Worksheets("Resultats").Cells(r, 15) = 0.75
                    Exit Do
                End If
                If (pourcentage <= 0.03 And pourcentage > 0.02) Then
                    Worksheets("Resultats").Cells(r, 15) = 0.5
                    Exit Do
                End If
                If (pourcentage <= 0.04 And pourcentage > 0.03) Then
                    Worksheets("Resultats").Cells(r, 15) = 0.25
                    Exit Do
                End If
                If pourcentage > 0.04 Then
                    Worksheets("Resultats").Cells(r, 15) = 0
                    Exit Do
                End If
            End If
            r = r + 1
        Loop
    End If
    s = s + 1
Loop
End Sub


Le problème vient que depuis que j'ai fait cette seconde macro, le message d'erreur s'affiche à chaque fois et je ne peux donc plus utiliser la première.
Ce qui m'a amené à penser que l'exécution de la seconde macro ne finissais jamais ce qui induirait qu'il détecte constamment une application ouverte non ?

@Jordane45 :
Si je redémarre le poste, le souci persiste. Et non je n'ouvre pas de fichiers dans ma macro.

Je vais de suite essayer vos solutions.

Merci
0
Merci
Bonjour,

Le problème venait en effet de là, c'est à dire qu'il y avait un classeur invisible d'ouvert. Sauf que ce classeur est perso.xls, soit le classeur de macros personnelles. Pourquoi reste-il toujours ouvert ? Y-a-t-il un moyen de le fermer automatiquement après utilisation de ma macro ?

Cordialement.

Allan
Messages postés
6027
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2019
86
0
Merci
En se servant du petit code que je t'ai donné:

Option Explicit
Private Sub CommandButton1_Click()
'test pour connaitre le nombre de classeur ouvert
 Dim NombreClasseur As Integer
 NombreClasseur = Workbooks.Count
If NombreClasseur > 1 Then
BoucleClasseurs
End If
End Sub
Sub BoucleClasseurs()
Dim nom As String
    'Définit une variable qui va représenter un classeur à chaque itération.
    Dim Wb As Workbook
     'Boucle sur chaque classeur de l'application Excel
    For Each Wb In Application.Workbooks
        'Ecrit le nom de chaque classeur
       nom = Wb.Name
     If nom = "Classeur1.xls" Then 'mettre le nom du classeur en respectant le casse
    Workbooks("Classeur1.xls").Close 'ferme le classeur
    MsgBox "Le classeur " & nom & " estfermé"
       Else
       Exit Sub
       End If
    Next Wb
End Sub

cs_Le Pivert
Messages postés
6027
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2019
86 -
Petite rectification:
Supprime Exit Sub car si ce n'est pas ton fichier qui est le 1er dans la boucle on va sortir!
Je te remercie pour ton aide, en effet ce la fonctionne très bien maintenant. Une petit question à part vu que tu m'as l'air de bien maitriser le sujet. Comment faire pour demander d'ouvrir les derniers fichiers (ceux à la date du jour) contenu dans un dossier ?

Cdlt.

Allan
Messages postés
6027
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2019
86
0
Merci
si cette question est résolu, marque résolu. Ensuite ouvre un nouveau post pour ta nouvelle question. C'est la règle de ce forum. une question à la foi pour faciliter les recherches a venir.

Cordialement

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.