Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de fermeture d'excel

5 réponses
Avatar
Superman
Bonjour,

Je developpe un petit soft qui permet d'inserer des valeurs d'un un
fichier texte sur un fichier excel.

Une fois ceci effectu=E9, l'utilisateur possede devant lui le fichier
excel.
l'utilisateur peut ensuite le fermer mais le probleme c'est que EXCEL
est encore en arriere plan (pr=E9sent dans le gestionnaire des taches il
se quitte uniquement qd je ferme mon application)
Donc qd je fais une seconde demande de fichier hop ca bug...

Je ne peux pas quitter EXCEL tant que l'utilisateur ne le veut pas
donc je ne sais pas trop comment faire pour quitter EXCEL lorsque je
ferme EXCEL et non mon logiciel!

Merci

Maxime

5 réponses

Avatar
Jacques93
Bonjour Superman,
Superman a écrit :
Bonjour,

Je developpe un petit soft qui permet d'inserer des valeurs d'un un
fichier texte sur un fichier excel.

Une fois ceci effectué, l'utilisateur possede devant lui le fichier
excel.
l'utilisateur peut ensuite le fermer mais le probleme c'est que EXCEL
est encore en arriere plan (présent dans le gestionnaire des taches il
se quitte uniquement qd je ferme mon application)
Donc qd je fais une seconde demande de fichier hop ca bug...

Je ne peux pas quitter EXCEL tant que l'utilisateur ne le veut pas
donc je ne sais pas trop comment faire pour quitter EXCEL lorsque je
ferme EXCEL et non mon logiciel!




D'après ce que tu décris, je suppose que tu travailles sur une instance
d'Excel, via :

set xl = New Excel.Application

ou

Set xl = CreateObject("Excel.Application")

et tant que cette instance 'xl' est "vivante" dans VB, Excel sera
présent dans le gestionnaire de tâches.

Une solution consiste à procéder en 2 étapes. Travailler sur ton
instance d'Excel pour faire tes insertions de valeurs, fermer excel, et
son instance avec :

xl.Quit
set xl = Nothing

puis lancer Excel avec ton classeur, au moyen de Shell ou ShellExecute,
Excel sera alors indépendant de ton application.

--
Cordialement,

Jacques.
Avatar
Gloops
Jacques93 a écrit, le 12/07/2007 18:06 :
Une solution consiste à procéder en 2 étapes. Travailler sur ton
instance d'Excel pour faire tes insertions de valeurs, fermer excel, et
son instance avec :

xl.Quit
set xl = Nothing

puis lancer Excel avec ton classeur, au moyen de Shell ou ShellExecute,
Excel sera alors indépendant de ton application.




Une autre, à remplacer xl.Quit par xl.ActiveWorkbook.Save ?

C'est vrai qu'on peut chipoter quant à détruire une référence à une
instance restée ouverte.
Avatar
Superman
Bonjour,

Suite a vos recommandations, j'ai essayé de fermer le fichier EXCEL.
Voici mon code

Private Sub Command9_Click()
Dim fso As Scripting.FileSystemObject
Dim fd As Scripting.Folder
Dim fl As Scripting.File
Dim fdCur As Scripting.Folder
Dim sFolderName As String
Dim i As Integer
Dim nbr_clients As Integer
Dim nombre As Integer
Dim appExcel As Excel.Application 'Application Excel
Dim wbExcel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Excel.Worksheet 'Feuille Excel

If Text4.Text = "" Then
MsgBox "Veuillez remplir l'année"
Exit Sub
End If

If Not Dir("C:testCompte_client" & Text4.Text & ".xls") <> "" Then

Set appExcel = CreateObject("Excel.Application")
appExcel.Workbooks.Add
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.ActiveSheet
appExcel.Visible = True 'Rendre visible Excel

' Initialisation du nom du dossier
sFolderName = "C:testCompte_client"
Range("B2").Value = "Janvier"
Range("C2").Value = "Fevrier"
Range("D2").Value = "Mars"
Range("E2").Value = "Avril"
Range("F2").Value = "Mai"
Range("G2").Value = "Juin"
Range("H2").Value = "Juillet"
Range("I2").Value = "Août"
Range("J2").Value = "Septembre"
Range("K2").Value = "Octobre"
Range("L2").Value = "Novembre"
Range("M2").Value = "Decembre"

appExcel.Cells.EntireColumn.AutoFit

Range("A1").Value = "RELEVE ANNUEL"
Range("A1:M1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Else
appExcel.Workbooks.Open "C:testCompte_client" & test4.Text &
".xls"
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.ActiveSheet
appExcel.Visible = True 'Rendre visible Excel
End If

Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier source existe bien.
If fso.FolderExists(sFolderName) Then
' Récupérer l'instance du dossier.
Set fd = fso.GetFolder(sFolderName)
i = 3
'Lister les sous-dossiers
For Each fdCur In fd.SubFolders
wsExcel.Cells(i, 1).Formula = fdCur.name
i = i + 1
Next fdCur
nbr_clients = i
Else
MsgBox "Dossier non trouvé!"
End If
Columns("A:A").EntireColumn.AutoFit

For i = 3 To (nbr_clients - 1)
For j = 2 To 13
code_client = wsExcel.Cells(i, 1).Value
mois = wsExcel.Cells(2, j).Value
ligne = 6
colonne = 33
onglet = mois
Fichier = Text4.Text & ".xls"
rep = "c:testCompte_client" & code_client

If Not Dir(rep) <> "" Then
If IsNumeric(ExecuteExcel4Macro("'" & rep & "[" &
Fichier & "]" & onglet & "'!R" & ligne & "C" & colonne & "")) Then
wsExcel.Cells(i, j).Formula =
ExecuteExcel4Macro("'" & rep & "[" & Fichier & "]" & onglet & "'!R" &
ligne & "C" & colonne & "")
End If
End If
Next
Next
appExcel.DisplayAlerts = False
wbExcel.SaveAs "C:" & Fichier, , , , , , xlShared
wbExcel.Close
appExcel.Quit
Set wbExcel = Nothing
Set appExcel = Nothing
End Sub

Il y a peut etre une erreur dans mon code ?
Mais il ne ferme pas totalement EXCEL car dans le gestionnaire ensuite
il est encore présent.

Merci de votre aide
Johnson
Avatar
Superman
Suite a vos recommandations, j'ai essayé de fermer le fichier excel
mais toujours le meme probleme, dans le gestionnaire on trouve
toujours EXCEL d'ouvert

Voici mon code :

Private Sub Command9_Click()
Dim fso As Scripting.FileSystemObject
Dim fd As Scripting.Folder
Dim fl As Scripting.File
Dim fdCur As Scripting.Folder
Dim sFolderName As String
Dim i As Integer
Dim nbr_clients As Integer
Dim nombre As Integer
Dim appExcel As Excel.Application 'Application Excel
Dim wbExcel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Excel.Worksheet 'Feuille Excel

If Text4.Text = "" Then
MsgBox "Veuillez remplir l'année"
Exit Sub
End If

If Not Dir("C:testCompte_client" & Text4.Text & ".xls") <> "" Then

Set appExcel = CreateObject("Excel.Application")
appExcel.Workbooks.Add
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.ActiveSheet
appExcel.Visible = True 'Rendre visible Excel

' Initialisation du nom du dossier
sFolderName = "C:testCompte_client"
Range("B2").Value = "Janvier"
Range("C2").Value = "Fevrier"
Range("D2").Value = "Mars"
Range("E2").Value = "Avril"
Range("F2").Value = "Mai"
Range("G2").Value = "Juin"
Range("H2").Value = "Juillet"
Range("I2").Value = "Août"
Range("J2").Value = "Septembre"
Range("K2").Value = "Octobre"
Range("L2").Value = "Novembre"
Range("M2").Value = "Decembre"

appExcel.Cells.EntireColumn.AutoFit

Range("A1").Value = "RELEVE ANNUEL"
Range("A1:M1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Else
appExcel.Workbooks.Open "C:testCompte_client" & test4.Text &
".xls"
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.ActiveSheet
appExcel.Visible = True 'Rendre visible Excel
End If

Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier source existe bien.
If fso.FolderExists(sFolderName) Then
' Récupérer l'instance du dossier.
Set fd = fso.GetFolder(sFolderName)
i = 3
'Lister les sous-dossiers
For Each fdCur In fd.SubFolders
wsExcel.Cells(i, 1).Formula = fdCur.name
i = i + 1
Next fdCur
nbr_clients = i
Else
MsgBox "Dossier non trouvé!"
End If
Columns("A:A").EntireColumn.AutoFit

For i = 3 To (nbr_clients - 1)
For j = 2 To 13
code_client = wsExcel.Cells(i, 1).Value
mois = wsExcel.Cells(2, j).Value
ligne = 6
colonne = 33
onglet = mois
Fichier = Text4.Text & ".xls"
rep = "c:testCompte_client" & code_client

If Not Dir(rep) <> "" Then
If IsNumeric(ExecuteExcel4Macro("'" & rep & "[" &
Fichier & "]" & onglet & "'!R" & ligne & "C" & colonne & "")) Then
wsExcel.Cells(i, j).Formula =
ExecuteExcel4Macro("'" & rep & "[" & Fichier & "]" & onglet & "'!R" &
ligne & "C" & colonne & "")
End If
End If
Next
Next
appExcel.DisplayAlerts = False
wbExcel.SaveAs "C:" & Fichier, , , , , , xlShared
wbExcel.Close
appExcel.Quit
Set wbExcel = Nothing
Set appExcel = Nothing
End Sub

Ya t'il une erreur ?

Merci
Avatar
Jacques93
Bonjour Superman
Superman a écrit :
Bonjour,

Suite a vos recommandations, j'ai essayé de fermer le fichier EXCEL.
Voici mon code




[...]

Le problème, me semble t'il, vient d'une part que tu ne fais pas de lien
entre les objets Range et wsExcel, Selection et appExcel, d'où l'ajout
des lignes :

With wsExcel
.Range("B2").Value = "Janvier"
'...
End With

With appExcel.Selection
.HorizontalAlignment = xlCenter
' ...
End With

ce qui crée des références implicites qui ne sont détruite qu'à la fin
du programme. Par ailleurs tu ne détruis pas l'instance de la feuille
wsExcel, d'où l'ajout à la fin de la procédure de :

Set wsExcel = Nothing

bien qu'ici ce soit un peu différent : wsExcel étant déclarée en local,
son instance est détruite en passant sur le End Sub. Mais c'est plus
propre de le faire explicitement (à mon avis)

Voici le code modifié (j'ai mis en remarque les lignes concernant le
traitement que je ne peux reproduire) :

Private Sub Command9_Click()
Dim fso As Scripting.FileSystemObject
Dim fd As Scripting.Folder
Dim fl As Scripting.File
Dim fdCur As Scripting.Folder
Dim sFolderName As String
Dim i As Integer
Dim nbr_clients As Integer
Dim nombre As Integer
Dim appExcel As Excel.Application 'Application Excel
Dim wbExcel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Excel.Worksheet 'Feuille Excel

If Text4.Text = "" Then
MsgBox "Veuillez remplir l'année"
Exit Sub
End If

If Not Dir("C:testCompte_client" & Text4.Text & ".xls") <> "" Then

Set appExcel = CreateObject("Excel.Application")
appExcel.Workbooks.Add
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.ActiveSheet
appExcel.Visible = True 'Rendre visible Excel

' Initialisation du nom du dossier
sFolderName = "C:testCompte_client"
==> *With wsExcel*
.Range("B2").Value = "Janvier"
.Range("C2").Value = "Fevrier"
.Range("D2").Value = "Mars"
.Range("E2").Value = "Avril"
.Range("F2").Value = "Mai"
.Range("G2").Value = "Juin"
.Range("H2").Value = "Juillet"
.Range("I2").Value = "Août"
.Range("J2").Value = "Septembre"
.Range("K2").Value = "Octobre"
.Range("L2").Value = "Novembre"
.Range("M2").Value = "Decembre"

appExcel.Cells.EntireColumn.AutoFit

.Range("A1").Value = "RELEVE ANNUEL"
.Range("A1:M1").Select
End With
==> *With appExcel.Selection*
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
appExcel.Selection.Merge

Else
appExcel.Workbooks.Open "C:testCompte_client" & Test4.Text & ".xls"
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.ActiveSheet
appExcel.Visible = True 'Rendre visible Excel
End If

Set fso = CreateObject("Scripting.FileSystemObject")
' Vérifier que le dossier source existe bien.
If fso.FolderExists(sFolderName) Then
' Récupérer l'instance du dossier.
Set fd = fso.GetFolder(sFolderName)
i = 3
'Lister les sous-dossiers
For Each fdCur In fd.SubFolders
wsExcel.Cells(i, 1).Formula = fdCur.Name
i = i + 1
Next fdCur
nbr_clients = i
Else
MsgBox "Dossier non trouvé!"
End If
wsExcel.Columns("A:A").EntireColumn.AutoFit

'For i = 3 To (nbr_clients - 1)
' For j = 2 To 13
' code_client = wsExcel.Cells(i, 1).Value
' mois = wsExcel.Cells(2, j).Value
' ligne = 6
' colonne = 33
' onglet = mois
' Fichier = Text4.Text & ".xls"
' rep = "c:testCompte_client" & code_client'

' If Not Dir(rep) <> "" Then
' If IsNumeric(ExecuteExcel4Macro("'" & rep & "[" &
Fichier & "]" & onglet & "'!R" & ligne & "C" & colonne & "")) Then
' wsExcel.Cells(i, j).Formula = ExecuteExcel4Macro("'"
& rep & "[" & Fichier & "]" & onglet & "'!R" & ligne & "C" & colonne & "")
' End If
' End If
' Next
'Next
appExcel.DisplayAlerts = False
wbExcel.SaveAs "C:" & Fichier, , , , , , xlShared
wbExcel.Close
appExcel.Workbooks.Close
appExcel.Quit
==> *Set wsExcel = Nothing*
Set wbExcel = Nothing
Set appExcel = Nothing
End Sub


NB : Tu devrais faire pareil avec les objets fso, ils sont détruit par
le End Sub car déclaré en local, mais pas de manière explicite.
Tu devrais faire une petite recherche sur la portée des variables
(locales, public), et sur :

Option Explicit

il y a dans ton code des références à Text4.Text et Test4.Text. Faute de
frappe, dans le message ?

--
Cordialement,

Jacques.