Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

optimisation d'une macro très lente

  • Initiateur de la discussion Initiateur de la discussion jozerebel
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

jozerebel

XLDnaute Occasionnel
Bonjour à tous!!!!

Avec l'aide de tous, en particulier papou et Pierre jean, j'ai construit un fichier me servant de suivi de prises en charge (secteur sanitaire et social).

Cependant, une macro (nommée chab sous VBA, faisant référence aux fonctions cha et chb du module 1 [merci Pierre Jean!]) met un temps fou, mais fou.... à s'exécuter.

Pour info, l'onglet A a quelques 2500 lignes, quelques 28000 lignes dans l'onglet "BDD pec".

Je joins le fichier, vide d'info, mais avec les macros... et le lien direct au cas où:



Si vous pouvez voir comment accélerer le traitement de la macro chab ...

D'avance merci!

PS : Utilisation de windows XP, office 2003 pro
 

Pièces jointes

Dernière édition:
Re : optimisation d'une macro très lente

Bonjour, salut JC 🙂,
Pour commencer par...le commencement, je suis perplexe devant la macro et la fonction à laquelle elle fait appel
Code:
Sub chab()
'...
Range("J2").Select
        ActiveCell.FormulaR1C1 = "=cha(RC[-9],RC[-6])"
'...
End Sub
En J2 on obtient donc
Code:
=cha(A2;D2)
Puis la fonction
Code:
Function cha(client, ladate)
For n = 2 To Sheets("bdd pec").Range("A65536").End(xlUp).Row
        If Sheets("bdd pec").Range("A" & n) = client And ladate >= Sheets("bdd pec").Range("D" & n) And ladate <= Sheets("bdd pec").Range("E" & n) Then
        cha = Sheets("bdd pec").Range("D" & n)
        End If
Next n
End Function
qui revient à
Code:
=SI(ET(A2=A2;D2>=D2;D2<=E2);D2))
N'y aurait-il pas comme une erreur ?
A+
kjin
 
Dernière édition:
Re : optimisation d'une macro très lente

re,
Désolé, mais je ne vais pas me taper la lecture de 2 pages de discussion pour obtenir une réponse
J'ai lu ce qui est écrit dans ta macro et le résultat qu'elle donne, si ça te semble correct, alors je fais erreur et je passe la main
A+
kjin
 
Re : optimisation d'une macro très lente

Bonjour Pierre Jean (qui m'a déjà sauvé la vie 🙂


le lien avec le fichier et des données bidon pour test de la macro.

Cijoint.fr - Service gratuit de dépôt de fichiers


Merci pour votre aide!
 
Dernière édition:
Re : optimisation d'une macro très lente

Bonjour,

après essai de la macro sur un quad core... même constat... Macro très très très lente. Et une fois sur deux, "Excel ne répond pas"....

Suis désespéré...

Any idea pour m'aider?
 
Re : optimisation d'une macro très lente

Re

Nous sommes Dimanche et au mois d'Août !!

Je te propose la macro suivante
Inconvenients
1) Elle classe la feuille bdd pec (a noter la possibilité d'une copie préalable pour conserver l'ordre initial)
2) Elle sera a relancer pour toute modification des feuilles (a noter que lors d'une modif sur la feuille A il est possible d'utiliser Cha et chb)
Avantage:
Chez moi elle s'execute en 3 minutes
Si vraiment c'est encore trop long ,je peux regarder (mais en semaine de preference)

Code:
Sub Macro3()

    x = ActiveWorkbook.Worksheets("bdd pec").Range("A65536").End(xlUp).Row
    ActiveWorkbook.Worksheets("bdd pec").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("bdd pec").Sort.SortFields.Add Key:=Range("A2:A" & x) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("bdd pec").Sort.SortFields.Add Key:=Range("D2:D" & x) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("bdd pec").Sort
        .SetRange Range("A1:J" & x)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
For n = 2 To Sheets("A").Range("A65536").End(xlUp).Row
 client = Sheets("A").Range("A" & n)
 ladate = Sheets("A").Range("D" & n)
 Set c = Sheets("bdd pec").Columns(1).Find(client, LookIn:=xlValues, lookat:=xlWhole)
 If Not c Is Nothing Then
      firstAddress = c.Address
        Do
         If c.Offset(0, 3) >= ladate And ladate <= c.Offset(0, 4) Then
          Sheets("A").Range("J" & n) = c.Offset(0, 3)
          Sheets("A").Range("K" & n) = c.Offset(0, 4)
         End If
           Set c = Sheets("bdd pec").Columns(1).FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
  End If
Next n

End Sub
 
Re : optimisation d'une macro très lente

Hello Pierre Jean,

ça prend en effet bcp moins de temps!!!

Mais par contre, certaines cellules ne se remplissent pas... Sans que je puisse l'expliquer..

Par exemple J8:K13 = rien...

Et ça se reproduit tout au long de la feuille...

Des explications?

Merci encore pour votre aide et le temps passé.

Bonne soirée Pierre Jean.
 
Re : optimisation d'une macro très lente

Hello Pierre Jean,

ça prend en effet bcp moins de temps!!!

Mais par contre, certaines cellules ne se remplissent pas... Sans que je puisse l'expliquer..

Par exemple J8:K13 = rien...

Et ça se reproduit tout au long de la feuille...
D'autre part, les résultats données sont parfois erronés... et différents de ceux que j'obtiens avec les formules cha et chb...

Voilà ce que j'attends de cha et de chb:
dans l'onglet A, j'ai des mois de facturation. Je dois rehercher à quelle période de prise en charge correspond chaque mois de facturation. Si plusieurs périodes peuvent correspondre, alors, je dois prendre celle qui a le mois de début le plus récent. Ainsi, toutes les cellules devraient être remplies.

Merci encore pour votre aide et le temps passé.

Bonne soirée.
.
 
Dernière édition:
Re : optimisation d'une macro très lente

Re

Il est bon que tu ais rappelé ce que tu attends
Le classement de la feuille etait fait en ascendant pour la date en colonne D alors qu'il doit etre en descendant
Voici la macro qui devrait aller mieux
Toutefois ,il restera des vides notamment lorsque le nom en feuille A n'existe pas en feuille bdd pec
Veux-tu controler et me tenir informé

Code:
Sub Macro3()
debut = Timer
    x = ActiveWorkbook.Worksheets("bdd pec").Range("A65536").End(xlUp).Row
    ActiveWorkbook.Worksheets("bdd pec").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("bdd pec").Sort.SortFields.Add Key:=Range("A2:A" & x) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("bdd pec").Sort.SortFields.Add Key:=Range("D2:D" & x) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("bdd pec").Sort
        .SetRange Range("A1:J" & x)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
For n = 2 To Sheets("A").Range("A65536").End(xlUp).Row
 client = Sheets("A").Range("A" & n)
 ladate = Sheets("A").Range("D" & n)
 Set c = Sheets("bdd pec").Columns(1).Find(client, LookIn:=xlValues, lookat:=xlWhole)
 If Not c Is Nothing Then
      firstAddress = c.Address
        Do
         If c.Offset(0, 3) >= ladate And ladate <= c.Offset(0, 4) Then
          Sheets("A").Range("J" & n) = c.Offset(0, 3)
          Sheets("A").Range("K" & n) = c.Offset(0, 4)
         End If
           Set c = Sheets("bdd pec").Columns(1).FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
  End If
Next n
MsgBox (Timer - debut)
End Sub
 
Dernière édition:
Re : optimisation d'une macro très lente

Bonjour Pierre Jean!

Merci encore pour ta rapidité.

J'ai essayé de tester cela mais j'obtiens une erreur d'execution 438 sur la ligne ActiveWorkbook.Worksheets("bdd pec").Sort.SortFields.Clear

Dois-je activer quelquechose sur Excel?

Merci encore pour ton aide.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…