Macro sous Access - Probleme pour fermer EXCEL

frankfromfrance Messages postés 1 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 3 mars 2005 - 3 mars 2005 à 16:45
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 - 3 mars 2005 à 18:04
Bonjour,


Je suis actuellement en train d'élaborer une macro ( VBA ) qui s'exécute à partir d'Access et qui va chercher des informations dans des classeurs Excel afin de les enregistrer dans ma base Access.
La recherche des fichiers se passent relativement bien. Le seul problème, malheureusement de taille, est la gestion d'allocation de mémoire pour l'application Excel. En effet bien qu'essayant de fermer Excel après chaque ouverture de ficher la mémoire alloué à Excel ne cesse d'augmenter jusqu'à saturation et donc planter mon PC.
L'augmentation de mémoire par ouverture de fichier est insignifiante individuellement mais ma recherche se fait sur plus de 3 000 fichiers Excel.
Étant plus que débutant dans la programmation (tout langage confondu) et bien qu'ayant fait des recherches, je n'arrive pas à introduire l'ordre de fermer Excel sans faire planter la macro.
En clair : A L'aide
Merci d'avance pour toute aide
Vous trouverez ci-joint la macro en question
Frank

Option Compare Database
Dim f, fs, i
Dim positiondernierslash, PositionAvantdernier
Dim nomcherché, nomclasseur
------------------------------------------------------------------------------------------------------------------------


Private Sub Commande0_Click()
'lance la requete nommée SUPPRESSION (voir les requetes enregistrées)


DoCmd.OpenQuery "suppression", acNormal, acEdit

With Application.FileSearch ' le End With est en bas
' préciser ici le chemin d'accès le plus proche de l'ensemble de vos classeurs
.LookIn = "[file://\\CYL\FY05\ \\CYL\FY05\]"
.SearchSubFolders = True
.FileType = msoFileTypeExcelWorkbooks
.Execute

For i = 1 To .FoundFiles.Count
------------------------------------------------------------------------------------------------------------------------
'calcule la position et récupère le nom du répertoire immédiatement précédent et du classeur

positiondernierslash = InStrRev(.FoundFiles.Item(i), "")
PositionAvantdernier = InStrRev(.FoundFiles.Item(i), "", positiondernierslash - 1)

nomcherché = Mid(.FoundFiles.Item(i), PositionAvantdernier + 1, (positiondernierslash - PositionAvantdernier) - 1)
nomclasseur = Right(.FoundFiles.Item(i), Len(.FoundFiles.Item(i)) - (positiondernierslash))

-------------------------------------------------------------------------------------------------------------------------
' Identifie la date de création ou de modification la plus antérieure

Set fs = CreateObject("scripting.filesystemobject")
Set f = fs.getfile(.FoundFiles.Item(i))

If f.datelastmodified > f.DateCreated Then
plusanciennedate = f.DateCreated
Else
plusanciennedate = f.datelastmodified
End If
Set f = Nothing

------------------------------------------------------------------------------------------------------------------------

Workbooks.Open .FoundFiles.Item(i)

On Error GoTo pasbon

Worksheets("home").Activate

DoCmd.GoToRecord , , acNewRec ' avant chaque lecture, ouvre un nouvel enregistrement

Me.datecreation = plusanciennedate
Me.Nom_Client = Range("AE14")
Me.Raison_WB = Range("AE10")
Me.Raison_Changement_Prix = Range("AE12")
Me.dossier = nomcherché

continuer:


'referme le classeur sans le sauvegarder et sans routage


Workbooks(nomclasseur).Close False, , False


Next 'classeur suivant


End With


Exit Sub


'Début de la gestion d'erreur
'concerne uniquement les classeur dont la feuille HOME n'est pas trouvée


pasbon:


Resume continuer
End Sub

1 réponse

valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
3 mars 2005 à 18:04
Salut,
Dans ton code tu fermes bien ton classeur mais pas ton application donc excel reste en mémoire. donc le mieux c'est de tester en début si excel et chargé si oui tu l'utilises si non tu crée un object Excel

Voilà un bout de code VB6 que tu peux adapter à ton cas

Dim appExcel As Object 'Application Excel
Dim wbExcelModel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Excel.WorkSheet
Dim blRunning As Boolean 'Utilisé pour mémorisé l'état d'Excel au démarage


On Error Resume Next 'Utilisé pour vérifier si Excel s'éxécute


Screen.MousePointer = ccHourglass
'Vérifie si Excel est ouvert
Set appExcel = GetObject(, "Excel.Application") If Err.Number <> 0 Then
blRunning = False 'Excel n'était pas en éxecution
Set appExcel = CreateObject("Excel.Application")
Else
blRunning = True
End If
Err.Clear

On Error GoTo Command1_Click_Error

'Ici on ajoute un classeur
Set wbExcelModel = appExcel.Workbooks.Add(MonWorkBook)
'Quand tu ne te serts plus d'excel
'Penser à le fermer
appExcel.Quit
appExcel = Nothing
wbExcelModel =Nothing
wsExcel = Nothing

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
Rejoignez-nous