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 :

Macro avec ouverture de fichiers contenant des macros


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut Macro avec ouverture de fichiers contenant des macros
    Bonjour à tous,
    J'ai créé une macro dont l'objectif est de collecter des informations dans plusieurs fichiers Excel, ceci afin de faire une synthèse générale.
    La macro crée fonctionne correctement mais je trouve que le temps de traitement est un peu long :

    • depuis mon fichier j'ouvre un classeur, copie les données qui m’intéressent ( cellules J6:AX10 de l'onglet Data), ferme le classeur et colle les données dans mon classeur de synthèse dans un onglet spécifique.

    • j'ouvre à nouveau le même classeur, copie d'autres données (cellules J12:AX16 de l'onglet Data), ferme le classeur et colle les données sur une seconde feuille de mon classeur synthèse.


    Cette opération est répétée autant de fois que j'ai de classeur à traiter.

    Lors de tests en pas à pas, je me suis aperçu que lors de l'ouverture de mes fichiers, l'éditeur de macro ouvrait tous les modules de chacun des fichiers, en effet tous les fichiers que j'ai à traiter contiennent plusieurs modules de code et autres UserForm.

    Je penses donc que le temps de traitement se trouve augmenté à cause de cela.

    Voici mon code
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    Option Explicit
     
    Sub Project_Progress()
    Dim WkPath As String
    Dim File As String
    Dim Fname As String
    Dim WBK1 As Workbook
    Dim WBKDest As Workbook
    Dim Wk As Worksheet
    Dim Baseline As Worksheet
    Dim Actual As Worksheet
    Dim Curv As Worksheet
    Dim WKS As Range
    Dim Bsl As Range
    Dim Act As Range
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim NumbCell As Integer
    Set Wk = ThisWorkbook.Sheets("Main")
    Set Baseline = ThisWorkbook.Sheets("Baseline")
    Set Actual = ThisWorkbook.Sheets("Actual")
    Set Curv = ThisWorkbook.Sheets("Curve")
    Set WKS = Wk.Range("A1")
    Set Bsl = Baseline.Range("A1")
    Set Act = Actual.Range("A1")
    WKS = WKS.Offset(0)
    Bsl = Bsl.Offset(0)
    Act = Act.Offset(0)
    WkPath = ThisWorkbook.Path & "\"
    Application.ScreenUpdating = False
     
    File = Dir(WkPath)
     
    Wk.Range("A1:" & Range("A1").SpecialCells(xlCellTypeLastCell).Address).ClearContents ' On efface toute les données
     
    'La 1ère boucle ci_dessous va rechercher tous les fichiers du répertoire
    'et coller les résultats dans la colonne C
    Do While File <> ""
            i = i + 1
            Wk.Range("C" & i) = File
            File = Dir
    Loop
     
    i = 0
     
    'La deuxième boucle recherche les fichiers dont le nom contient PACKAGE et les colle en colonne A
    Do While WKS.Offset(i, 2) <> ""
        If WKS.Offset(i, 2) Like "*PACKAGE*" Then
     
                    WKS.Offset(j, 0) = WKS.Offset(i, 2)
     
        End If
    i = i + 1
    If WKS.Offset(j, 0) = 0 Then
    j = j
    Else
    j = j + 1
    End If
    Loop
     
    'Ici on va effacer les données de la colonne C
     
    Wk.Range("C1:" & Range("C1").SpecialCells(xlCellTypeLastCell).Address).ClearContents
     
    Application.DisplayAlerts = False
     
    With Sheets("Main")
        NumbCell = .Cells(.Rows.Count, 1).End(xlUp).Row - 1 ' On compte le nombre de fichiers présents en colonne A
    End With
     
    j = 0
     
    Set WBKDest = ThisWorkbook
     
        For i = 0 To NumbCell
     
                Fname = WKS.Offset(i, 0) 'Donne le nom du fichier à ouvrir
                 ' Copie des données de la baseline
                Workbooks.Open WkPath & Fname 'ouvre le fichier
                Set WBK1 = ActiveWorkbook
                Dim Data As Worksheet 'déclaration des varibles du fichier ouvert
                Dim Dest As Range
                Set Data = WBK1.Sheets("Data")
                Set Dest = Data.Range("J6")
                'Dest = Dest.Offset(0)
                Range(Dest, Dest.End(xlToRight).End(xlDown)).Copy  ' Copie des données
                WBK1.Close 'Fermeture du classeur
                Set WBKDest = ActiveWorkbook
                Bsl.Offset(j, 0).PasteSpecial 'Colle les données dans le classeur origine
     
                    'Copie des Données Actual
                 Workbooks.Open WkPath & Fname
                 Set WBK1 = ActiveWorkbook 'ouvre le fichier
                 Dim Data2 As Worksheet 'déclaration des varibles du fichier ouvert
                 Dim Dest2 As Range
                 Set Data2 = WBK1.Sheets("Data")
                 Set Dest2 = Data2.Range("J12")
                 Dest2 = Dest2.Offset(0)
                 Range(Dest2.Offset(0, 0), Dest2.Offset(0, 0).End(xlToRight).End(xlDown)).Copy ' Copie des données
                 WBK1.Close
                 Set WBKDest = ActiveWorkbook
                 Act.Offset(j, 0).PasteSpecial 'Colle les données dans le classeur origine
     
                j = j + 6
                k = k + 1
     
        Next i
     
    Application.ScreenUpdating = True
     
    End Sub
    Existe-t-il une astuce en Vba pour désactiver les macros contenues dans les fichiers à ouvrir puis les réactiver à la fin ou tout autre astuce pour simplifier la manipulation.
    Merci pour votre aide et vos conseils
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Cernez l'instruction "Workbooks.Open WkPath & Fname 'ouvre le fichier" comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.EnableEvents = False    '///ajout
    Workbooks.Open WkPath & Fname 'ouvre le fichier
    Application.EnableEvents = True     '///ajout

  3. #3
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Bonjour,
    Merci pour l'info mais cette astuce ne semble pas diminuer le temps de traitement...
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour,

    l'utilisation de boucles est souvent la cause de ralentissement pour copier / coller des données par exemple
    alors qu'il y a les puissants filtres ou encore l'affectation directe d'une formule de calculs à une plage de cellules …

    Mieux vaut utiliser la méthode Copy directement en précisant son paramètre Destination au lieu de Copy puis Paste.

    En dehors de désactiver l'affichage de l'écran et les évènements, si la feuille traitée est dotée de formules dans ses cellules
    ou de mise en forme conditionnelle, mieux vaut aussi penser à désactiver le mode de calcul automatique !


    __________________________________________________________________________________________________
    Tous unis, tous Charlie
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Mieux vaut utiliser la méthode Copy directement en précisant son paramètre Destination au lieu de Copy puis Paste.
    Bonjour Marc,
    Pourrais-tu m'en dire un peu plus sur cette méthode?
    J'ai récemment utilisé ceci pour copier une feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wkB.Sheets("Feuil1").Copy before:=wkA.Sheets(1)
    Comment appliquer cette méthode à une plage de cellule?

    Autre piste peut-etre : ouvrir les fichiers en lecture seule ? Mais là je me demande si je pourrais copier mes cellules

    Merci pour ton aide
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut



    Là tu copies l'intégralité d'une feuille dans une nouvelle.

    Mon exemple concernait la méthode Range.Copy et son paramètre Destination,
    la nouvelle feuille devant déjà être créée …

    Avec ou sans condition, le plus rapide est souvent le filtre avancé.

    Aucun souci pour lire des données d'un fichier en lecture seule.
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Marc

    L'exemple que je donnais concernait effectivement la copie de la feuille entière.

    Ce que je souhaiterai c'est un exemple de code pour un range.

    Sinon quel est le code pour ouvrir un fichier en lecture seule ?

    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Et l'exemple de l'aide ?

    Pour le fichier, voir l'aide de la méthode Workbooks.Open et son paramètre ReadOnly,
    livré sur un plateau par le Générateur de macros …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Marc
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open (WkPath & Fname,ReadOnly)as workbook
    mais j'ai toujours le message
    Erreur de Compilation Attendu : )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.Open (WkPath & Fname,ReadOnly)
    message
    Erreur de Compilation Attendu : =
    Quelle est la bonne syntaxe?
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    La bonne syntaxe est celle livrée sur un plateau par le Générateur de macros :

    ReadOnly:=True ou directement True après la virgule et non pas ReadOnly !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  11. #11
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Marc,
    J'ai bien tenté de passer par l'éditeur de macro, mais il ne m'a rien livré sur un plateau même après avoir spécifié que le fichier que je souhaitais ouvrir devrait l’être en lecture seule.
    L'aide m'a fourni des infos, j'ai tenté de les adapter mais la solution ne m'a été, là non plus, livrée sur un plateau.

    En tout cas voilà ce que j'ai fini par trouver, et pas sur un plateau...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.Open Filename:=WkPath & Fname, ReadOnly:=True
    Mais, car il y a un mais, cela ne résout pas mon problème initial qui est la lenteur du traitement à cause de l'ouverture de fichiers avec des macros...

    Il y a peut-être une solution que je vais essayer:
    • enregistrer dans un premier temps le classeur sans macro
    • ouvrir le classeur
    • copier les données
    • fermer le classeur en l'enregistrant comme un fichier supportant les macros


    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/04/2015, 12h33
  2. [XL-2003] repérer les fichiers contenant des liaisons et/ou des macros
    Par ouisansdoute dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/06/2012, 22h47
  3. [XL-2007] problème de recalcul des macro à l'ouverture du fichier excel?
    Par law56100 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 01/09/2009, 13h38
  4. Import avec fichier contenant des guillemets
    Par Maximus06 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/07/2006, 12h07
  5. [VBA-E]Lancement de macro à l'ouverture du fichier
    Par bastien62200 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/02/2006, 23h20

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