Tuer le processus EXCEL.EXE depuis une application vba/access [Résolu] - VB/VBA/VBS - Programmation
Marsh Posté le 07-08-2008 à 15:01:30
Je viens d'essayer à partir de Word (je n'ai pas Access) et ca marche sans aucun pb....
Marsh Posté le 07-08-2008 à 15:05:13
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
Marsh Posté le 07-08-2008 à 15:10:17
Idem. Et si tu mets le code sous Word (en activant la références Excel) ca donne quoi ?
Marsh Posté le 07-08-2008 à 15:15:04
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
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
Marsh Posté le 07-08-2008 à 18:41:07
Salut,permet également le suicide .....
|
Parametres sur http://technet.microsoft.com/en-us [...] 91009.aspx
Marsh Posté le 08-08-2008 à 09:25:29
kiki29 a écrit : Salut,permet également le suicide .....
|
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 )
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 )
Marsh Posté le 21-08-2008 à 10:18:42
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
Marsh Posté le 27-08-2008 à 10:32:49
Oui en effet j'avais adopté cette solution... Il faut bien préciser sur quel objet on travail.
C'est vraiment lourd le VBA
Marsh Posté le 07-08-2008 à 14:19:45
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
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
Merci d'avance à tous
Message édité par wasa131313 le 27-08-2008 à 10:34:40