Recherchev trop longue en temps de calcul.

Résolu
HUGO BASS Messages postés 20 Statut Membre -  
HUGO BASS Messages postés 20 Statut Membre -
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

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  2. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
  3. Boisgontierjacques Messages postés 177 Statut Membre 64
     
    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
    1. HUGO BASS Messages postés 20 Statut Membre
       
      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