frankfromfrance
Messages postés1Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 3 mars 2005
-
3 mars 2005 à 16:45
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDerniè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
-------------------------------------------------------------------------------------------------------------------------
' 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
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 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