Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2801 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [Résolu] Tuer le processus EXCEL.EXE depuis une application vba/access

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Tuer le processus EXCEL.EXE depuis une application vba/access

n°1770705
wasa131313
Posté le 07-08-2008 à 14:19:45  profilanswer
 

Bonjour à tous,
 
je viens vers vous car j'ai un petit problème avec une application vba qui tourne sous Access.
 
En effet je manipule un fichier Excel depuis cette apllication mais j'aimerai pouvoir enchaîner la manipulation de plusieurs fichiers différents à la suite.
Le problème étant que si je ne ferme pas Excel pour le réouvrir ensuite, il a y a des problèmes à l'ouverture du second fichier Excel : il prend des valeurs du premier fichier ouvert...etc.
 
Seulement je n'arrive pas, malgrès mes recherches sur différents forums, à fermer excel, il reste toujours le processus EXCEL.EXE qui tourne :(
 
Je vous laisse les parties utiles de mon code pour que vous me disiez ce qui pourrait merder :/ :
 

Dim Xl As Excel.Application
Dim Classeur As Excel.Workbook
 
'on ouvre le fichier excel
Set Xl = New Excel.Application
Xl.Visible = False
Set Classeur = Xl.Workbooks.Open("mon_fichier.xls" )
 
 
'traitement à faire sur le fichier Excel (à notre que je ne fais aucune modification ,je récupère simplement des données
 
 
 'on ferme notre fichier excel
    Classeur.Close SaveChanges:=False
    Xl.Quit
    Set Classeur = Nothing
    Set Xl = Nothing

 
 
Voilà j'ai mis ce code dans une fonction que j'appele depuis un sub.
Le problème étant qu'à la fin de mon éxécution (quand je test avec l'ouverture d'un seul fichier Excel) le processus EXCEL.EXE tourne encore :cry:  
 
 
Alors voilà je me doute que quelque chose dans mon code n'est pas bon mais je n'ai pas assez d'expérience en VBA pour identifier quoi, j'espère que vous pourrez m'aider et me dire ce qu'il faut changer pour enfin tuer ce P****N de processus  :fou:
 
Merci d'avance à tous  :ange:


Message édité par wasa131313 le 27-08-2008 à 10:34:40
mood
Publicité
Posté le 07-08-2008 à 14:19:45  profilanswer
 

n°1770729
babasss
Posté le 07-08-2008 à 15:01:30  profilanswer
 

Je viens d'essayer à partir de Word (je n'ai pas Access) et ca marche sans aucun pb....


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1770733
wasa131313
Posté le 07-08-2008 à 15:05:13  profilanswer
 

Tu es sous quelle version?
 
Perso je suis sous office 2002, çà peut avoir un rapport? là je désespère un peu quand même car çà fout en l'air tout le traitement après grrrr
 
En tout cas merci pour ta réponse ;)

n°1770742
babasss
Posté le 07-08-2008 à 15:10:17  profilanswer
 

Idem. Et si tu mets le code sous Word (en activant la références Excel) ca donne quoi ?


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1770749
wasa131313
Posté le 07-08-2008 à 15:15:04  profilanswer
 

C'est ce que j'étais en train de regarder... et effectivement depuis word çà marche nickel.  
 
Alors deux solutions => soit çà vient de access en lui même, soit çà vient du traitement que je fais au milieu :/
 
EDIT : je confirme c'est bien le traitement que je fais au milieu qui fait tout merder ^^
 
je met mon code si jamais quelqu'un voit ce qui peut gêner... Merci encore
 
 

 
 
Sub import_PDP_metrics()
 
 
 
    photo_prevision_mois ("ARRIEL" )
 
 
 
 
 
End Sub
 
 
 
 
 
 
 
 
 
 
'ATTENTION!!!!!!!!!!!!!!!
'
'Action à affectuer la première semaine de chaque mois
 
Function photo_prevision_mois(nom_moteur As Variant)
 
Dim fichier1 As Variant
Dim rst As ADODB.recordset
Dim date_courante As Variant
Dim chSQL As String
Dim i As Variant
Dim j As Variant
Dim k As Variant
Dim mois_en_cours As Variant
Dim année_en_cours As Variant
Dim semaine_en_cours As Variant
Dim colonne_en_cours As Variant
Dim nbr_semaine As Variant
Dim plan_prod As Variant
Dim date_ref As Variant
Dim Xl As Excel.Application
Dim Classeur As Excel.Workbook
Dim connect As ADODB.connection
Dim pdp_int As Variant
Dim pdp_ext As Variant
Dim dem_com As Variant
Dim mois_pdp As Date
     
     
     
     
     
'on ouvre la connection
Set connect = CurrentProject.connection
 
 
 
 
 
'on crée le recorset
Set rst = New ADODB.recordset
         
'requête pour récupérer les données de la date courante
chSQL = "select * from date_courante"
'on récupère les données de la date courante avec le resultset
rst.Open chSQL, connect
'on accède au premier élément qui correspond à la valeur de nos données
rst.MoveFirst
'on donne les valeurs voulues dans le résultat de notre requête
mois_en_cours = rst.Fields("mois" ).Value
année_en_cours = rst.Fields("année" ).Value
semaine_en_cours = rst.Fields("semaine" ).Value
colonne_en_cours = rst.Fields("colonne_en_cours" ).Value
         
rst.Close
 
 
 
 
'on crée mois_pdp à partir des données de date_courante
mois_pdp = "01/" & mois_en_cours & "/" & année_en_cours
 
 
 
 
 
 
'on ouvre le fichier excel
Set Xl = New Excel.Application
Xl.Visible = True
Set Classeur = Xl.Workbooks.Open("mon_fichier".xls" )
 
 
 
 
 
     
    'on test les cas où il  y a différentes feuilles sur le même fichier PDP excel
    If nom_moteur = "ARRIEL" Then
     
     
     
     
     
        'si la famille en cours de traitement est arriel, on traite d'abord la feuille arriel1 puis la feuille arriel 2
        'on sélectionne la feuille du fichier qui corresponated à arriel 1
        Classeur.Worksheets("PDP ARRIEL1" ).Activate
         
         
        'on récupère le mois en cours sous forme '01/08/2008' dans le PDP
        date_ref = année_en_cours & "/" & semaine_en_cours
         
         
       
        'on initialise i à la valeur de la colonne_en_cours qui doit être la colonne de la première semaine du mois en cours
        i = colonne_en_cours
         
        'on initialise j à 0
        j = 0
             
             
        'on traite variante après variante jusqu'à ce qu'il n'y en ait plus
        While Cells(5 + j, 1) <> "Fin de détail"
             
             
            'on fait une boucle qui récupère puis insère dans l'infocentre les valeurs des pdp internes et externes pour
            'chaque semaine du mois qui débute
            While Cells(2, i) = "" Or Cells(2, i) = mois_pdp
                 
                 'on crée le recorset
                Set rst = New ADODB.recordset
                 
                 
                'on test si la valeur du PDP interne puis externe dans le pdp excel est vide
                'si elle est vide on met la valeur du PDP interne ou externe (selon les cas) à 0
                'sinon on met la valeur récupérée dans le pdp
                If Cells(9 + j, i) = "" Then
                 
                    pdp_int = 0
                     
                Else
                 
                    pdp_int = Cells(9 + j, i)
                 
                End If
                 
                If Cells(10 + j, i) = "" Then
                 
                    pdp_ext = 0
                     
                Else
                     
                    pdp_ext = Cells(10 + j, i)
                 
                End If
                 
                'on test si la valeur de la demande commerciale dans le pdp excel n'est pas vide
                'si c'est le cas on met dem_com à 0 sinon on met la valeur du pdp
                If Cells(6 + j, i) = "" Then
                 
                    dem_com = 0
                     
                Else
                     
                    dem_com = Cells(6 + j, i)
                 
                End If
                     
     
                'requête pour insérer le PDP prévu pour la semaine en cours de traitement du mois en cours
                chSQL = "insert into Infocentre_Moteurs_mois_en_cours_prévu (reference, designation, version_fab, famille, code_gest, date_dem_arbitrée, demande_arbitrée, date_ref, qte, semaine, date_indicateur, valeur_Meuro, statut) values ('" & Cells(5 + j, 1) & "', '" & Cells(5 + j, 2) & "', 'interne', 'ARRIEL 1', '" & Cells(2, 1) & "', #" & Cells(2, 2) & "#, " & dem_com & ", '" & date_ref & "', " & pdp_int & ", '" & Cells(3, i) & "', #" & Cells(3, 2) & "#, '0', 'prévu')"
                                                                     
                'on récupère les données de la date courante avec le resultset
                connect.Execute chSQL
                 
                'requête pour insérer le PDP prévu pour la semaine en cours de traitement du mois en cours
                chSQL = "insert into Infocentre_Moteurs_mois_en_cours_prévu (reference, designation, version_fab, famille, code_gest, date_dem_arbitrée, demande_arbitrée, date_ref, qte, semaine, date_indicateur, valeur_Meuro, statut) values ('" & Cells(5 + j, 1) & "', '" & Cells(5 + j, 2) & "', 'externe', 'ARRIEL 1', '" & Cells(2, 1) & "', #" & Cells(2, 2) & "#, " & dem_com & ", '" & date_ref & "', " & pdp_ext & ", '" & Cells(3, i) & "', #" & Cells(3, 2) & "#, '0', 'prévu')"
                 
                'on récupère les données de la date courante avec le resultset
                connect.Execute chSQL
             
                'rst.Close
         
                 'on incrémente ensuite i de 1
                 i = i + 1
                 
            Wend
             
             
            i = colonne_en_cours
               
            'on passe à la variante suivante
            j = j + 13
             
        Wend
         
         
         
         
         
         
         
         
         
        'on sélectionne la feuille du fichier qui correspond à arriel 2
        Classeur.Worksheets("PDP ARRIEL2" ).Activate
         
         
        'on récupère le mois en cours sous forme '01/08/2008' dans le PDP
        date_ref = année_en_cours & "/" & semaine_en_cours
         
         
       
        'on initialise i à la valeur de la colonne_en_cours qui doit être la colonne de la première semaine du mois en cours
        i = colonne_en_cours
         
        'on initialise j à 0
        j = 0
             
             
        'on traite variante après variante jusqu'à ce qu'il n'y en ait plus
        While Cells(5 + j, 1) <> "Fin de détail"
             
             
            'on fait une boucle qui récupère puis insère dans l'infocentre les valeurs des pdp internes et externes pour
            'chaque semaine du mois qui débute
            While Cells(2, i) = "" Or Cells(2, i) = mois_pdp
                 
                 'on crée le recorset
                Set rst = New ADODB.recordset
                 
                 
                'on test si la valeur du PDP interne puis externe dans le pdp excel est vide
                'si elle est vide on met la valeur du PDP interne ou externe (selon les cas) à 0
                'sinon on met la valeur récupérée dans le pdp
                If Cells(9 + j, i) = "" Then
                 
                    pdp_int = 0
                     
                Else
                 
                    pdp_int = Cells(9 + j, i)
                 
                End If
                 
                If Cells(10 + j, i) = "" Then
                 
                    pdp_ext = 0
                     
                Else
                     
                    pdp_ext = Cells(10 + j, i)
                 
                End If
                 
                'on test si la valeur de la demande commerciale dans le pdp excel n'est pas vide
                'si c'est le cas on met dem_com à 0 sinon on met la valeur du pdp
                If Cells(6 + j, i) = "" Then
                 
                    dem_com = 0
                     
                Else
                     
                    dem_com = Cells(6 + j, i)
                 
                End If
                     
     
                'requête pour insérer le PDP prévu pour la semaine en cours de traitement du mois en cours
                chSQL = "insert into Infocentre_Moteurs_mois_en_cours_prévu (reference, designation, version_fab, famille, code_gest, date_dem_arbitrée, demande_arbitrée, date_ref, qte, semaine, date_indicateur, valeur_Meuro, statut) values ('" & Cells(5 + j, 1) & "', '" & Cells(5 + j, 2) & "', 'interne', 'ARRIEL 2', '" & Cells(2, 1) & "', #" & Cells(2, 2) & "#, " & dem_com & ", '" & date_ref & "', " & pdp_int & ", '" & Cells(3, i) & "', #" & Cells(3, 2) & "#, '0', 'prévu')"
                                                                     
                'on récupère les données de la date courante avec le resultset
                connect.Execute chSQL
                 
                'requête pour insérer le PDP prévu pour la semaine en cours de traitement du mois en cours
                chSQL = "insert into Infocentre_Moteurs_mois_en_cours_prévu (reference, designation, version_fab, famille, code_gest, date_dem_arbitrée, demande_arbitrée, date_ref, qte, semaine, date_indicateur, valeur_Meuro, statut) values ('" & Cells(5 + j, 1) & "', '" & Cells(5 + j, 2) & "', 'externe', 'ARRIEL 2', '" & Cells(2, 1) & "', #" & Cells(2, 2) & "#, " & dem_com & ", '" & date_ref & "', " & pdp_ext & ", '" & Cells(3, i) & "', #" & Cells(3, 2) & "#, '0', 'prévu')"
                 
                'on récupère les données de la date courante avec le resultset
                connect.Execute chSQL
             
                'rst.Close
         
                 'on incrémente ensuite i de 1
                 i = i + 1
                 
            Wend
             
             
            i = colonne_en_cours
               
            'on passe à la variante suivante
            j = j + 13
             
        Wend
                 
             
        ElseIf nom_moteur = "toto" Then
         
           'même traitement qu'au dessus mais pour toto
 
        ElseIf .......etc
 
 
         
         
        Else
     
     
     
        'sinon on traite normalement :D
         
         
         
         
        End If
     
     
    'on ferme la connection
    connect.Close
    Set connect = Nothing
     
     
    'on ferme notre fichier excel
    Classeur.Close SaveChanges:=False
    Xl.Quit
    Set Classeur = Nothing
    Set Xl = Nothing
     
 
 
     
 
End Function
 
 


Message édité par wasa131313 le 07-08-2008 à 15:27:08
n°1770888
kiki29
Posté le 07-08-2008 à 18:41:07  profilanswer
 

Salut,permet également le suicide .....


Sub Tst
Dim RetVal as Variant
 RetVal = Shell("Taskkill /im Excel.exe /f", 0)
End Sub


 
Parametres sur http://technet.microsoft.com/en-us [...] 91009.aspx

Message cité 1 fois
Message édité par kiki29 le 07-08-2008 à 18:47:10
n°1770892
wasa131313
Posté le 07-08-2008 à 18:47:18  profilanswer
 

Merci :)

n°1771013
wasa131313
Posté le 08-08-2008 à 09:25:29  profilanswer
 

kiki29 a écrit :

Salut,permet également le suicide .....


Sub Tst
Dim RetVal as Variant
 RetVal = Shell("Taskkill /im Excel.exe /f", 0)
End Sub


 
Parametres sur http://technet.microsoft.com/en-us [...] 91009.aspx


 
Suis-je boulet ou alors excel m'en veut ? (c'est une question réthorique je ne veux pas de réponse... paraît que la vérité fait mal à entendre  :ange: )
 
Mais lorsque que je colle ce code et que je fait un call à la fin de ma fonction, ben çà me sort une erreur 53 "fichier introuvable". Je suis pas encore super à l'aise avec vba et je ne connais pas cette erreur alors j'arrive pas à indentifier à quoi elle peut être due (surtout que je fais pas appel à un fichier  :pfff: )

n°1775346
Niconoel
Posté le 21-08-2008 à 10:18:42  profilanswer
 


Bon j'ai eu le meme soucis que toi: en fait pas besoin de killer excel.exe
Pour tout dire tu n'as pas grand chose a changer dans ton code d'origine.
 
Mets des Xl. à chaque fois que tu manipules un objet excel par exemple Xl.Cells à la place de Cells tout court avec bien sur "Dim Xl As Excel.Application" au début
En fait vb fait le lien entre Cells et ton 1er ficher excel la première fois mais lorsque tu fermes le 1er fichier excel pour  ouvrir le 2ieme, l'objet cells reste définit au 1er d'ou le bug. En mettant Xl.Cells l'objet sera automatiquement libéré quand tu feras Xl.Close et donc réutilisable pour le 2ieme fichier.
essayes et tu veras çà marche impec
Si t'as besoin redis moi je t'enverrais mon bout de code

n°1778154
wasa131313
Posté le 27-08-2008 à 10:32:49  profilanswer
 

Oui en effet j'avais adopté cette solution... Il faut bien préciser sur quel objet on travail.
 
C'est vraiment lourd le VBA :/


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [Résolu] Tuer le processus EXCEL.EXE depuis une application vba/access

 

Sujets relatifs
[Résolu] - Sessions bizarres, pertes des variables[resolu]3 div dont 2 avec float : la troisième ne passe pas en dessous
msgbox et userform en plein ecranConteneur de self-reference [resolu]
[Excel] Rechercher un élément différent - Résoluune application qui se modifie via XML
[Excel]Aide sur fonctions de recherche[résolu]lecture d'un fichier créé [JSP/JAVA]
Plus de sujets relatifs à : [Résolu] Tuer le processus EXCEL.EXE depuis une application vba/access


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR