IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème lookup en mode vba


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut Problème lookup en mode vba
    Bonjour,

    J'ai un fichier qui contient beaucoup de cellules avec calcul de type recherchev. Par ailleurs, il s'agit de concatener les valeurs correspondantes dans une seule cellule. J'ai trouvé la fonction MYLOOKUP qui fait exactement ce que je souhaite : https://www.extendoffice.com/documen...-one-cell.html (la version améliorée par Jay Coltrain c.f. commentaires en base de page.

    Voir mon fichier Excel en annexe, onglet 'mylookup'. C'est LE résultat que j'espérais, mais avec plusieurs 100aines de cellules de ce genre, les calculs deviennent beaucoup trop lents.

    Question: y-a-t'il un moyen d'arriver au même résultat, mais avec un processus de (re-)calcul beaucoup plus rapide? J'ai trouvé cette information: https://stackoverflow.com/questions/...ves-to-vlookup, avec la fonction vbalookup. Il semblerait qu'en passant par un dictionnaire VBA en effet, cela soit 100x plus rapide. Cette méthode m'intéresse, mais:

    1. J'obtiens #valeur! si je définis une plage de recherche de plus de 34 lignes, ce qui n'est pas pratique (c.f. fichier annexé, onglet 'vbalookup' pour un exemple concret)
    2. Cette fonction ne concatène pas les résultats comme dans mylookup

    Help!

    Merci d'avance pour vos suggestions

    Classeur1.xlsm

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    pour des raisons de securite entreprise, je suis dans l'incapacite de telecharger ton fichier en PJ.

    POurrais-tu nous en dire plus en ecrivant directement ce que tu cherches a faire, et nous copier le code directement pour que l'on en sache un peu plus stp ?

    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut
    Bonjour Jean-Philippe André,


    Voici le code MYVLOOKUP qui fonctionne actuellement. Je cherche à obtenir exactement le même résultat, mais plus vite (chaque fois que j'ajoute une ligne, toutes mes cellules avec la fonction MYVLOOKUP procède à une recalculation, ce qui prend un max de temps):
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long)
    'Update 20150310
    'Updated 6/9/16 Jay Coltrain
    'Dim rng As Range
    Dim xResult As String
    xResult = ""
     
    Dim Rows As Long, i As Long
    Rows = pWorkRng.Rows.Count
     
    For i = 1 To Rows
    If pWorkRng.Cells(i, 1).Value = pValue Then
    xResult = xResult & ", " & pWorkRng.Cells(i, 1).Offset(0, pIndex - 1)
    End If
    Next i
     
    Dim varSection As Variant
    Dim sTemp As String
    Dim sDelimiter As String
     
    sDelimiter = ","
     
    For Each varSection In Split(xResult, sDelimiter)
     If InStr(1, sDelimiter & sTemp & sDelimiter, sDelimiter & varSection & sDelimiter, vbTextCompare) = 0 Then
     sTemp = sTemp & sDelimiter & varSection
     End If
    Next varSection
     
     
    MYVLOOKUP = Mid(sTemp, Len(sDelimiter) + 1)
    End Function
    Cela me permet d'obtenir ce résultat:

    Nom : mylookup.JPG
Affichages : 189
Taille : 64,9 Ko

    Voici le code vba qui faire appel à un dictionnaire :

    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
    20
    21
    22
    23
    24
    Function vbalookup(lookupRange As Range, refRange As Range, dataCol As Long) As Variant
      Dim dict As New Scripting.Dictionary
      Dim myRow As Range
      Dim i As Long, J As Long
      Dim vResults() As Variant
     
      ' 1. Build a dictionnary
      For Each myRow In refRange.Columns(1).Cells
        ' Append A : B to dictionnary
        dict.Add myRow.Value, myRow.Offset(0, dataCol - 1).Value
      Next myRow
     
      ' 2. Use it over all lookup data
      ReDim vResults(1 To lookupRange.Rows.Count, 1 To lookupRange.Columns.Count) As Variant
      For i = 1 To lookupRange.Rows.Count
        For J = 1 To lookupRange.Columns.Count
          If dict.Exists(lookupRange.Cells(i, J).Value) Then
            vResults(i, J) = dict(lookupRange.Cells(i, J).Value)
          End If
        Next J
      Next i
     
      vbalookup = vResults
    End Function

    Et voici le résultat que j'obtiens:

    Nom : vbalookup.JPG
Affichages : 174
Taille : 68,1 Ko

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Ok

    tu es sur un perimetre de combien de lignes au total ?

    Tu devrais passer par des tableaux au lieu de passer par des range deja =]
    http://didier-gonard.developpez.com/...s-tableau-vba/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut
    Alors pour l'instant seulement 110 lignes, mais la formule est dans 3 colonnes. C'est déjà super lent, et cela ne va pas s'arranger puisqu'il est prévu d'utiliser cette liste sur le long terme (plusieurs milliers de lignes).

Discussions similaires

  1. problème avec setsockopt() mode RAW
    Par poporiding dans le forum Windows
    Réponses: 20
    Dernier message: 25/04/2006, 14h41
  2. problème avec setsockopt() mode RAW
    Par poporiding dans le forum C++
    Réponses: 15
    Dernier message: 24/04/2006, 17h17
  3. Problème de requête en VBA
    Par otravaglini dans le forum Access
    Réponses: 2
    Dernier message: 20/04/2006, 11h19
  4. Problème avec open() [Excel VBA]
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/11/2005, 16h21
  5. [VB.NET] Problème exécution en mode release.
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2005, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo