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 :

fonction perso "recherchetout"


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut fonction perso "recherchetout"
    Bonjour,
    Je souhaitais me créer une fonction qui ait un peu le même fonctionnement que le recherchev() d'excel mais qu'elle me renvoie tous les résultats trouvés séparés par un 'pipe'.

    exemple :
    je recherche "a" dans le matrice suivante :

    a 1
    a 2
    b 5
    a Z

    le fonction devrait me renvoyer 1|2|Z

    Cela me permettrait grâce à la fonction convertir de mettre les différents résultats dans des colonnes distinctes.

    j'ai donc fait le code suivant qui fonctionne en sub() mais pas en function() ??
    désolé si la syntaxe n'est pas académique, j'apprends tout seul

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Function RechercheTout(valeur_cherchee As Range, table_matrice As Range, no_index_col As Integer)
     
    Dim TabValeurs() As String
     
    valeur = valeur_cherchee
     
    i = 0
     
    With table_matrice
        Set c = .Find(valeur, LookIn:=xlValues)
            If Not c Is Nothing Then
                firstaddress = c.Address
                Do
                    Set c = .FindNext(c)
                    i = i + 1
                Loop While Not c Is Nothing And c.Address <> firstaddress
            End If
    End With
     
    ReDim TabValeurs(i-1)
     
    With table_matrice
        Set c = .Find(valeur, LookIn:=xlValues)
            If Not c Is Nothing Then
                firstaddress = c.Address
                Do
     
                        For j = 0 To UBound(TabValeurs)
                            TabValeurs(j) = c.Offset(0, no_index_col - 1).Value
                            Set c = .FindNext(c)
                        Next j
     
                Loop While Not c Is Nothing And c.Address <> firstaddress
            End If
    End With
     
    resultat = ""
    For k = 0 To UBound(TabValeurs)
        resultat = resultat & TabValeurs(k)
         If k <> UBound(TabValeurs) Then
            resultat = resultat & "|"
        End If
    Next k
     
    RechercheTout = resultat
     
    End Function
    Si quelqu'un avait le temps de se pencher sur mon problème, je lui en serais trés reconnaissant.

    PS : je suis sur excel 2003

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    j'ai une fonction qui fait ça (mettre dans un module de code) :
    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
    Function ConcatVLookUp(ByVal ValRecherche, _
                           ByVal TabMatrice As Range, _
                           ByVal IndexCol, _
                  Optional ByVal blnConcat As Boolean = False, _
                  Optional ByVal separateur = ";") As Variant
    ' Permet une recherchev sur des caractères génériques
    '
    Dim c As Range
    application.Volatile
     
    For Each c In TabMatrice.Cells
        If c.Value Like ValRecherche Then
            ConcatVLookUp = ConcatVLookUp & separateur & c.offset(0, IndexCol - 1).Value
            If Not blnConcat Then Exit For
        End If
    Next c
    ConcatVLookUp = Mid(ConcatVLookUp, Len(separateur) + 1)
     
    Set c = Nothing
    End Function
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CONCATVLOOKUP("A"; A1:A360; 2 ; VRAI ; "|")
    renverra les différentes valeurs de la colonne B pour lesquelles la colonne A est égale à "A" en concaténant avec un le caractère "|"
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Super, merci beaucoup

    En plus, ce code est 2 fois moins long que le mien ...
    J'ai une excuse, je voulais travailler sur les tableaux !

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

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