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 :

find sur plusieurs colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut find sur plusieurs colonne
    Bonjour et Bonne année a tous.

    J'ai une fonction qui me renvoi le n° de la ligne d'une feuille Excel
    correspondant à une recherche sur 3 colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function Match_Line(V1 As String, V2 As String, V3 As String)
        Match_Line = 0
        For J = 6 To Max_Row
            If ActiveCell.Offset(J, 0).Value = V1 And _
                ActiveCell.Offset(J, 1).Value = V2 And _
                ActiveCell.Offset(J, 2).Value = V3 Then
               Match_Line = J
               Exit Function
            End If
        Next J
    End Function
    Mon problème se situe au niveau des performances de cette fonction car quand Max_Row est > 10000 c'est très long

    J'ai vu dans la FAQ la fonction find (qui pourait ameliorer les performances de cette fonction) et qui fait à peut près le meme travail sur une colonne mais je ne vois pas comment l'implementer pour faire une recherche sur 3 colonnes.

    Merci de votre aide

  2. #2
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Bonjour,
    Voici un exemple du find
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            Recherche = shRecherche.Cells(iRendu, 3)
     
            With shDans.Range("B:B")
                Set c = .Find(Recherche, LookIn:=xlValues)
                If Not c Is Nothing Then
                    iNombre = shDans.Cells(c.Row, 1)
                Else
                    iNombre = 0
                End If
                Set c = Nothing
            End With
    Il faut déclarer le c en tant que range
    Dans l'exemple, j'utilise deux feuilles, une (shRecherche) où se trouve ce que j'ai à cherche et l'autre (shDans) où j'effectue la recherche.

    Si tu as d'autres questions, n'hésites pas!

    P.S. pour changer la plage de recherche (colonne A - B et C)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With shDans.Range("A:C")

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Tu peux essayer :
    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
    Function Match_Line(V1 As String, V2 As String, V3 As String)
        Match_Line = 0
        With ActiveCell.EntireColumn
            Set c = .Find(V1, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    If c.Offset(0, 1) = V2 And c.Offset(0, 2) = V3 Then
                       Match_Line = c.Row
                       Exit Function
                    End If
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> firstAddress
            End If
        End With
    End Function
    Ca accélèrera peut etre un peu ton code, car il ne fera la comparaison que pour les lignes dont la 1ere colonne verifie le 1er critere...

  4. #4
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    merci dadavyvy votre exemple m'a été tres précieux
    mon idée était de faire une recherche de type find sur les 3 colonnes car mes champs sont tres souvents répétés dans chaque colonnes mais une seule fois ensemble sur une meme ligne
    je vous propose donc le code suivant qui répond à mon besoin (notez l'utilisation récursif de la fonction match_line )
    à noter que je suis passé de 45 minutes à moins de 5 minutes maintenant avec ce nouveau 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
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Sub Test2()  
       MsgBox Match_Line("Data 1", "Data 2", "Data 3", 2)   
    End Sub
     
     
     
    ' ==================================================================================
    ' ====  Match_Line Cette fonction permet de rechercher la 1ere ligne du tableau
    ' ====  ou se trouve les chaines  V1 , V2 , V3 respectivement sur les colonnes 1 , 2 , 15
    ' ====  la recherche s'effectue a partir de la ligne Start_Line
    ' ====  particularite : la recursivite de la fonction jusqu'a trouver les 3 valeurs
    ' ====  la fonction considere la ligne 1 comme une ligne d'entete de colonne
    ' ====  donc Start_line doit etre >= 2  (Sinon ca plante ...... ;o)
    ' ====  La fonction renvoi 0 si pas trouvee
    ' ==================================================================================
    Function Match_Line(V1 As String, V2 As String, V3 As String, Start_Line As Integer) As Integer
     
        Dim X As Integer
        Dim Y As Integer
        Dim Z As Integer
     
     
        Match_Line = 0
        ' =======================================================
        ' A Partir de la Ligne "Start_Line" on cherche V1 sur la colonne 1
        X = Match_Col(V1, 1, Start_Line)
        If X = 0 Or X < Start_Line Then
            Exit Function
        End If
        ' =======================================================
        ' A Partir de la Ligne "X" on cherche V2 sur la colonne 2
        Y = Match_Col(V2, 2, X)
        If Y = 0 Then
             Exit Function
        End If
        ' =======================================================
        ' A Partir de la Ligne "Y" on cherche V3 sur la colonne 15
        Z = Match_Col(V3, 15, Y)
        If Z = 0 Then
            Exit Function
        End If
        ' =======================================================
        ' ===  La Ligne Matche Quand  X = Y = Z
        ' =======================================================
        If X = Y And Y = Z Then
            Match_Line = X
            Exit Function
        End If
     
        ' =======================================================
        ' ===  Si X <= Y <= Z Alors on continue la recherche à partir de
        ' ===  la ligne "Z" en utilisant la recursivité de la fonction Match_Line
        ' =======================================================
        If X <= Y And Y <= Z Then
             A = Match_Line(V1, V2, V3, Z)
             Match_Line = A
             Exit Function
        End If
     
    End Function
     
    ' ==================================================================================
    ' ====  Cette fonction recherche la ligne ou se trouve la chaine VR dans la colonne VC
    ' ====  à partir de la ligne Start_Row
    ' ====  on renvoi 0 si pas trouvee
    ' ==================================================================================
    Function Match_Col(VR As String, VC As Integer, Start_Row As Integer) As Integer
     
        Dim C As Range
        Dim S As Range
     
        Match_Col = 0
        Set C = ActiveSheet.Cells(Start_Row, VC)
        Set S = C.EntireColumn.Find(VR, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, After:=C.Offset(-1, 0))
        If Not S Is Nothing Then
            Match_Col = S.Row
            Exit Function
        End If
     
    End Function

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

Discussions similaires

  1. Select sur plusieurs colonnes
    Par Mynautor dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/03/2006, 14h49
  2. trier un stringgrid sur plusieurs colonnes
    Par renegade55 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/12/2005, 16h30
  3. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27
  4. Lister sur plusieurs colonnes dans état
    Par armagued dans le forum Access
    Réponses: 3
    Dernier message: 30/10/2005, 21h21
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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