begin process at 2012 02 14 08:31:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Langages dérivés

 > 

VBA

 > 

Macro lente


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Macro lente

vendredi 23 février 2007 à 10:53:54 | Macro lente

falafala

Bonjour à tous,

J'ai réalisé une macro simple qui permet de venir chercher des données dans un onglet et de venir les coller dans un autre onglet.

Parfois, ma macro est immédiate, parfois elle met très longtemps pour récupérer mes données.

Est ce que qq'un peut m'aider?

Je vous remercie par avance
vendredi 23 février 2007 à 11:12:52 | Re : Macro lente

MPi

Il faudrait que tu mettes le code ou du moins la méthode que tu emploies pour faire ta copie.

Est-ce que tu copies tout d'un bloc ? une sélection quelconque qui peut changer d'une fois à l'autre ?
Est-ce qu'il y a des formules dans le programme dans lequel tu fais le collage ? Si oui, beaucoup ?
..............................

MPi
vendredi 23 février 2007 à 11:16:43 | Re : Macro lente

falafala

Le texte de ma macro est ci dessous.

Le principe est simple. J'ai un onglet qui s'appelle données et un onglet qui s'appelle traitement. Un utilisateur renseigne différentes colonnes dans l'onglet données (7 colonne) et la macro recopie ligne par ligne chacune de ces données et rajoute 4 colonnes supplémentaires en faisant des traitements.

J'ai testé la macro hier sur 3000 lignes, elle a été instantannée. Et là, ca prend au moins 1 seconde par ligne.


[CODE]Sub AlimenteOngletTraitements()
'le 22 février
'Jonathan Krief
'Adopale


'reload les variables
INDISPO = "Non Disponible"


'je récupère le nombre de lignes à traiter
Dim nb_lignes As Long
nb_lignes = Sheets("Données").Range("B65536").End(xlUp).Row

 'nettoyage de la feuille traitement
    Sheets("Traitements").Select
    Range("A2:K" & nb_lignes).Delete   'supprime les cellules (et non seulement leur contenu)
   
    Sheets("Données").Select


Dim ligne As Long
Dim age As Long
Dim datearrivee As Date



'boucle sur les lignes
For ligne = 2 To nb_lignes + 1
With Sheets("Traitements")
   
        '***************** Age *****************
        age = Sheets("Données").Range("D_Age").Offset(ligne - 1).Value
       
        .Range("T_Age").Offset(ligne - 1, 0).Value = age
       
       
        '***************** Date *****************
        datearrivee = Sheets("Données").Range("D_Datearrivee").Offset(ligne - 1).Value
       
        .Range("T_Datearrivee").Offset(ligne - 1, 0).Value = datearrivee
       
        '***************** Heure d'arrivée *****************
              
        .Range("T_Heurearrivee").Offset(ligne - 1, 0).Value = Sheets("Données").Range("D_Heurearrivee").Offset(ligne - 1).Value
       
        '***************** Heure de sortie *****************
              
        .Range("T_Heuresortie").Offset(ligne - 1, 0).Value = Sheets("Données").Range("D_Heuresortie").Offset(ligne - 1).Value
       
        '***************** Biologie *****************
              
        .Range("T_Bio").Offset(ligne - 1, 0).Value = Sheets("Données").Range("D_Bio").Offset(ligne - 1).Value
       
       
        '***************** Radiologie *****************
              
        .Range("T_Radio").Offset(ligne - 1, 0).Value = Sheets("Données").Range("D_Radio").Offset(ligne - 1).Value

       
        '***************** Hospitalisation *****************
              
        .Range("T_Hospitalisation").Offset(ligne - 1, 0).Value = Sheets("Données").Range("D_Hospitalisation").Offset(ligne - 1).Value

        '***************** Type de patient *****************
              
        If Sheets("Données").Range("D_Hospitalisation").Offset(ligne - 1).Value = "Oui" Then
            .Range("T_Type").Offset(ligne - 1, 0).Value = "Hospitalisation"
        Else
            If (Sheets("Données").Range("D_Bio").Offset(ligne - 1).Value = "Oui" Or Sheets("Données").Range("D_Radio").Offset(ligne - 1).Value = "Oui") Then
            .Range("T_Type").Offset(ligne - 1, 0).Value = "Consultation avec acte"
           
            Else
            .Range("T_Type").Offset(ligne - 1, 0).Value = "Consultation sans acte"
            End If
           
        End If
     
     
      '***************** Classe d'âge *****************
              
        If Sheets("Données").Range("D_Age").Offset(ligne - 1).Value < 16 Then
            .Range("T_Classe").Offset(ligne - 1, 0).Value = "0-15 ans"
       
        ElseIf Sheets("Données").Range("D_Age").Offset(ligne - 1).Value < 76 Then
            .Range("T_Classe").Offset(ligne - 1, 0).Value = "16-74 ans"
           
        Else
            .Range("T_Classe").Offset(ligne - 1, 0).Value = "Plus de 75 ans"
             
        End If
       
      '***************** Délai *****************
              
        If .Range("T_Heuresortie").Offset(ligne - 1).Value - .Range("T_Heurearrivee").Offset(ligne - 1).Value < 0 Then
            .Range("T_Durée").Offset(ligne - 1, 0).Value = INDISPO
               
        Else
            .Range("T_Durée").Offset(ligne - 1, 0).Value = .Range("T_Heuresortie").Offset(ligne - 1).Value - .Range("T_Heurearrivee").Offset(ligne - 1).Value
           
           
        End If
       
        '***************** Heure d'arrivée *****************
            .Range("T_Heurearriveesansminute").Offset(ligne - 1, 0).Value = Hour(Range("T_Heurearrivee").Offset(ligne - 1, 0).Value)
       
    End With
   
Next ligne


End Sub

[/CODE]
vendredi 23 février 2007 à 11:19:05 | Re : Macro lente

jmfmarques

Membre Club
Si la vitesse varie, je suppose que celà est dû à plusieurs raisons, dont le nombre et la taille des données.

Il faut y ajouter le temps pris par l'affichage lui-même, surtout s'il est accompagné de "recalculs"...
Il est alors sans doute intéressant d'inhiber cet affichage avant de lancer ton opération puis de le rétablir tout de suite après.
vendredi 23 février 2007 à 23:07:23 | Re : Macro lente

mortalino

Membre Club


Salut,

pour gagner un peu en rapidité, occulte le temps de ta macro le rafraichissement d'excel :

au début de ton code :

Application.DisplayAlertsScreenUpdating = False

à remettre à True à la fin du code

@++


  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
vendredi 23 février 2007 à 23:23:04 | Re : Macro lente

jmfmarques

Membre Club
Bonsoir Mortalino,

T'as fait la bringue ? (t'as bien raison)

Je crois que ce serait plutôt :
Application.ScreenUpdating 

vendredi 23 février 2007 à 23:24:48 | Re : Macro lente

MPi

Mortalino, j'imagine que tu voulais écrire
Application.ScreenUpdating = False.............(?)

Quelquefois aussi, on peut accélérer en mettant
en début de traitement
Application.Calculation = xlCalculationManual
et à la fin
Application.Calculation = xlCalculationAutomatic

Mais je rencontre aussi ce genre de problème lorsque je mets à jour un certain fichier une fois par semaine.
Lors de la mise à jour, j'exécute une macro et elle est lente
Lorsque j'exécute cette même macro durant la semaine (à tous les jours), elle s'exécute en un rien de temps... (?)

MPi
vendredi 23 février 2007 à 23:49:22 | Re : Macro lente

mortalino

Membre Club


Salut à tous,

oui, je sus un peu déphasé, désolé ^^ 
J'attaque mon boulot et je n'ai pas encore les yeux en face des trous.
C'est bien ScreenUpdating qu'il faut lire..

Sinon, c'est vrai MPi, suivant les moments, les temps d'éxecution sont différents selon les moments, et va savoir pourquoi..
(peut-être des programmes en arrière plan qui prennent le café  )

Bonne soirée à vous deux.

@++


  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
vendredi 14 mars 2008 à 15:44:42 | Re : Macro lente

gregou9

Bonjour,

J'ai un probleme de lenteur avec ma macro excel.

J'ai un bouton rafraichir sur ma feuille et a chaque fois ke jappuie dessus ma macro rame (le sablier s'affiche pour un bon moment)

Merci de m'aider.

Voici le code :

Sub Macro1()

Application.ScreenUpdating = False
'Application.Calculation = xlCalculationManual
   
    Sheets("Détail N").Select
    Rows("1:10010").Select
    Selection.EntireRow.Hidden = False
    Range("A3:FL10000").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("A1:FL2"), Unique:=False
       
    Sheets("Détail N+1").Select
    Rows("1:10010").Select
    Selection.EntireRow.Hidden = False
    Range("A3:FL10010").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("A1:FL2"), Unique:=False
       
       
    Sheets("Bilan Cumule").Select
   
'Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True


Cette discussion est classée dans : macro, données, onglet, lente, venir


Répondre à ce message

Sujets en rapport avec ce message

Comptage du nombre de lignes d'une feuille dans macro [ par Lukatha ] Bonjour,   Je souhaite créer une macro Excel pour copier les données de 3 onglets dans un seul onglet "Data". Les onglets ont tous les même formats ma [Catégorie modifiée VB6 --> VBA] Macro pour répartir les données d'une feuille Excel dans plusieurs onglets [ par JMC27 ] Bonjour, Tous les mois je reçois un fichier avec les résultats de vendeurs. Le fichier est présenté avec le nom des vendeurs les uns en dessous des au [Catégorie modifiée VB6 --> VBA] Pb autoload Combobox activeX ??? [ par Ericbzc ] Bonjour à tous et merci d'avance pour votre aide [^^happy13] le contexte : je suis sous excel 2003. et j'ai un programme qui à partir d'un tableau de vba macro pour traiter des données txt [ par malouve ] Bonjour, je sollicte votre aide pour un problème sur lequel je bute depuis quelques jours , j'ai fait une macro me permettant d'ouvrir un fichier tx Déclenchement macro liée à saisie. Plusieurs cellules dans même onglet. [ par R2O2 ] Bonjour,J'ai besoin de lier une macro à un changement de contenu de cellule. Macro extraction données excel [ par max0811 ] Bonjour, Je sais pas si c'est le bon endroit pour demandé une aide afin d'effectuer une macro sur EXCEL 2007. Le travail que je voudrai effectuer [Catégorie encore modifiée .Net --> VBA] base de données excel [ par eric2027 ] Bonjour à tous En espérant que quel qu'un pourra me sortir de ma galère, je cherche à faire une "base de données excel" sans passer par une macro, par [Catégorie modifiée VB6 --> VBA] Copier valeur d'une étiquette données dans cellule [ par CerberusPau ] Bonjour à tous, Depuis un graphique (Excel2003), je cherche à construire une macro pour récupérer les valeurs dans l'étiquette de données d'une courb faire appel a une macro [ par salamus1986 ] bonjour a tous, je souhaite enregistrer une macro pour qu elle soit accessible à partir de tous fichiers. je veux que les données que j ai sur ma nou Macro de contrôle d'enregistrement [ par Geraldq ] Bonjour J'ai un fichier qui comporte 6 onglets en tous: 5 onglets A,B,C,D,E,F et 1 onglet personnel Lorsque je me trouve dans les onglets A,B,C,D,E,F


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,186 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales