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 :

Boucle surchargée avec multiples insertions de formules : comment l'optimiser ? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    J’ai récupéré un code vba et l’ai retravaillé afin qu’il corresponde à mes besoins :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Option Explicit
    Sub MergeAllWorkbooks()
        Dim MyPath As String, FilesInPath As String
        Dim MyFiles() As String
        Dim Repertoire As FileDialog
        Dim ligne As Long
     
        Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
        If Repertoire.Show = False Then Exit Sub
        MyPath = Repertoire.SelectedItems(1)
        If Right(MyPath, 1) <> "\" Then
            MyPath = MyPath & "\"
        End If
     
        FilesInPath = Dir(MyPath & "*.xl*")
     
       With Application
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
     
            ' création d'autant de nouvelles lignes qu'il y a de fichiers : on compte le nombre de fichiers avec un "do while xxx <>"", on copie une ligne formatée au format souhaité et on insère le nombre de lignes correspondantes. Cela n'a pas l'air de prendre beaucoup de temps car si j'exécute seulement ce bout de code cela fonctionne rapidement sur des dossier avec 300 fichiers excel...
     
        Do While FilesInPath <> ""
            filep = MyPath & FilesInPath
            FilesInPath = Dir()
     
            Range("B" & ligne).Formula = "='" & filep & "'!toto1"
            Range("C" & ligne).Formula = "='" & filep & "'!toto2"
            Range("D" & ligne).Formula = "='" & filep & "'!toto3"
     
            (idem sur une quarantaine de colonnes !)
     
            ligne = ligne + 1
        Loop
     
    ExitTheSub:
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = xlCalculationAutomatic
        End With
    End Sub
    Cela marche bien quand il y a une dizaine de fichiers excel dans le dossier mais je reçois une erreur 400 quand il y a beaucoup de fichiers excel.

    Je suppose que cela vient du fait que ma boucle n'est pas assez performante.
    Je crois que c'est l'insertion d'une quarantaine de formule sur chaque ligne qui doit poser problème mais je ne vois pas comment optimiser ça ?

    Pourriez-vous m’aider svp ?

    J'ai pensé à inscrire mes nom de cellules (toto1, toto2, toto3, ...) dans la ligne supérieur du tableau excel (en ligne 1 par exemple) une fois pour toutes pour ensuite insérer uniquement sur la première colonne une formule du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =chemin du fichier excel.xls'! & INDIRECT("A1")
    ... et étendre les formule jusqu'à la fin du tableau (après être sorti de la boucle).
    Je pensais que cela serait moins consommateur de ressources.
    Mais ça ne semble pas marcher (#REF).
    Est-ce une piste à creuser selon vous... ?

  2. #2
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Salut,
    Peux tu expliquer ce que tu veux obtenir ?
    Pour parcourir des fichiers il vaut mieux utiliser FSO

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Je veux créer un tableau de synthèse de plusieurs fichiers excel.
    Tous ces fichiers excel ont des cellules nommées de façon identique (toto1 est le nom d'une cellule présente dans tous les fichiers excel).

    Le tableau est structuré ainsi :
    - 1 ligne par fichier
    - 40 colonnes, avec une variable par colonne (même fichier mais référence à une cellule nommée différemment)

    Toutes les cellules du tableau doivent être remplies avec des liens (et pas directement avec les valeurs des cellules en dur).

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour

    j'ai testé ton code (avec un léger remaniement) sur 750 fichiers et 120 colonnes sans erreur

    J'ai ajouté un dovents
    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
    35
    36
    37
    Sub MergeAllWorkbooks()
    Dim MyPath As String, FilesInPath As String, Filep As String
    Dim Repertoire As FileDialog
    Dim Ligne As Long
     
    With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With
     
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    If Repertoire.Show = True Then
        MyPath = Repertoire.SelectedItems(1)
        Set Repertoire = Nothing
     
        If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
     
        FilesInPath = Dir(MyPath & "*.xl*")
        Do While FilesInPath <> ""
            Filep = Replace(MyPath & FilesInPath, "'", "''")    'Au cas où le nom contient l'apostrophe
     
            Ligne = Ligne + 1
            Range("B" & Ligne).Formula = "='" & Filep & "'!toto1"
            Range("C" & Ligne).Formula = "='" & Filep & "'!toto2"
            Range("D" & Ligne).Formula = "='" & Filep & "'!toto3"
            DoEvents
            FilesInPath = Dir()
        Loop
    End If
     
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Merci mercatog !

    Si j'ai bien compris "DoEvents" permet d'attendre la fin de l'exécution du code au lieu de laisser le programme planter automatiquement au bout de x secondes ?

    Cela semble très bien marcher effectivement.

    En revanche l'utilisateur a un curseur de souris « classique » s’affiche.
    Y a-t-il un moyen visuel efficace pour indiquer que le programme est bien en train d’agir ?

    Je pensais à remplir une cellule avec un texte « Programme en cours » au début du code et à supprimer son contenu à la fin du code.

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Ajoute au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
        .Cursor = xlWait
        .StatusBar = "En cours de traitement...."
    End With
    Et à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
        .Cursor = xlDefault
        .StatusBar = False
    End With
    MsgBox "Traitement terminé"
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Parfait !
    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] boucle For avec multiple conditions d'arret
    Par yvespi dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/05/2010, 09h30
  2. [MySQL] Insertions multiples avec un ON DUPLICATE KEY comment ça marche?
    Par Sayrus dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/04/2008, 13h41
  3. Réponses: 9
    Dernier message: 26/05/2007, 14h53
  4. [C#] Comment appeler une procédure stockée avec multiple SELECT ?
    Par Piolet dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/06/2006, 16h04
  5. insertion avec multiples lignes
    Par f066457 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/03/2006, 23h52

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