Gagner en rapidité grace aux tableaux

Karlito91170

XLDnaute Nouveau
Bonjour à tous cher communauté

Je suis néophyte en VBA, je commence à peine mes premières macro.
Je travaille actuellement sur un projet basé sur une méthode Monte Carlo.
J'ai réussis à mettre en place une procédure qui fonctionne, cependant lorsque les données sont en nombres trop importantes, la macro peut prendre 1 heure à tourner, voir plus...

En faisant des petites recherches sur la toile, je crois avoir compris, qu'en, effectuant les calculs dans un tableau on pouvait réduire de manière significative le temps d'exécution.

Au lieu de vous décrire le procédé je vous propose de mettre mon fichier à votre disposition.

La macro se lance à l'aide du bouton "simulation Monte Carlo"
Le monte Carlo s'affiche sur l'onglet "lancement" c'est avant tout ici que la macro prend beaucoup de temps.

Merci d'avance.
 

Pièces jointes

  • Bootstrap 2017 LYBERNET 300 K.xlsm
    2.5 MB · Affichages: 41

cp4

XLDnaute Barbatruc
Bonjour,

Normal que ta procédure mette des plombes à effectuer tous ces select et activate.
Tu as utilisé l'enregistreur de macro, c'est bien. Mais ce dernier enregistre toutes tes manipulations.
Il est utile pour donner certaines syntaxes. Par contre le code généré est trop lourd.

Je n'ai traité que 3 lignes car au-delà de celle-ci je n'ai pas compris ce que tu voulais faire.
VB:
'on efface l'onglet Réass CARMA ***********************************************
    Sheets("Réass CARMA").Cells.ClearContents

' on efface l'onglet tout ***********************************************
    Sheets("Réass LYBERNET").Cells.ClearContents
  
'copié collé les valeurs de longlet réass'
    Sheets("reass").Range("A1").CurrentRegion.Copy Sheets("Réass CARMA").Range("A1")
j'espère que ça va te permettre d'alléger ton code.
 

Karlito91170

XLDnaute Nouveau
Bonjour,

Normal que ta procédure mette des plombes à effectuer tous ces select et activate.
Tu as utilisé l'enregistreur de macro, c'est bien. Mais ce dernier enregistre toutes tes manipulations.
Il est utile pour donner certaines syntaxes. Par contre le code généré est trop lourd.

Je n'ai traité que 3 lignes car au-delà de celle-ci je n'ai pas compris ce que tu voulais faire.
VB:
'on efface l'onglet Réass CARMA ***********************************************
    Sheets("Réass CARMA").Cells.ClearContents

' on efface l'onglet tout ***********************************************
    Sheets("Réass LYBERNET").Cells.ClearContents
 
'copié collé les valeurs de longlet réass'
    Sheets("reass").Range("A1").CurrentRegion.Copy Sheets("Réass CARMA").Range("A1")
j'espère que ça va te permettre d'alléger ton code.
Merci de ta réponse je prends note de tes conseils
Cependant c est ma double boucle qui prend énormément de temps ...
1) boucle pour un tirage aléatoire sur les années
2 boucle pour un tirage aléatoire des sinistres dans l'onglet (bdd_sinistres)

Exemple fictif (je n'ai pas les chiffres exactes sous les yeux)
1) la procédure va tirer aléatoirement l'année 2015,
2) sur l'année 2015 est survenue 12 sinistres (voir onglet bdd_annee)
3) la procédure va tirer aléatoirement 12 sinistres à partir de la base sinistres dans l'onglet( bdd_sinistres) .

Cette procédure va se répéter autant de fois 10 000 fois si l'opérateur a choisi 10 000 tirages .

Ma question est la suivante :
Au lieu d'avoir l'intégralité des tirages dans l'onglet "lancement" peux ton stocker ces derniers dans des tableaux afin de gagner en rapidité ?

Bien à toi .
 

cp4

XLDnaute Barbatruc
Bonjour,

Comme ceci, à tester.
VB:
Dim DerLig As Long, Tb()
DerLig = Sheets("Lancement").Range("B" & Rows.Count).End(xlUp).Row
    Tb = Sheets("Lancement").Range("B1:H" & DerLig).Value
Je pense qu'en nettoyant ton code tu n'auras pas besoin de variable tableau.
Personnellement, je ne les maitrise pas bien.

Bonne journée.
 

Nairolf

XLDnaute Accro
Salut,

Quelques remarques préliminaires en ce concentrant sur les boucles :
Tu as du code comme ceci (même remarque que cp4):
VB:
Sheets("bdd_sinistre").Activate

montant = Range("C" & a).Value
tu gagnerais probablement un peu de temps en l'écrivant ainsi:
VB:
montant = Sheets("bdd_sinistre").Range("C" & a).Value

Tu as aussi alea1 et alea2 que tu recalcules à chaque boucle via une feuille Excel, il serait un peu plus rapide de le faire dans le code:
VB:
'Initialiser le générateur de nombres aléatoires
'=> Randomize : à ajouter avant d'utiliser Rnd pour obtenir des valeurs complètement aléatoires
Randomize
nombre_aleatoire = Rnd

En effet tu peux probablement gagner un peu de temps en passant par un tableau, en utilisant le principe ci-dessous:
VB:
Dim x As Long
Dim y As Long
Dim Arr As Variant
Arr = Range("A1:Z1000")
For y = 1 To 1000
For x = 1 To 26
Arr(y, x) = calcul
Next x
Next y
Range("A1:Z1000") = Arr

N'hésite pas à me dire si tu as besoin que je rentre plus dans le détail.
 

Karlito91170

XLDnaute Nouveau
Salut,

Quelques remarques préliminaires en ce concentrant sur les boucles :
Tu as du code comme ceci (même remarque que cp4):
VB:
Sheets("bdd_sinistre").Activate

montant = Range("C" & a).Value
tu gagnerais probablement un peu de temps en l'écrivant ainsi:
VB:
montant = Sheets("bdd_sinistre").Range("C" & a).Value

Tu as aussi alea1 et alea2 que tu recalcules à chaque boucle via une feuille Excel, il serait un peu plus rapide de le faire dans le code:
VB:
'Initialiser le générateur de nombres aléatoires
'=> Randomize : à ajouter avant d'utiliser Rnd pour obtenir des valeurs complètement aléatoires
Randomize
nombre_aleatoire = Rnd

En effet tu peux probablement gagner un peu de temps en passant par un tableau, en utilisant le principe ci-dessous:
VB:
Dim x As Long
Dim y As Long
Dim Arr As Variant
Arr = Range("A1:Z1000")
For y = 1 To 1000
For x = 1 To 26
Arr(y, x) = calcul
Next x
Next y
Range("A1:Z1000") = Arr

N'hésite pas à me dire si tu as besoin que je rentre plus dans le détail.

Merci beaucoup grâce à ton aide j'ai pu gagner en rapidité sans passer par des tableaux
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 977
Membres
103 078
dernier inscrit
diomy