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 :

Code trop lent: recuperation de donnees dans un autre classeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 59
    Points
    59
    Par défaut Code trop lent: recuperation de donnees dans un autre classeur
    Bonjour,

    J'ai une liste de donnees dans un premier classeur. Le code que j'ai ecrit ouvre un 2e classeur excel qui contient les donnees pour le mois en cours. Je copie/colle ces donnees mensuelles dans le premier classeur.
    Seulement voila, mon code prend 3 plombes, et je ne sais pas pourquoi.
    Lorsque j'omets "Application.ScreenUpdating = False", je vois a l'ecran, que les chiffres du 2e classeur sont copies/colles dans le 1er un a un, a la vitesse, d'un chiffre par seconde.

    Voici le 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
    Sub trouver_fichier_CARM() 'et le compiler avec les autres donnees de l'annee
     
    Dim dossier, fichier As String
    Dim aux() As Variant
    Dim borne, borne2 As Single
    Dim zoneAcopier As Range
     
    dossier = "G:\XXX\Sampling\list since Nov2008\"
     
    ChDrive dossier: ChDir dossier
       fichier = Dir("*" & Range("current_month") & "*09*")
       Sheets("Ext").Range("B2") = UCase(fichier)
     
     
       Workbooks.Open Filename:="G:\XXX\Sampling\list since Nov2008\" & fichier
       Workbooks(fichier).Activate
     
     
    Application.ScreenUpdating = False
     
       'dimentionner le tableau auxiliaire
       borne = ActiveWorkbook.Sheets(1).Columns(1).Range("A1").CurrentRegion.Columns(1).Cells.Count - 1
       ReDim Preserve aux(1 To borne, 1 To 10)
     
       'enregistrer les donnees dans le tableau auxiliaire
       For i = 1 To borne   'lignes
        For j = 1 To 10   'colonnes
           aux(i, j) = ActiveWorkbook.Sheets(1).Cells(i + 1, j).Value
     
        Next j
       Next i
     
       'fermer et ouvrir les classeurs
       ActiveWorkbook.Close
       Workbooks("list 2009").Activate
     
       'recopier les donnnees dans le tableau general
       borne2 = ActiveWorkbook.Sheets(1).Columns(1).Range("A1").CurrentRegion.Columns(1).Cells.Count
     
       For i = 1 To borne   'lignes
        For j = 1 To 10   'colonnes
           ActiveWorkbook.Sheets(1).Cells(i + borne2, j).Value = aux(i, j)
     
        Next j
       Next i
     
    Application.ScreenUpdating = True
     
    End Sub
    Merci de m'aider a l'optimiser, car ca prend une minute pour remplir 10 lignes a peine!

  2. #2
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    Bonjour nianko,

    Pourquoi copier les données une première fois dans un tableau auxilliaire puis dans le tableau de destination?

    Pourquoi ne pas copier directement de la feuille source à la feuille destination?

    Peux-t-on en savoir un peu plus sur ton tableau?
    est-ce qu'il y aura toujours 10 lignes ou peux-t-il y en avoir plus?

    voici un petit code qui permet de copier la plage (A1:J10) d'un deuxième classeur dans le premier classeur et ensuite ferme le classeur ouvert par macro.
    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
     
    Sub essaicopie()  
    Dim i As Long
     
      'workbooks(1) = activeworkbook
      'ouverture de workbook(2)
       Workbooks.Open Filename:="C:\Documents and Settings\user\Bureau\essai.xls"
     
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
       'enregistrer les donnees dans la feuille de destination
       For i = 1 To 10  'lignes
        Workbooks(1).Sheets(1).Range("A" & i & ":J" & i) = Workbooks(2).Sheets(1).Range("A" & i & ":J" & i).Value
       Next i
     
       'fermer  le classeur source
       Workbooks(2).Close
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    End Sub
    Ceci est assez rapide je pense moins de 10 secondes vu le peu de données traitées.
    A voir et à adapter a ton cas.

    A mettre dans le classeur qui recevra les données

    A+
    @+

    Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
    Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
    Ou sur si ce n'est pas le cas

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    je n'ai pas pu tester, j'ai pas les mêmes fichiers.
    Essaye..
    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 trouver_fichier_CARM() 'et le compiler avec les autres donnees de l'annee
    Dim borne As Integer, borne2 As Integer
     
        dossier = "G:\XXX\Sampling\list since Nov2008\"
     
        ChDrive dossier: ChDir dossier
        fichier = Dir("*" & Range("current_month") & "*09*")
        Sheets("Ext").Range("B2") = UCase(fichier)
        Workbooks.Open Filename:="G:\XXX\Sampling\list since Nov2008\" & fichier
     
        borne = Workbooks(fichier).Sheets(1).Columns(1).Range("A1").CurrentRegion.Columns(1).Cells.Count - 1
        borne2 = Workbooks("list 2009").Sheets(1).Columns(1).Range("A1").CurrentRegion.Columns(1).Cells.Count - 1
     
        Workbooks(fichier).Sheets(1).Range(Cells(1, 1), Cells(10, borne)).Copy Workbooks("list 2009").Sheets(1).Cells(1, borne2)
     
     
      'fermer et ouvrir les classeurs
       Workbooks(fichier).Close
    End Sub
    D'après ton code tu ajoute au bout des colonnes !
    Hum.., ça devrait prendre moins d'une seconde.
    A+

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

Discussions similaires

  1. TCD avec des donnees dans un autre classeur
    Par nana85 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/04/2008, 11h24
  2. récupération de données dans état
    Par philpaul dans le forum Access
    Réponses: 1
    Dernier message: 03/09/2006, 14h42
  3. Recuperation de donnees dans un fichier texte.
    Par quentinoux dans le forum C++
    Réponses: 6
    Dernier message: 27/07/2006, 16h59
  4. recuperation des donnees dans un FILE* non imprime
    Par darkVador2 dans le forum XML
    Réponses: 8
    Dernier message: 30/06/2006, 07h34
  5. [Eclipse] Editeur de code trop lent
    Par Benzeghiba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 10/11/2005, 14h02

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