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 :

Trouver la première cellule supérieure à une valeur de test [VBA] [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Par défaut Trouver la première cellule supérieure à une valeur de test [VBA]
    Bonjour le club !

    Je vais essayer d'être clair et concis:

    > J'ai une valeur de test, que je veux trouver dans une feuille. (elle peut y être comme elle peut ne pas y être)
    > Après avoir testé avec la méthode Find si l'objet range renvoyé est Nothing (donc valeur test non trouvée) je souhaiterais exécuter une ligne qui me permettrait de trouver la première cellule ayant une valeur supérieure à ma valeur test qui me renverrait un objet range comme la méthode Find.
    (Afin par la suite de pouvoir insèrer une ligne avec ma valeur test au bon endroit).

    Le but de cette partie de code est:
    Si j'ai déjà la valeur test dans mon tableau, on récupère juste le n° de ligne. >Find suffit
    Sinon, on récupère le n° de la ligne d'insertion, dès que l'on dépasse la valeur test. >Là je ne trouve pas! une sorte de Find conditionel ? (Ma valeur test est une variable numérique)

    Une boucle suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For x= 2 to NbDeLignesTotal
         If .Cells(x,1) > Test then
              Ligne = x
              Exit For
         Endif
    Next x
    mais j'essaie d'optimiser mon code sachant que les boucles c'est bien, mais ça prend beaucoup de cycles au final surtout sur des tableaux à 2XXX lignes, donc si je peux m'en passer... Sinon une méthode par approximations succécives pourrait être interressante, mais si une méthode toute faite qui tient sur une ligne existe, autant la prendre !

    Merci de m'exposer vos pistes

    Bonne journée !

  2. #2
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour PierrotMfff,

    A voir ton code, les données sont triées.
    Une recherche dichotomique devrait faire l'affaire, le nombre de passage dans la boucle sera beaucoup moins grand que dans le pire dans la plupart des cas avec ta méthode actuelle.
    Du O(Log2(N) au lieu de O(N) si je ne me trompe pas.

    Pour une recherche dichotomique, tu regardes la valeur au milieu de tes lignes et va regarder au-dessus ou en dessous selon la valeur (comme c'est trié), tu recommence avec la sous liste et ainsi de suite jusqu'à avoir ta bonne ligne.

    C'est beaucoup plus complexe a codé mais vraiment plus efficace pour de très grand nombre de données (17 passages de boucle seulement pour 1xx.xxx lignes)

  3. #3
    Membre confirmé
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Par défaut
    Oui je parlais de ça, quand je parlais de recherche par approximations succéssives

    C'est beaucoup plus complexe a codé mais vraiment plus efficace pour de très grand nombre de données (17 passages de boucle seulement pour 1xx.xxx lignes)
    Mais je ne m'étais pas renseigné (ou même fait de calcul) quand à la rentabilité de ce mode de recherche! (EDIT: Log base 2 de 2000 c'est déjà ~11 !)
    Oui il doit y avoir des nombres à arrondir, des trucs comme ça...
    Par exemple:
    500 lignes à tester
    1) 500 / 2 => test de la ligne 250 prenons Test < CelluleTestée
    2) 250 / 2 => test de la ligne 125 prenons Test < CelluleTestée
    3) 125 / 2 => test de la ligne 62.5 *IIIIINNN* ==> Dans ce cas je prends Int(125/2) ? et ainsi de suite?

    Je vais m'amuser à coder ça je le mettrai dans le fil.

  4. #4
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Voila la proc

    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
    Sub dichotomique()
     
    'Declaration des variables
    Dim debut As Long
    Dim fin As Long
    Dim milieu As Long
    Dim val As Long
    Dim N As Long
    Dim trouve As Boolean
    Dim tacolonne As Long
     
    tacolonne = 1           'c'est ta colonne mais c'est pour mon test qu'elle vaut 1 ;)
     
    N = 300                 'ton nombre de ligne (ici 300 pour mon test)
     
    debut = 1               'debut de ta liste (ici ligne 1 pour mon exemple)
    fin = N                 'fin de ta liste
    trouve = False
    val = 34                'ta valeur cherché (ici 34 pour mon test)
     
    While Not trouve And debut <= fin
        milieu = (debut + fin) \ 2          'partier entiere de debut+fin divisé par 2
        If Cells(milieu, tacolonne).Value = val Then
            trouve = True
        Else
            If val > Cells(milieu, tacolonne).Value Then
                debut = milieu + 1
            Else
                fin = milieu - 1
            End If
        End If
    Wend
     
    MsgBox milieu 'si trouve, milieu vaut la ligne ou est presente la valeur sinon la ligne de la valeur inferieure la plus proche
     
    End Sub

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tes données sont triées?

  6. #6
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Citation Envoyé par mercatog Voir le message
    Tes données sont triées?
    Au vu du premier morceau de code elles doivent l'être et franchement je l'espère sinon la recherche dicho ne fonctionnera pas sans un tri préalable.
    Et j'aurais codé le truc pour rien

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/10/2014, 16h47
  2. [Vxi3] Sélectionner que la première date d'une valeur
    Par emma31 dans le forum Webi
    Réponses: 13
    Dernier message: 02/07/2009, 15h38
  3. Réponses: 2
    Dernier message: 16/10/2008, 12h06
  4. Trouver la première cellule remplie d'une ligne
    Par nicacc dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/08/2008, 15h16
  5. Réponses: 7
    Dernier message: 11/09/2006, 11h33

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