Recherv trop longue en temps de calcul

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

Bonsoir,

Fonction perso RechvM() matricielle plus rapide que Recherchev() classique

Exemple: Si on modifie les 2.600 valeurs cherchées dans un tableau de 20.000 items,

le temps de recalcul n'est pas visuellement mesurable (5 sec pour recherchev()).

Function RechvM(clé As Range, champ As Range, colResult)
  Application.Volatile
  Set d = CreateObject("Scripting.Dictionary")
  a = champ.Value
  b = clé.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))
  For i = LBound(b) To UBound(b)
    temp(i) = d(b(i, 1))
  Next i
  RechvM = Application.Transpose(temp)
End Function

-Sélectionner champApplication

=RechvM(ChampCodesRecherches;matable;2)

-Valider avec maj+ctrl+entrée

http://boisgontierjacques.free.fr/pages_site/recherchev.htm#FonctionRechVM

Rappel

Si la valeur cherchée est un code et si la table est TRIEE, on peut spécifier le paramètre VRAI.

La recherche est alors faite par DICHOTOMIE et peut être x100 + RAPIDE puisqu'il suffit de quelques

accés pour retrouver le code. C'est TRES IMPORTANT lorsque la table est de taille importante et que

la formule Recherchev() est recopiée x1000 fois (Avec FAUX , Excel consulte la table SEQUENTIELLEMENT).

Pour vérifier si le code existe (on ne récupère pas #N/A mais la valeur inférieure), il faut écrire:

=SI(RECHERCHEV(CodeCherché;Articles;1;VRAI)=

CodeCherché;RECHERCHEV(CodeCherché;Articles;2;VRAI);"Inconnu")

Ceuzin

Bonjour

Joins ton fichier et on te proposera quelque chose...

Bye !

20base-test.xlsx (65.21 Ko)

Re bonjour à toutes et tous,

Ci joint un fichier pour illustrer comme demandé mon problème

Base allégée

Merci

Bien à vous

Hugues

Bonjour,

Cette fonction devrait diviser au moins par 10 le temps par rapport à Recherchev() grâce à la recherche dans le dictionnaire qui est très rapide.

Ecrire la formule recherchev() par macro n'apporterait rien évidement .

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

Ceuzin

38base-test.zip (51.11 Ko)

Bonjour à tous

Version macro. A tester.

Bye !

35base-test-v1.zip (23.23 Ko)

Bonjour à toutes et tous

Bonjour ceuzin, Bonjour Gmb

Je vous remercie pour vos solution que je vais tester avant de mettre ce post en résolu

Mais il me semblerait que je sois sur la bonne direction grace à votre aide

Merci

Cordialement

Hugues

17base-test-v2.zip (29.68 Ko)
gmb a écrit :

Bonjour à tous

Version macro. A tester.

Bye !

Bonjour GMB,

Votre macro fonctionne et je vous en remercie.

Mais mes connaissances en vba étant trop limitées je n'arrive pas malgré quelques essais à adapter votre code quand je rajoute des données sur la feuille base

CF fichier joint

Auriez vous un peu de temps pour commenter votre code ?

Merci

Cordialement

Hugues


ceuzin a écrit :

Bonjour,

Cette fonction devrait diviser au moins par 10 le temps par rapport à Recherchev() grâce à la recherche dans le dictionnaire qui est très rapide.

Ecrire la formule recherchev() par macro n'apporterait rien évidement .

Ceuzin

Bonjour Ceuzin,

Votre solution fonctionne parfaitement.

Mais je ne peux la retenir, car même si elle fonctionne très bien sur microsoft windows excel 2007(configuration de ma machine virtuelle) par contre elles ne fonctionnent pas sous mon mac osx yosemite office mac 2011.

Et cela après une matinée à essayer d'adapter vos codes (problème de gestion des macros personnalisées via function)

Avez vous déjà rencontré ce problème et du coup pu y trouver une solution ?

Merci

Cordialement

Hugues

Bonjour

HUGOBASS a écrit :

je n'arrive pas malgré quelques essais à adapter votre code quand je rajoute des données sur la feuille base

Nouvelle version à tester.

Et maintenant ?

Bye !

45base-test-v3.zip (28.75 Ko)
gmb a écrit :

Bonjour

HUGOBASS a écrit :

je n'arrive pas malgré quelques essais à adapter votre code quand je rajoute des données sur la feuille base

Nouvelle version à tester.

Et maintenant ?

Bye !

Re bonjour GMB,

Oui bonjour cela marche parfaitement maintenant.

Les temps de calculs sont plus rapides quand j'applique la macro sur ma base réelle (même si cela prend encore du temps de calcul) et surtout cela est bien plus simple à mettre en oeuvre et réduit aussi fortement la taille de mon fichier (diminution du nombre de formules).

Merci beaucoup

Je vous remercie.

Cordialement

Hugues

Rechercher des sujets similaires à "recherv trop longue temps calcul"