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 étrange Méthode Find() [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Par défaut Problème étrange Méthode Find()
    Bonjour à tous,

    Bon après avoir perdu bon nombre d'heures à me pencher sur le problème en vain et avoir épluché pas mal de discussions, je me décide à vous demander de l'aide parce que j'ai un problème très étrange avec la méthode Find (.Find(what:= etc) et je bloque.
    Je ne peux poster ni fichier ni code complet car je pense que ça embrouillerait tout le monde d'avoir le projet complet, le code est assez long et écrit bizarrement sans doute.
    Je tente donc de l'expliquer le plus clairement possible au niveau conceptuel:

    Le problème se pose dans une base de données, composée de:
    • Colonne 1: Un numéro qui s'étend sur plusieurs lignes [appelons le range "numéro"], qui passe ensuite à un autre numéro sur plusieurs lignes à son tour.
    • Colonne 2: Une lettre allant de A à Z (appelons le range [lettre], à l'intérieur du range(numéro).
    • Colonne 3,4 jusque 10, des données quelconques qui doivent être déplacées.


    Nous avons donc un range "numéro" de 75 lignes (par exemple), à l'intérieur duquel se succède en colonne 2 donc un range "lettre" A (15 lignes), ensuite B (15 lignes) etc etc.
    Ce qui donne (en très simplifié):
    Nom : colonne.JPG
Affichages : 258
Taille : 20,0 Ko


    Et ainsi de suite, les numéros vont jusqu'à 40, et il y a jusque 20 lettre différentes à l'intérieur d'un range "numéro".
    A côté de ces deux colonnes se trouvent des données associées quelconques (qui ne servent pas à identifier).

    L'idée c'est que le script aille chercher dans le database si le numéro cherché est présent (ex:1), une fois trouvé, il définit un Range de la première à la dernière ligne contenant ce numéro, et ira ensuite chercher à l'intérieur de ce range la lettre choisie (ex:B, à l'intérieur de 1). La raison de ces étapes et que je ne veux pas qu'il trouve B dans range(2) mais B dans range(1) et prendre ces données là précisemment. C'est la raison pour laquelle une premier range est préalablement définit, pour ensuite y effectuer une recherche avec Find(whatetc.

    Mon problème est le suivant:
    Je définit le range(numéro), imaginons de 2 à 450. A l'intérieur duquel on trouve le range(lettres) qui est plus courts, exemple: range(1B = ligne 2 jusque 10, 1C = ligne 11 jusque 26) et ainsi de suite.
    Mais en définissant ce second range, il semble que la recherche démarre après le première cellule du range (si le range démarre à B250, la première occurence trouvée sera minimum B251, même si en B250 la donnée y est également.
    Constatant cela, j'ai décalé le début de la recherche à Range(ligne - 1), afin qu'il démarre la recherche sur la première ligne du range.
    Cela fonctionne jusque...à ce qu'on arrive à la dernière lettre cherchée, qui est également la lettre présente dans Range(ligne - 1)! (les séquences de lettres se succèdent dans le même ordre, donc après 1Z, on trouvera 2A, et ainsi de suite). Le script cherchant Z, il le trouve dans Range(ligne - 1) et me colle donc les données ici.

    Je pense avoir trouvé la raison mais elle est incensée! Quand le script se met à chercher, il cherche à partir de la ligne 2 en gros, mais s'il ne trouve rien, il revient quand même à la ligne 1 et là trouve ma donnée. Pourquoi cela ne fonctionnait pas avec le premier cas ? Car en cherchant dès la ligne 2, il trouve la donnée! (la lettre va de ligne 1 à ligne 5 par exemple) donc se dit 'ok j'ai trouvé' et n'a donc pas besoin de venir checker en arrière. Or pour la dernière lettre (1Z), il ne la trouve pas et revient sur Range(ligne - 1) et là la trouve (mais elle est hors-range!).

    Ma question est donc: y'a-t-il un moyen de définir un range, de commencer à chercher dès la première ligne du range, sans avoir recours au ligne-1 qui le fait sortir du range ?
    Est-ce si illogique que ça de vouloir chercher dès la première ligne du range ?

    Je sais je pourrai faire un controle à côté de la lettre pour voir si le numéro correspond mais cela me semble absurde qu'aucun code ne fonctionne sans ce controle qui n'a pas de sens.

    D'avance merci à vous qui avez pris la peine de lire, j'espère avoir un minimum expliquer mon problème...j'ai essayé d'être le plus clair possible.
    En espérant vous lire

    LeSmoox

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Pourquoi ne pas revenir aux fondamentaux en remplaçant tes Find compliqués par une simple combinaison de For to et de If.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Lig = 1 to Range("A1").End(xlDown.Row
        If Cells(Lig,1).Value = MonNumero And Cells(Lig,2) = MaLettre Then
     
     
        End If
    Next Lig
    Tu perdrais sans doute en rapidité d'exécution mais tu gagnerais en vitesse de conception.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Par défaut
    Bonjour Menhir,

    Merci pour la réponse. Oui j'y ai pensé, le problème c'est que cette macro fait partie d'un script assez long et varié qui contient beaucoup d'autres macro et qui est déjà très lourd à faire tourner.
    La méthode avec If est en effet plus facile à utiliser mais elle ralentirait encore plus l'exécution, c'est pourquoi j'ai privilégié Find() qui me semblait fonctionner rès bien jusqu'à ce problème.

    Il s'agissait également de comprendre ce problème qui me semble tout simplement absurde...
    Si je ne trouve aucune solution je serais bien obligé de repasser aux If mais j'espérais trouver.

    Salutations

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tu peux accélérer le code en commençant par un Find qui te permette de commencer le For to à une ligne plus appropriée que la première.

    Ensuite, tu pourrais avoir une variable binaire utilisée comme drapeau que tu mets à 1 quand tu as trouvé la première ligne et si cette variable est à 1 mais que les conditions ne sont plus remplies, faire un Exit For, ce qui t'évite de scruter des lignes inutiles.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Par défaut
    Oui j'ai simplement ajouté un controle une fois l'occurence trouvée, il faut que la le 'numéro' corresponde.
    Cela dit, si quelqu'un connait la raison de ce problème précisément, et comment le résoudre sans le contourner je suis preneur car ça n'a aucun sens, il doit y avoir une explication.

    Merci Mehnir

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    Pour la recherche avec Find, c'est expliqué dans l'aide:

    expression .Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

    Paramètres:
    Nom Obligatoire/Facultatif Type de données Description
    ... ... ... ...
    After Facultatif Variant Cellule après laquelle vous souhaitez commencer la recherche. Elle correspond à la position de la cellule active quand une recherche est lancée à partir de l'interface utilisateur. Notez que le paramètre After doit désigner une cellule unique dans la plage, et que la recherche commence après cette cellule qui n'est analysée que quand la méthode y revient après avoir analysé les autres cellules. Si vous ne définissez pas cet argument, la recherche commence après la cellule figurant dans l'angle supérieur gauche de la plage.
    ... ... ... ...
    Lorsque tu utilise Find, il faut définir tous ces paramètres (regarde dans l'aide).
    Méthode Range.Find (Excel) - MSDN

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

Discussions similaires

  1. Problème avec ma méthode Find
    Par cdurep dans le forum Excel
    Réponses: 2
    Dernier message: 04/03/2014, 10h30
  2. [XL-2010] Problème avec la méthode find d'un objet Range dans une zone filtrée
    Par stargates01 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 28/02/2014, 23h27
  3. Problème méthode Find de Redemption
    Par Samildanach dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 12/08/2008, 13h34
  4. Problème méthode find
    Par tazmania dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/06/2007, 15h37
  5. VBA-E Problème méthode .find
    Par popo68 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/01/2007, 10h14

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