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 :

Routine de recherche dichotomique


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Oh!Tofocus
    Profil pro
    Inscrit en
    Août 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 217
    Par défaut Routine de recherche dichotomique
    Salut a tous
    auriez vous sous la main un bout de code vba pour faire une recherche dichotomique sur les valeurs d'une colonne ?

    j'ai dans la colonne A des nombres classés par ordre croissant
    et je veux trouver le numero de ligne contenant une valeur recherchée X .

    pour l'instant je fais une recherche ligne par ligne avec un for next mais c'est trés long.... je dois faire plusieurs recherches a la suite

  2. #2
    Membre confirmé Avatar de Oh!Tofocus
    Profil pro
    Inscrit en
    Août 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 217
    Par défaut
    en fait j'utilise actuellement un code de ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim test As Range
    Sub recherche_ligne()
    'x = valeur recherchée
    x = 3186011
     
    For Each test In Range("A:A")
       If x = test.Value Then
          MsgBox "trouvé en " & test.Row
          Exit For
       End If
    Next test
     
    End Sub
    pensez-vous qu'un tri dicotomique sera plus rapide
    j'ai plus de 9000 ligne à tester

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Ho!Tofocus,

    Regardez ce code fourni dans l'aide de VBA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    x = 3186011
    
    With Worksheets(1).Range("a1:a500")
        Set c = .Find(x, lookin:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            MsgBox "trouvé en " & firstAddress
            Do
                'c.Interior.Pattern = xlPatternGray50
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
    J'ai juste ajouté ce qui est en rouge

    Dans le cas où vous feriez partie de ceux qui on regardé la réponse précédente, j'ai apporté une modification (et j'ai testé).
    Dernière modification par AlainTech ; 15/09/2007 à 11h47. Motif: Fusion de 2 messages

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    je veux trouver le numero de ligne contenant une valeur recherchée X .
    On peut aussi utiliser la fonction Equiv, cad Match en VBA:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub NumLigne()
        Dim Valeur, R, Table As Range
        Set Table = Range("D1:D5000")
        Valeur = "azerty"
        R = Application.Match(Valeur, Table, 0)
     
        If VarType(R) = vbDouble Then
            MsgBox R
        Else
            MsgBox "Valeur inexistante"
        End If
    End Sub
    Cordialement,

    Tirex28/

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 95
    Par défaut
    Salut,

    ci-joint un bout de code qui fait de la recherche dichotomique. J'ai testé rapidos, ça a l'air de marche pas trop mal.

    Au passage, la recherche dichotomique est la recherche la plus rapide qui soit pour peu que ton tableau soit suffisamment important pour que ça vaille le coup de la mettre en place (quelques opérations de calcul, un peu de raisonnement sur les conditions de fin, les conditions initiales...)

    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
     
    Public Sub tri()
    Dim premligne, derligne, lireligne As Double
    Dim valeurcherchee As Double
     
    premligne = 1
    derligne = 65536
     
    valeurcherchee = InputBox("valeur cherchée")
     
    If Range("A1").Value > valeurcherchee Then
        MsgBox ("Pas trouvée")
        Exit Sub
    End If
     
    If Range("A" & derligne).Value < valeurcherchee Then
        MsgBox ("Pas trouvée")
        Exit Sub
    End If
     
    While premligne <> derligne - 1
        lireligne = Int((premligne + derligne) / 2)
        Range("A" & lireligne).Select
        If Selection = valeurcherchee Then
            MsgBox ("trouvee en " + CStr(lireligne))
            Exit Sub
            Else
            If Selection > valeurcherchee Then
                derligne = lireligne
                Else
                premligne = lireligne
            End If
        End If
    Wend
     
    If Range("A" & premligne).Value = valeurcherchee Then
        MsgBox ("trouvé en " + premligne)
        Else
        If Range("A" & derligne).Value = valeurcherchee Then
            MsgBox ("trouvé en " + derligne)
            Else
            MsgBox ("Non trouvé")
        End If
    End If
    End Sub
    Voilà

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Et si tu es certain de n'avoir la donnée qu'une seule fois dans ta colonne (ici la colonne B) tu peux éviter la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim maVal As Variant, c As Variant, NoLigne As Long
    Dim FL1 As Worksheet, Plage As Range, x
        Set FL1 = Worksheets("Feuil1")
        Set Plage = FL1.Range("B:B") 'Colonne de recherche
        x = "La donnée cherchée"
        With Plage
            Set c = .Find(x, lookin:=xlValues)
            If Not c Is Nothing Then _
                NoLigne = c.Row 'te donne le N° de ligne
        End With

  8. #8
    Membre confirmé Avatar de Oh!Tofocus
    Profil pro
    Inscrit en
    Août 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 217
    Par défaut
    Merci à tous pour votre aide
    Il ne me reste qu'a tester ces solutions....
    et de choisir la plus rapide.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 95
    Par défaut
    Salut à tous,

    petite question sur le code de ouskel'n'or: est-ce que tu connais l'algo qui tourne derrnière le ".Find" de VBA (quel algo de recherche) ??

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

Discussions similaires

  1. probleme : recherche dichotomique
    Par M.a.n.u. dans le forum C
    Réponses: 3
    Dernier message: 17/06/2006, 23h30
  2. recherche dichotomique sur chaînes de carctères
    Par contexte dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2006, 00h31
  3. Réponses: 23
    Dernier message: 10/01/2006, 13h33
  4. Recherche dichotomique
    Par remixtech dans le forum C
    Réponses: 4
    Dernier message: 06/01/2006, 18h39
  5. Recherche dichotomique
    Par Gryzzly dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 31/12/2005, 11h21

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