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 :

Copier le contenu de plusieurs fichiers sur un seul avec fileSystemObject en late bending


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Copier le contenu de plusieurs fichiers sur un seul avec fileSystemObject en late bending
    Bonjour à tous

    J'ai fait une macro qui:
    - ouvre plusieurs fichiers excel (~200)
    - copie une plage de cellule(avec un nombre de ligne variable) de la première page
    - les colle sur un fichier "central" les unes à la suite des autres

    Mon problème est que lorsque mon fichier excel "central" est sur le réseau de ma société, la macro ne fait rien. Je pense que cela est du à la fonction "dir" que j'utilise(à cause des noms des drives...).
    Donc après avoir cherché un peu il m'a semblé que le plus pertinent pour faire ce genre de manipulation était d'utiliser la bibliothèque "fileSystemObject".
    Mon autre problème est que ce fichier doit pouvoir être utilisé par d'autres personnes ("de vraies quiches en Excel" comme ils disent).
    Donc il faut que je me serve des fileSystemObject en "late bending".
    Mais ça fait tout juste un mois que je me penche sur le vba, du coup je dois bien avouer que la rédaction de cette macro est un peu compliqué pour moi.

    Ma macro (lorsqu'elle n'est pas sur le réseau de ma boite) prend ~2minutes à s’exécuter. J'ai l'impression qu'en utilisant les fileSystemObject l'opération sera plus rapide.

    C'est pourquoi si une âme charitable ou un expert du vba en manque, passe par là et a une petite idée pour rédiger tout ça, je suis preneur!

    Merci!

  2. #2
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Effectivement tu commences pas par le plus simple

    D'abord une question Que veux-tu dire par "late bending" ? je me mefie des jargons d'entreprise qui utilise quelques fois des mots pour d'aute choses
    Exemple : Un tableur est pour moi le logiciel comme Excel alors qu'au boulot un tableur est un Classeur !!!

    Et puis va voir Ici c'est très utile !

    j'attend ta réponse et puis aussi poste ton code

    A bientôt
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Quelle vitesse pour répondre!

    Les termes late bending et early bending viennent de différents sites ou forums internet où j'ai cherché.

    Et bien pour utiliser le filesystemobject en "early bending", il faut activer le module dans le menu "outil" puis "référence"...
    Or on m'a bien fait comprendre que c'était déjà au delà des compétences des gens qui allaient s'en servir.
    Donc il faut appeler ce module en "late bending".

    Exemple de ce que j'en ai compris:
    -early bending:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim oFS  As FileSystemObject 
    Set oFS = New FileSystemObject
    -late bending:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim GestionFichier As Object
    Set GestionFichier = CreateObject("Scripting.FileSystemObject")
    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
    46
    47
    48
    49
    50
    Sub import_analyse()
     
    Dim Fichier As String, Chemin As String, RootDir As String, ImportDir As String, v%
     
    Dim Wb As Workbook
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False 
     
    ImportDir = "Analyse"
     
    RootDir = ActiveWorkbook.Path
     
    Chemin = RootDir & "\" & ImportDir & "\"
     
    Fichier = Dir(Chemin & "*.xls")
     
    v = 12 'première ligne à copier
     
    Do While Fichier <> ""
     
    Set Wb = Workbooks.Open(Chemin & Fichier)
     
        Dim dernlig As Long
     
        dernlig = Cells(Rows.Count, 1).End(xlUp).Row - 16 'Dernière ligne utile
     
        Range("A12:k" & dernlig).Select 'copie du tableau voulu
        Selection.Copy
        Windows("Central.xlsm").Activate
        Sheets(1).Select
     
        Cells(v, 1).Select
        ActiveSheet.Paste
     
    Wb.Close False
     
    Set Wb = Nothing
     
    Fichier = Dir
     
    v = v + dernlig - 11
     
    Loop
     
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
     
     
    End Sub
    Je viens de me rendre compte que ce n'est pas "bending" mais "binding".

  4. #4
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Ok
    Citation Envoyé par Phiff Voir le message
    Donc après avoir cherché un peu il m'a semblé que le plus pertinent pour faire ce genre de manipulation était d'utiliser la bibliothèque "fileSystemObject".
    mais tu n'as pas besoin des FSO pour ouvrir des fichiers Excel !?

    Citation Envoyé par Phiff Voir le message
    Bonjour à tous
    Mon problème est que lorsque mon fichier excel "central" est sur le réseau de ma société, la macro ne fait rien. Je pense que cela est du à la fonction "dir" que j'utilise(à cause des noms des drives...).
    c'est pas si sûr ...

    Bon 2 conseils d'abord :

    met en commentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    tant que ta macro n'est pas au point laisses les commentaires cela peut aider à debogger

    n'employes pas les selects cela ralenti le code
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Range("A12:k" & dernlig).Select 'copie du tableau voulu
        Selection.Copy
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A12:k" & dernlig).Copy
    Je voudrais savoir tes classeurs sont toujours dans le même dossier? Y a t'il des exeptions ?

    a bientôt
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui je n'ai pas besoin des FSO mais je pensais que c'était la fonction dir qui posait problème. Et puis j'ai souvent lu que cette fonction était assez archaïque et était abandonnée pour les FSO.
    Mais si ce n'est pas le cas et qu'on peut résoudre mon problème sans, alors tant mieux!

    Oui tout les fichiers "sources" sont dans le même dossier("Analyse" dans le code). Et ce dossier est lui-même dans le même dossier que mon fichier "central".

    Pour ce qui est des "select", je le sais bien mais je ne sais pas pourquoi j'y suis souvent contraint, écrire directement comme tu l'as fait me renvoi souvent une erreur.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu version sans select ou activate
    Bonjour
    en effet le problèmes des activâtes et select est assez récurrents dans les code de débutants

    a tu entendu parler des variables tableaux?

    celles si te permette de mettre en mémoires vives une plage de cellules

    voila un exemple comme ca vite fait utilisant cette méthodes dans la boucle dir
    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
    46
    47
    48
    49
    50
    51
    Sub import_analyse()
     
    Dim Fichier As String, Chemin As String, RootDir As String, ImportDir As String, v%
     Dim tablo As Variant
    Dim Wb As Workbook
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
    ImportDir = "Analyse"
     
    RootDir = ActiveWorkbook.Path
     
    Chemin = RootDir & "\" & ImportDir & "\"
     
    Fichier = Dir(Chemin & "*.xls")
     
    v = 12 'première ligne à copier
     
    Do While Fichier <> ""
     
    Set Wb = Workbooks.Open(Chemin & Fichier)
        Dim dernlig As Long
     'ici tu detecte la ligne limite de ton tableau a copier
        dernlig = Cells(Rows.Count, 1).End(xlUp).Row - 16 'Dernière ligne utile
     'ici la variable tablo devient le range qui est determiner juste au dessus
        tablo = Range("A12:k" & dernlig) 'copie du tableau voulu dans la variable tablo
       'ici tu ferme le classeur que tu viens d'ouvrir pour copier la plage desirée
        Wb.Close False
           'comme tu viens de fermer le classeur a copier le classeur (central) deviens actif
        'il n'est donc plus necessaire d'activer ou desactiver ainsi que des select a tout va
     
        'maintenant on  place le tableau a partir de la cellule (v,1)en dimensionnant avec la dimention du (tablo)
        Cells(v, 1).Resize(UBound(tablo, 11)) = tablo
     
     'bien qu'ici aussi je supprimerais le calcul de v en me servant de (end(xlup))-11
    'mais bon c'est toi qui vois
     
    Set Wb = Nothing
     
    Fichier = Dir
     
    v = v + dernlig - 11
     
    Loop
     
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
     
     
    End Sub
    a mediter

    édit: j'oubliais de préciser que cette méthode réduira le temps, d'exécution de 80% c'est pas négligeable
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, peut-être ici, mais il faudra adapter à ton contexte.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut code netoyé
    re
    exemple de code plus propre
    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
    Sub import_analyse()
    Application.ScreenUpdating = False: Application.DisplayAlerts = False
    Dim Fichier As String, Chemin As String, v As Long, tablo As Variant, Wb As Workbook, dernlig As Long
    Chemin = ThisWorkbook.Path & "\Analyse\"
    Fichier = Dir(Chemin & "*.xls")
    Do While Fichier <> ""
    Set Wb = Workbooks.Open(Chemin & Fichier)
        dernlig = Cells(Rows.Count, 1).End(xlUp).Row - 16 'ici tu detecte la ligne limite de ton tableau a copier
        tablo = Range("A12:k" & dernlig) 'copie du tableau voulu dans la variable tablo
         Wb.Close False: Set Wb = Nothing 'ici tu ferme le classeur que tu viens d'ouvrir pour copier la plage desirée
            With Sheets(1)
            v = IIf(v < 12, 12, .Cells(Rows.Count, 1).End(xlUp).Row + 1) 'recherche de la premiere ligne de libre a la suite dans le classeur central
            .Cells(v, 1).Resize(UBound(tablo, 11)) = tablo 'maintenant on  place le tableau a partie de la cellule (v,1)en dimensionnant avec la dimention du (tablo)
            End With
    Fichier = Dir
    Loop
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'avais bien vu les tableaux mais le code m'avait un peu découragé de l'utiliser, mais si c'est si efficace je vais m'y plonger.
    Merci ça va clairement plus vite mais ça ne résout toujours pas le problème d'ouverture des fichiers lorsque je suis sur le réseau de l'entreprise.
    Merci quand même c'est déjà une une amélioration pour ma macro.

    Je ne pensais pas que rentrer la plage de cellule dans une variable dimensionnée pouvait accélérer le code.

    Je viens seulement de regarder ton lien kiki, c'est génial, j'ai hâte d'être lundi pour l'essayer sur le réseau.

  10. #10
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, puisque tu as accès à un réseau ( ce qui n'est plus mon cas ), il faudrait voir si en mettant l'application sur le serveur et un alias sur ton pc, par rapport à l'application directement sur ton pc, si cela améliore ou pas les choses au niveau tu temps ?

Discussions similaires

  1. copier le contenu d'un fichier sur Notepad
    Par sdblepas dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 24/08/2009, 11h39
  2. Réponses: 5
    Dernier message: 12/03/2009, 17h06
  3. copier le contenu d'un fichier dans un autre avec séparateur
    Par sws2008 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 03/12/2008, 09h56
  4. exporter cellules de plusieurs fichiers sur un seul fichier
    Par sapeur37 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/11/2006, 09h46
  5. Comment récupérer le contenu de plusieurs fichiers textes ?
    Par calimero2611 dans le forum Langage
    Réponses: 9
    Dernier message: 19/02/2006, 15h45

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