Exécution VBA-excel très très lente
Stat.h
-
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je travaille sur une table excel de très grande taille (130000 lignes) et je dois exécuter une procédure sous vba pour effectuer un calcul du capital restant dû pour chaque client à une date précise ( chaque client a une échéance fixe par mois,une date de dernière échéance, une date de première échéance et le capital restant dû au 31/12/2012). j'ai fait la procédure suivante pour effectuer le calcul. Le problème que j'ai rencontré c'est que le calcul bloque si j'exécute pour plus de 300 clients ( lignes) sachant que pour chaque ligne on parcourt 1500 colonne (toutes les dates possibles de 01/01/2013 jusqu'à 31/12/2016) je pense que ce n'est pas pratique. L'objectif de ce travail est de d'offrir la possibilité de savoir le total du capital restant dû à une date donnée. Aviez des propositions pour faciliter la tache ?
Sub Calcul()
Dim I, J, H As Integer
Dim X As Variant
For I = 2 To 130000
For J = 8 To 1500
If Cells(I, 3).Value = Cells(1, J).Value And Cells(I, 4).Value < Cells(I, 5).Value Then
Cells(I, J).Value = Cells(I, 4).Value
Else
If Cells(I, 7).Value = "4 Semaine" Then
For T = 0 To 53
X = Cells(I, 4).Value
If Cells(1, J).Value = DateSerial(Year(Cells(I, 3).Value), Month(Cells(I, 3).Value), Day(Cells(I, 3).Value) - (T * 28)) And (X - (Cells(I, 6).Value - T) * Cells(I, 5).Value) > 0 And X > (X - (Cells(I, 6).Value - T) * Cells(I, 5).Value) Then
Cells(I, J).Value = X - (Cells(I, 6).Value - T) * Cells(I, 5).Value
End If
Next T
Else
If Cells(I, 7).Value = "Quinzaine" Then
For H = 0 To 53
X = Cells(I, 4).Value
If Cells(1, J).Value = DateSerial(Year(Cells(I, 3).Value), Month(Cells(I, 3).Value), Day(Cells(I, 3).Value) - (H * 14)) And (X - (Cells(I, 6).Value - H) * Cells(I, 5).Value) > 0 And X > (X - (Cells(I, 6).Value - T) * Cells(I, 5).Value) Then
Cells(I, J).Value = X - (Cells(I, 6).Value - H) * Cells(I, 5).Value
End If
Next H
End If
End If
End If
Next J
Next I
End Sub
Je travaille sur une table excel de très grande taille (130000 lignes) et je dois exécuter une procédure sous vba pour effectuer un calcul du capital restant dû pour chaque client à une date précise ( chaque client a une échéance fixe par mois,une date de dernière échéance, une date de première échéance et le capital restant dû au 31/12/2012). j'ai fait la procédure suivante pour effectuer le calcul. Le problème que j'ai rencontré c'est que le calcul bloque si j'exécute pour plus de 300 clients ( lignes) sachant que pour chaque ligne on parcourt 1500 colonne (toutes les dates possibles de 01/01/2013 jusqu'à 31/12/2016) je pense que ce n'est pas pratique. L'objectif de ce travail est de d'offrir la possibilité de savoir le total du capital restant dû à une date donnée. Aviez des propositions pour faciliter la tache ?
Sub Calcul()
Dim I, J, H As Integer
Dim X As Variant
For I = 2 To 130000
For J = 8 To 1500
If Cells(I, 3).Value = Cells(1, J).Value And Cells(I, 4).Value < Cells(I, 5).Value Then
Cells(I, J).Value = Cells(I, 4).Value
Else
If Cells(I, 7).Value = "4 Semaine" Then
For T = 0 To 53
X = Cells(I, 4).Value
If Cells(1, J).Value = DateSerial(Year(Cells(I, 3).Value), Month(Cells(I, 3).Value), Day(Cells(I, 3).Value) - (T * 28)) And (X - (Cells(I, 6).Value - T) * Cells(I, 5).Value) > 0 And X > (X - (Cells(I, 6).Value - T) * Cells(I, 5).Value) Then
Cells(I, J).Value = X - (Cells(I, 6).Value - T) * Cells(I, 5).Value
End If
Next T
Else
If Cells(I, 7).Value = "Quinzaine" Then
For H = 0 To 53
X = Cells(I, 4).Value
If Cells(1, J).Value = DateSerial(Year(Cells(I, 3).Value), Month(Cells(I, 3).Value), Day(Cells(I, 3).Value) - (H * 14)) And (X - (Cells(I, 6).Value - H) * Cells(I, 5).Value) > 0 And X > (X - (Cells(I, 6).Value - T) * Cells(I, 5).Value) Then
Cells(I, J).Value = X - (Cells(I, 6).Value - H) * Cells(I, 5).Value
End If
Next H
End If
End If
End If
Next J
Next I
End Sub
A voir également:
- Exécution VBA-excel très très lente
- Pc tres lent - Guide
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
- Excel compter cellule couleur sans vba - Guide
2 réponses
Bonjour,
Effectivement, ta procédure a tout ce qu'il faut pour durer très longtemps
Déjà en incluant cette ligne en début de macro, tu gagnerais du temps:
on peut encore gagner beaucoup de temps mais il faut qu'on puisse travailler avec la structure réelle
pour cela:
mettre un extrait(env. 5000 lignes maxi) du classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
Je dois m'absenter 1 à 2 heures, donc...
Effectivement, ta procédure a tout ce qu'il faut pour durer très longtemps
Déjà en incluant cette ligne en début de macro, tu gagnerais du temps:
Application.screenupdating=False
on peut encore gagner beaucoup de temps mais il faut qu'on puisse travailler avec la structure réelle
pour cela:
mettre un extrait(env. 5000 lignes maxi) du classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
Je dois m'absenter 1 à 2 heures, donc...
Merci infiniment pour votre réponse. Voici un extrait de la table comme vous l'avez demandé.
http://cjoint.com/13ma/CClpx4YkwuZ.htm
Merci d'avance.
http://cjoint.com/13ma/CClpx4YkwuZ.htm
Merci d'avance.
Re,
Beaucoup de questions
1/ CRD est le K restant dû au 31/12 OK, les échéances sont sur 4 semaines OK pour le 1° reste 2 échéances au 1/1 et 480*2> 800? comprend pas le système de calcul des remboursements....
2/ tu travailles par semaines: pour réduire le tableau ne pourrait 'on pas envisager de travailler en jours.ouvrés :samedi et dimanche otés et es tu obligé de montrer 3 années ?
3 tu écris:
L'objectif de ce travail est de d'offrir la possibilité de savoir le total du capital restant dû à une date donnée
et si on écrit le tableau que jusqu'à la date voulue: on pourrait décaler d'une ou 2 lignes le tableau pour réserver une cellule pour écrire la date voulue ?
4: autre solution
avec un formulaire: on choisit l'identifiant, la date voulue d'inspection, et il est retourné le capital restant dû ?
Beaucoup de questions
1/ CRD est le K restant dû au 31/12 OK, les échéances sont sur 4 semaines OK pour le 1° reste 2 échéances au 1/1 et 480*2> 800? comprend pas le système de calcul des remboursements....
2/ tu travailles par semaines: pour réduire le tableau ne pourrait 'on pas envisager de travailler en jours.ouvrés :samedi et dimanche otés et es tu obligé de montrer 3 années ?
3 tu écris:
L'objectif de ce travail est de d'offrir la possibilité de savoir le total du capital restant dû à une date donnée
et si on écrit le tableau que jusqu'à la date voulue: on pourrait décaler d'une ou 2 lignes le tableau pour réserver une cellule pour écrire la date voulue ?
4: autre solution
avec un formulaire: on choisit l'identifiant, la date voulue d'inspection, et il est retourné le capital restant dû ?