Recherchev trop longue en temps de calcul.

Résolu/Fermé
HUGO BASS Messages postés 20 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 18 septembre 2015 - 26 mars 2015 à 21:47
HUGO BASS Messages postés 20 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 18 septembre 2015 - 27 mars 2015 à 20:45
Bonjour à toutes et tous,

J'ai une base de données contenant un peu plus de 40000 lignes contenues dans un onglet de classeur (nom de la feuille : BASE)
Je veux récupérer certaines valeurs de cette base de données sur un autre onglet du même classeur (nom de la feuille : RECAP).
Je procède par recherchev et cela fonctionne très bien.

Mais quand j'étend la formule sur la plage de cellule qui m'intéresse (cette plage est effectivement très importante mais elle correspond à mon besoin, les calculs deviennent très long.

SI j'étends les formules contenues dans C3:C929 à D3:AYU929 les temps de calculs deviennent très longs.

Connaissez vous une méthode par formule ou même par macro qui me permettrait de réduire considérablement ces temps de calculs

Ci après ma formule :

RECHERCHEV(A3;BASE;2;0)
ou BASE est une plage nommée :
BASE!$C$3:$L$40352

Merci
Cordialement
Hugues


4 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 26/03/2015 à 22:50
Bonjour,

Tu as conscience que ça fait 927x1345 formules, soit 1 246 815 ?
Soit t'acheter un Cray One d'occasion, soit aborder ton problème différemment, soit t'acheter de la patience et avoir une machine à café en état de fonctionnement...
Vu que les fonctions feuille sont bien optimisées et qu'il faut une recherche par cellule, en vba ça risque d'être encore plus lent.
Et si tu ramènes toujours la colonne 2 pourquoi une plage si large (BASE!$C$3:$L$40352) ?
eric

En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
Modifié par Mike-31 le 26/03/2015 à 22:53
Bonsoir,

colle ce bout de code dans les propriétés de ta feuille RECAP

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, [A3]) Is Nothing Then
With Sheets("Feuil1")
.Range("B3").Value = WorksheetFunction.VLookup(.Range("A3").Value, [BASE], 2, False)
End With
End If
End Sub

lorsque tu saisiras ou changeras une donnée de la cellule A3, la donnée de la colonne 2 de ta base s'affichera en B3 voir si tu gagnes un peu de temps
A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
Boisgontierjacques Messages postés 175 Date d'inscription jeudi 19 septembre 2013 Statut Membre Dernière intervention 26 décembre 2018 64
26 mars 2015 à 23:46
0
Boisgontierjacques Messages postés 175 Date d'inscription jeudi 19 septembre 2013 Statut Membre Dernière intervention 26 décembre 2018 64
Modifié par Boisgontierjacques le 27/03/2015 à 16:59
Bonjour,

Voir PJ

https://www.cjoint.com/c/ECBrhGtcbMV

Function RechvM(clé As Range, dt As Range, champ As Range, colResult)
Application.Volatile
Set d = CreateObject("Scripting.Dictionary")
a = champ.Value
b = clé.Value
c = dt.Value
For i = LBound(a) To UBound(a)
d(a(i, 1)) = a(i, colResult)
Next i
Dim temp()
ReDim temp(LBound(b) To UBound(b), 1 To UBound(c, 2))
For i = LBound(b) To UBound(b)
For k = 1 To UBound(c, 2)
tmp = b(i, 1) & CDbl(c(1, k))
temp(i, k) = d(tmp)
Next k
Next i
RechvM = temp
End Function

Sélectionner C4:D273
=rechvm(A4:A273;C3:D3;BASE;2)
valider avec maj+ctrl+entrée


Jacques Boisgontier
0
HUGO BASS Messages postés 20 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 18 septembre 2015
27 mars 2015 à 20:45
Bonjour Jacques,

Tout d'abord merci pour votre solution.
Il semblerait en première lecture rapide que cela réponde à mes attentes
Je fais les tests sur ma base complète ce week end.

Cordialement

Hugues
0