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 :

Recherche de données dans une plage [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Recherche de données dans une plage
    Bonjour à tous,
    Voilà mon problème :

    J'extrait des données d'une base SQL. Cette base pour faire simple je la simplifie en 3 colonnes dans une feuille Excell. La première colonne contient le début d'une plage; la seconde la fin de la plage et la troisième colonne le résultat à obtenir.

    Mon souci est que je dois chercher une valeur comprise entre le début d'une plage (première colonne) et la fin de la plage (deuxième colonne) et renvoyer le résultat de la troisième colonne.
    Ma première idée était de faire simple et d'utiliser la fonction
    Recherchev(ValeurCherchée;Plage;3;Vrai) avec l'argument vrai, qui me permettait d'obtenir la valeur directement inférieure.

    Cette fonction fonctionne bien mais le souci est que les plages de données ne sont pas linéaires et qu'il existe des plages vides. Donc si je cherche une valeur qui n'existe pas dans une plage de données, cette fonction me retourne une valeur alors que j'aimerais qu'elle me renvoie un message genre "Hors-Programme". Sur le fichier joint, si je cherche **02145, cette fonction me retourne le résultat Chute 318 alors que je voudrais un message genre hors-programme ou n'existe pas

    Si vous avez une idée de début de recherche soit par des fonctions ou soit par VBA je suis preneur.

    Pour info, j'utilise le VBA depuis seulement 3 mois en apprentissage en autodidacte donc autant dire que je suis débutant mais bon je suis preneur.
    J'avais pensé utilisé la fonction VLOOKUP en VBA mais je cherche encore...

    Merci à vous pour votre aide...
    Images attachées Images attachées  

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 904
    Points : 28 876
    Points
    28 876
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction VLookUp en VBA s'utilise comme toutes les autres fonctions utilisées dans Excel. Application.WorksheetFunction.VLookup mais il y a sans doute moyen de résoudre cela sans VBA mais j'avoue ne pas avoir bien compris ton problème.
    Par quel moyen peux-tu avoir avec les données que tu présentes que la plage est vide ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Invité
    Invité(e)
    Par défaut Bonjour,
    je suis pas sur d'avoir bien compris;

    ce n'est pas dans ce classeur ou tu extrais le données SQL? mais ce classeur est le résultat d'une extraction SQL? ton classeur n'a aucune connexion avec une base de données SQL?

    si tu me dis si, alors continus sous forme de requêtes SQL!

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous et merci d'avoir pris un peu de votre temps pour me répondre.
    Pour donner suite à vos interrogation:
    je travaille sur une machine de tri qui en fonction des codes postaux, envoi les marchandises dans telle ou telle destination - ici des chutes -.
    Les données sont le fruit d'une requête en relation avec la base de donnée de la machine.
    Mon problème est que tous les codes postaux ne sont pas affectés et si ma recherche ne rentre pas dans une plage alors je voudrais envoyer une message d'erreur .
    Dans mon exemple, si je cherche la valeur **02155, elle est bien comprise dans la plage **02151 et **02159 et me renvoi bien le résultat Chute 0277 mais si je cherche la valeur **02115 elle me renvoi le résultat Chute 0045 car avec l'argument "vrai" de la fonction recherchev elle me donne la valeur directement inférieure soit ici le résultat de la plage **02110 à **02110 alors que dans mon cas, j'aimerais afficher plutôt un message avec la fonction msgbox en vba par exemple.
    Merci à vous pour votre patience et vos réponses

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 904
    Points : 28 876
    Points
    28 876
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je croyais avoir compris mais je ne suis pas convaincu car il reste des zones d'ombres si je me réfère à l'image que tu as déposée.
    Je pensais que la valeur cherchée devait se trouver entre la valeur la plus proche trouvée en colonne 1 et la valeur se trouvant sur la même ligne en colonne 2
    Si c'est le cas voici une piste avec INDEX et EQUIV mais tu peux faire la même chose avec RECHERCHEV
    Formule testée mais pas avec tous les cas. (Ici la plage est $A$2:$C$15
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(F2<INDEX($A$2:$C$15;EQUIV($F$2;$A$2:$A$15;1);2);INDEX($A$2:$C$15;EQUIV($F$2;$A$2:$A$15;1);3);"Pas trouvé")
    Dans l'image il y a des données qui me posent questions.
    **02000 **02999 Chute 0207
    **02000 **02000 Chute 0283
    Et il y a d'autres lignes semblables.
    Ma question est : Pour **02000 la valeur a renvoyer est Chute 0207 ou Chute 0283 ?
    S'il n'y a pas d'erreur dans ta liste, je ne vois pas trop comment résoudre le problème.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci Philippe pour ta réponse et désolé pour le retard mais boulot oblige.

    Pour revenir sur le sujet, je viens d'essayer le code que tu m'a envoyé et il fonctionne bien pour ce que je veux faire et je t'en remercie. Petite modification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(F2<INDEX($A$2:$C$15;EQUIV($F$2;$A$2:$A$15;1);2);INDEX($A$2:$C$15;EQUIV($F$2;$A$2:$A$15;1);3);"Pas trouvé")
    devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(F2<=INDEX($A$2:$C$15;EQUIV($F$2;$A$2:$A$15;1);2);INDEX($A$2:$C$15;EQUIV($F$2;$A$2:$A$15;1);3);"Pas trouvé")
    car j'avais besoin que la valeur soit incluse dans la plage.

    Pour ce qui est Les valeurs pour la chute 0207, c'est une sortie spécifique et elle sera exclue lors de l'extraction des données dans ma requête.

    Il me reste un petit souci: si le code recherché n'appartient pas à la plage (ex:**01000) la valeur retournée est #N/A mais je pense pouvoir m'en sortir avec un simple " SI(ESTNA... "

    Merci à tous d'avoir bien voulu consacrer un peu de votre temps et pour ma part je vais décortiquer les fonctions "index" et "equiv" pour essayer de les maitriser un peu plus.


  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 904
    Points : 28 876
    Points
    28 876
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comme je l'avais indiqué dans mon message
    Formule testée mais pas avec tous les cas. (Ici la plage est $A$2:$C$15
    Effectivement, le test devait être effectué à l'aide de l'opérateur de comparaison <=.
    Pour ce qui est de l'interception de l'erreur, ESTNA est une des solutions mais pour les versions supérieures à 2003, il y a la formule SIERREUR.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci Philippe pour toute tes réponses. SIERREUR je ne connaissais pas je vais donc m'empresser de la regarder.


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

Discussions similaires

  1. [XL-2010] VBA Pointeur - Recherche Données dans une plage
    Par Coxtox dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/04/2015, 09h37
  2. Insertion de données dans une plage à partir d'un formulaire
    Par andre55 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/10/2007, 10h48
  3. [Formule]nombre de données dans une plage horaire
    Par melitoriva dans le forum Excel
    Réponses: 3
    Dernier message: 04/05/2007, 17h47
  4. Recherche de Donnée dans une base
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 19/09/2006, 11h40
  5. Pb de lecture données dans une plage de cellule avec itération
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/07/2006, 13h33

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