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 une feuille et la coller dans une autre: temps d'exécution anormalement long


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2015
    Messages : 156
    Par défaut Copier une feuille et la coller dans une autre: temps d'exécution anormalement long
    Bonjour à tous,

    J'ai ici un code me permettant de copier les cellule d'une feuille d'un classeur et de les coller dans mon classeur principal. Ca fonctionne mais le hick c'est qu'il y a quelque chose d'anormal qui se passe:

    Excel ouvre une deuxième fois le classeur contenant les informations que je cherche à copier. Et cette ouverture prend une plombe, il y a une petite barre de chargement en bas à droite, comme lorsqu'on ouvre un fichier Excel trop gros.

    Pourtant, lorsque l'on effectue la tâche "manuellement", ça semble prendre une fraction de seconde...

    Qu'est-ce qui se passe ?

    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
    '################# Transfert du contenu chargé dans une nouvelle feuille du classeur principal ###############
     
        ThisWorkbook.Sheets("Intermédiaire Formation").Cells.Clear
        Dim Cls As Workbook, MainWB As Workbook
     
        Set MainWB = ThisWorkbook
        Application.DisplayAlerts = False
     
        Set Cls = Workbooks.Open(TextBoxFichierFormation.Text, 2)
     
       '################### Copie le contenu du fichier ouvert et le colle dans la feuille de données provisoires ############
     
                Cls.Sheets(2).Cells.Copy MainWB.Sheets("Intermédiaire Formation").Range("A1")
     
                Cls.Close False 'Ferme le fichier "chargé
     
        '##################################################################################
    Merci d'avance pour l'aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    salut,

    J'ai ici un code me permettant de copier les cellule d'une feuille d'un classeur et de les coller dans mon classeur principal.
    Petite question : le classeur source, il est ouvert j'imagine ?

    Pour une autre piste, je t'invite à lire l’excellent article de SilkyRoad sur le modèle ADO qui permets, entre autre, d'écrire dans un classeur fermé, te permettant ainsi d'éviter de dilapider des ressources mémoires.
    http://silkyroad.developpez.com/VBA/...sFermes/#LIV-B

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

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

    Je tenterais ces deux bouts de code pour voir si ça suffit à résoudre ton problème:

    En début de macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim prevCalc As Variant
    prevCalc = Application.Calculation
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    En fin de macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.ScreenUpdating = True
    Application.Calculation = prevCalc

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2015
    Messages : 156
    Par défaut Re
    Salut,


    Merci pour ta réponse, par contre ça n'a rien changé :/

    Le fichier qui s'ouvre en plus, semble être une copie du fichier principal. et si ça prend autant de temps à s'ouvrir ou à transférer les données, c'est parce qu'Excel comprend que je souhaite copier les cellules une à une ... Donc même les cellules vides, ils créent de la place pour elles.


    Si j'ai su me faire comprendre...

    As-tu une solution ?

    Bien à toi,

    C.

  5. #5
    Invité
    Invité(e)
    Par défaut ça marche pas ça?
    Essai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Transfert()
    Dim NomFichierOrigine As String
    NomFichierOrigine = "Classeur1"
    Dim Wbk1 As Workbook, Wbk2 As Workbook
    Set Wbk1 = ThisWorkbook
    Set Wbk2 = Workbooks.Open(Filename:="D:\CHEMIN\" & NomFichierOrigine & ".xls") 'a adapté
     
     
    Wbk1.Worksheets(3).Cells(1, 1).Value = Wbk2.Worksheets(2).Cells(12, 3).Value 'a adapté
     
    End Sub

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 730
    Par défaut
    Tu dis que tu ouvres le même fichier 2 fois; pourquoi?

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2015
    Messages : 156
    Par défaut
    Re,

    Je t'assure que c'est pas volontaire, mais c'est ce qui se passe. Mon fichier principal s'ouvre une deuxième fois le temps du transfère de donnée puis se re ferme ... In fine les données sont bien transférées mais ça prend des plombes ...

    Excel accorde trop d'importance aux cellules vide et donc ça prend une plombe... est-ce que tu vois ce que j'essaie de dire ?

    Re Firhim,

    Merci pour ta réponse. Cependant, ce que j'essaie de faire est de transférer le contenu d'une page de calcul dans une autre ... Autrement dit, toutes les cellules. Mais mon code prend trop de temps d'exécution et je ne comprends pas pourquoi...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Re,


    Oui j'avais bien compris.. perso je ne vois pas pourquoi ce que j'ai proposé ne fonctionne pas XD, doesn't matter.

    Source : http://silkyroad.developpez.com/VBA/ClasseursFermes/

    Si tu as la curiosité ... (active Microsoft ActiveX Data Objects x.x Library)

    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
     
    Sub RequeteClasseurFerme()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "D:\Users\T0163013\Desktop\TEMP3004\Classeur2.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Feuil1"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
               ";Extended Properties=""Excel 8.0;HDR=NO"""
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit le résultat de la requête dans la cellule A2
        Range("A1:Z1000").CopyFromRecordset Rst 'a adapté
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Dernière modification par Invité ; 13/05/2015 à 16h28.

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 730
    Par défaut
    - En exécutant pas à pas, à quel moment le fichier est-il réouvert une 2ème fois? N'est-ce pas toi qui utilises la méthode Open 2 fois pour le même fichier?
    - Le temps conséquent a-t-il lieu lors de la réouverture du fichier ou lors de la copie?
    - Pourquoi copies-tu tout l'onglet?
    - Si tant est que la copie soit nécessaire, ne peux-tu pas la réduire à la zone utilisée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Cls.Sheets(2).Range("A1")
        .Range(.Range("A1"), .SpecialCells(xlCellTypeLastCell)).Copy MainWB.Sheets("Intermédiaire Formation").Range("A1")
    End With
    Voire un collage par valeur.

  10. #10
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Avec l'enregistreur de macros

    Copier une feuille du classeur actif dans un autre classeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Macro4()
    '
        Sheets("Feuil1").Copy Before:=Workbooks("dates.xlsm").Sheets(1)
    End Sub
    P.S. Quand on fait un clic-droit sur le nom d'une feuille dans Excel, il y a une entrée de menu contextuel : Déplacer ou copier.

    P.P.S. Dans l'éditeur VBE, on peut faire un "quasi-miracle" (c'est un peu charrié, mais bon) en cliquant sur le mot-clef et en appuyant sur

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2015
    Messages : 156
    Par défaut
    Bonjour clementmarcotte,


    Je te remercie infiniment pour ta solution qui a fonctionné à la perfection. Traitement instantané !... Ca a tellement bien fonctionné que j'ai refais le test deux fois pour être sur : p

    J'ai néanmoins du adapter un rien le code, je le poste ci dessous pour si quelqu'un en a besoin. Il renomme la feuille en question puis la supprime en fin de traitement (puisque ici, avec ta solution, la feuille est ajoutée).

    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
    Dim prevCalc As Variant
     
    prevCalc = Application.Calculation
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
       '################# Transfert du contenu chargé dans une nouvelle feuille du classeur principal ###############
     
        Dim Cls As Workbook, MainWB As Workbook
     
        Set MainWB = ThisWorkbook
        Application.DisplayAlerts = False
     
        Set Cls = Workbooks.Open(TextBoxFichierFormation.Text, 2)
     
       '################### Copie le contenu du fichier ouvert et le colle dans la feuille de données provisoires ############
                Dim MaFeuille As Worksheet
                Dim NomDeMaFeuille As String
     
                NomDeMaFeuille = Cls.Sheets(2).Name
                Cls.Sheets(2).Copy Workbooks(ThisWorkbook.Name).Sheets("Données Provisoires Formations")
     
                Set MaFeuille = ThisWorkbook.Sheets(NomDeMaFeuille)
                MaFeuille.Name = "Intermédiaire Formation"
     
                Cls.Close False 'Ferme le fichier "chargé
     
       'Traitement des données à proprement parlé:
     
       ' ...
     
    '#### Cloture de l'extraction :
     
      MaFeuille.Delete 'Supprime la feuille qui n'est qu'un intermédiaire de formation
     
      TextBoxFichierFormation.Text = ""
      Application.DisplayAlerts = True
     
    MsgBox "Extraction terminée !", vbOKOnly, "Succès"
     
    Application.ScreenUpdating = True
    Application.Calculation = prevCalc

    Bonne journée

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 27/07/2014, 10h51
  2. [XL-2007] Copier une plage dans une feuille et la coller dans une autre du même classeur.
    Par kedmard dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2012, 14h55
  3. Réponses: 19
    Dernier message: 13/04/2012, 08h30
  4. [XL-2010] Trier des valeurs dans une feuille et les mettre dans une autre feuille
    Par maharo1 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/12/2011, 15h02
  5. Réponses: 3
    Dernier message: 01/09/2009, 23h48

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