IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de ram dans une boucle vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 14
    Par défaut Problème de ram dans une boucle vba
    Bonjour les amis,
    je rencontre un petit soucis sur une macros.
    J'ai un dossier dans lequel j'ai 74000 fichiers.
    je veux y faire quelque recherche (methode find)puis classé les valeurs dans un autre fichier.xlsm.
    Le soucis c'est que sur chaque ouverture de fichier la mémoire s'agrandit et arrive a saturation au bout du 2400e fichier traiter.
    Je ferme chaque fichier ouvert une fois la boucle de traitement fini mais la ram continue d'augmenter.
    Je cherche une raison à cela mais je ne trouve rien je viens donc faire appelle à vos compétence.

    voici la macro que j'ai réalisé.
    A savoir la partie compteur de boucle, je l'ai mise simplement pour savoir sur quel numero de fichier traité la boucle bug.
    merci d'avance les amis.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Sub lok()
     
     
    Dim sf As Object 'déclare la variable sf (Système de Fichiers)
    Dim ca As String 'déclare la variable ca (Chemin d'Accès)
    Dim d As Object 'déclare la variable d (Dossiers)
    Dim fs As Object 'déclare la variable fs (FichierS)
    Dim f As Object 'déclare la variable f (Fichier)
    Dim cl As Workbook 'déclare la variable cl (CLasseur)
    Dim exercice As Workbook 'déclare la variable exercice
     
    'variable code de traitement
    Dim c As Range
    Dim TaValeur As String
    Application.ScreenUpdating = False
     
     
    ca = "C:\wamp64\www\annuaire_mairie\annuaire_txt"      'définit le chemin d'accès (à adapter à ton cas)'
     
    Set sf = CreateObject("Scripting.FileSystemObject") 'définit le système de fichiers sf
    Set d = sf.GetFolder(ca) 'définit le dossier d
    Set fs = d.Files 'définit les fichiers fs
    For Each f In fs 'boucle sur tous les fichiers f
        Workbooks.Open (ca & "\" & f.Name) 'ouvre le fichier
        Set cl = ActiveWorkbook 'définit le classeur cl (la variable cl sera utilisée pour le traitement des données)
     
        'ton code de traitement
        Workbooks("exercice.xlsm").Worksheets("traitement").Range("a2") = Workbooks("exercice.xlsm").Worksheets("traitement").Range("a2").Value + 1
     
            cl.Close SaveChanges:=FalseThen
        Set cl = Nothing
    Next f 'prochain fichier de la boucle
     
    End Sub

  2. #2
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonsoir, une idée! Vous pourriez essayer la modification en rouge.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Code........
    Workbooks("exercice.xlsm").Worksheets("traitement").Range("a2") = Workbooks("exercice.xlsm").Worksheets("traitement").Range("a2").Value + 1
         Set cl = Nothing
          ActiveWorkbook.Close SaveChanges:=FalseThen
        
    Next f 'prochain fichier de la boucle
     
    End Sub
    Cordialement

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    J'ai "adoré" la constante FalseThen
    J'imagine qu'elle doit avoir un rapport avec cette ligne commentée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'ton code de traitement
    et le nom Tavaleur choisi pour une variable.

    Pour être sérieux : un classeur auquel on apporte mille et une modifications sans le sauvegarder est un classeur gourmand en mémoire (il doit de surcroît mémoriser toutes les modifications dans un fichier temporaire). Si l'on veut le soulager, il faut le sauvegarder de temps à autre.

    EDIT :
    J'ai un dossier dans lequel j'ai 74000 fichiers.
    je veux y faire quelque recherche
    Et je n'ose même pas penser à la présence éventuelle, parmi ce tas-là, d'un fichier naturellement énorme ou devenu énorme à la suite d'un accident d'adressage sur le disque dur ou encore non exploitable par Excel. (et je ne vois aucun garde-fou dans le code montré).

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 14
    Par défaut re
    Salut à tous,
    en fait je procède étape par étape pour monter ma macro et je règle chaque problème rencontré au fur et à mesure.
    Pour le coup j'ai ajouté un "doevent" a la fin de la boucle et du coup je n'ai plus la mémoire qui se charge.
    Je me demande si pour le coup le fait est d'utiliser doevent ne va pas ralentir ma macro...
    et j'ai corriger la variable que j'incrémente de integer a long sinon je rencontre une erreur au fichier 32000...
    en tous cas je continue à m'accrocher et je vous remercie pour temps.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Donc, les codes donnés dans l'autre forum, on laisse tomber ? Tu ouvres des fichiers texte dans Excel alors qu'il est plus rapide et moins gourmand de récupérer les valeurs avec un "Open...Close" !

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Theze
    Donc, les codes donnés dans l'autre forum, on laisse tomber ? Tu ouvres des fichiers texte dans Excel alors qu'il est plus rapide et moins gourmand de récupérer les valeurs avec un "Open...Close" !
    Ton intervention nous apprend ce que IMS64 s'est abstenu de nous préciser : il s'agit finalement de simples fichiers texte !

    EDIT : c'est donc bien ce que je pensais (mon message plus haut) : jeu de ping-pong entre deux sites, avec des bouts de copié/collé et des fautes ajoutées.
    Et c'est, je suppose, le même qui m'a mis un pouce rouge anonyme

Discussions similaires

  1. [VBA]Problème de passage dans une boucle
    Par Halima91 dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/03/2007, 04h09
  2. Réponses: 2
    Dernier message: 28/08/2006, 13h16
  3. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  4. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo