Macro lente

cs_falafala Messages postés 74 Date d'inscription lundi 24 juillet 2006 Statut Membre Dernière intervention 23 décembre 2013 - 23 févr. 2007 à 10:53
gregou9 Messages postés 44 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 19 décembre 2013 - 14 mars 2008 à 15:44
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

8 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 févr. 2007 à 11:12
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
0
cs_falafala Messages postés 74 Date d'inscription lundi 24 juillet 2006 Statut Membre Dernière intervention 23 décembre 2013
23 févr. 2007 à 11:16
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.

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

0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 févr. 2007 à 11:19
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.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 févr. 2007 à 23:07
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

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 févr. 2007 à 23:23
Bonsoir Mortalino,

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

Je crois que ce serait plutôt :
Application.ScreenUpdating 
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 févr. 2007 à 23:24
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
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 févr. 2007 à 23:49
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.

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
gregou9 Messages postés 44 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 19 décembre 2013 1
14 mars 2008 à 15:44
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
0
Rejoignez-nous