Bonjour à tous,
Je dispose d'une base de donnée contenant quelques centaines de lignes et sur chacune on retrouve plusieurs informations relatives à un objet (nom, date de création, origine etc) et son prix
Mon objectif est d'écrire une fonction qui en utilisant 2 critères de recherche parmi les caractéristiques des objets me donne la valeur totale des objets répondant aux critères en question par exemple les jouets produits en afrique du nord.
Au départ j'utilisais une fonction BDsomme pour faire ce calcul (et ça fonctionnait très bien en détaillant correctement les critères) le soucis est que le premier critère est en fait une liste de référence à rechercher (par exemple les pays où le taux d'utilisation de l'objet en question est supérieur à N), liste qui peut être amenée à évoluer. Mon but est donc de faire une fonction qui s'adapte à l'évolution de la liste de critère, ce que ne permet pas (à ma connaissance) la fonction BDsomme. Je précise que la fonction n'a pas besoin d'intégrer la partie "calculatoire" du premier critère qui ne sert que dans l'exemple ci dessus.
En nommant de manière dynamique (avec la fonction "décaler") certaines plages de données j'étais arrivé à une fonction qui marchait et me renvoyait bien tout ce que je souhaitais, son seul problème est qu'elle ralentit terriblement tout mon document - les quelques macros extrêmement simple que j'utilisais, et qui ne prenaient que 2-3 secondes à s'appliquer prennent maintenant une vingtaine de secondes, sûrement du fait que la fonction en question est appelée 15 fois par onglet dans 12 onglets en recherchant des valeurs différentes.
Avez vous une idée de comment optimiser cette fonction de manière à ce qu'elle ne fasse pas ramer mon classeur à ce point ? Ou alors d'autres pistes qui pourraient expliquer le ralentissement de mon document ?
Je vous mets le code de ma fonction tel qu'il est pour l'instant :
(on recherche les éléments de "listecritère1" dans "matricecrit1" et critère2 dans "matricecrit2, chacune de ces dimension appelle un nom que j'ai paramétré dans excel avec la fonction "decaler", de même que la dimension "matricevaleur" qui contient le prix de chaque objet)
Merci d'avance pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Function sommebd(listecritère1, matricecrit1, matricevaleur, matricecrit2, critère2 As String) Dim k, i As Long For k = 1 To matricecrit1.Cells.Count For i = 1 To listecritère1.Cells.Count If listecritère1(i) = matricecrit1(k) Then If matricecrit2 (k) = critère2 Then sommebd = sommebd + matricevaleur(k) Else sommebd = sommebd End If End If Next i Next k End Function
Bob
Partager