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 et données manquantes [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
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut .Find et données manquantes
    Bonjour à tous,

    Je viens vers vous car j'ai un problème que je ne sais résoudre... et qui pourtant doit être simple.
    Mon problème:
    J'ai une base de donnée en feuille 4 avec une liste d'espèces présentes (colonne I à V).
    En feuille 5, j'ai une InputBox qui demande quelle espèce est recherchée, et renvoie pour chaque résultat, des données (date, nom, action) liée à cette espèce.
    Le code fonctionne mais ne renvoie pas toutes les données présentes (par exemple, il identifie 5 fois "loutre" au lieu des 8 présentes).
    Voici mon 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
    Sub Recherche_espèce()
    Dim FL4 As Worksheet
    Dim FL5 As Worksheet
    Dim c As Range
    Dim i As Integer
    Dim don As String
     
     
    Set FL4 = Worksheets("Espèces")
    Set FL5 = Worksheets("Espèces_Valorisation")
    don = InputBox("Bonjour, quelle espèce recherches tu ?")
           With FL4.Range("i2:v" & FL4.Range("V65535").End(xlUp).Row) 
            ' With FL4.Range("i2:v65535")
     
                      Set c = .Find(don, LookAt:=xlPart)
     
                                            If Not c Is Nothing Then 
                            FirstAddress = c.Address 
     
                          i = 2
                            Do
     
                                    FL5.Cells(i, 5) = FL4.Cells(c.Row, 2)
                                    FL5.Cells(i, 6) = FL4.Cells(c.Row, 5)
                                    FL5.Cells(i, 7) = FL4.Cells(c.Row, 6)
     
                                    Set c = .FindNext(c) 
                                    i = i + 1
                                    Loop While Not c Is Nothing And c.Address <> FirstAddress
                                    End If
     
                            End With
             Set c = Nothing 'Efface c pour libérer la mémoire
     
    End Sub
    Je vous épargne les commentaires et nombreux test effectués.
    Le problème est donc que je ne comprends pas pourquoi certaines données ne sont pas identifiés (le format de cellule est identique pour chaque lignes).
    J'ai parcouru de nombreux cas sur le forum, les aides dédiées sur le .Find ou le Range , mais ne trouve pas mon erreur...

    Je tourne en rond depuis deux jours et j'ai le sentiment de ne pas avoir le recul nécessaire pour identifier mon erreur...
    Merci d'avance pour votre aide!
    P.S: Je sais que mon problème pourrait se résoudre facilement avec d'autres options (TCD, formule, etc.) mais cet outil sera utilisé par des personnes non familières avec Excel, d'où l'InputBox

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Mr jack, bonjour le forum,

    Une autre méthode que Find avec l'utilisation d'une variable tableau où la lecture des données se fait extrêmement vite (non testée) :

    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
    Sub Recherche_espèce2()
    Dim FL4 As Worksheet
    Dim FL5 As Worksheet
    Dim don As String
    Dim TV As Variant
    Dim I As Integer
    Dim J As Integer
    Dim K As Integer
     
    Set FL4 = Worksheets("Espèces")
    Set FL5 = Worksheets("Espèces_Valorisation")
    don = InputBox("Bonjour, quelle espèce recherches tu ?")
    TV = FL4.Range("I2:V" & FL4.Range("V65535").End(xlUp).Row)
    K = 2
    For I = 1 To UBound(TV(I, 1))
        For J = 1 To UBound(TV, 2)
            If InStr(1, TV(I, J), don, vbTextCompare) <> 0 Then
                FL5.Cells(K, 5) = TV(I, 2)
                FL5.Cells(K, 6) = TV(I, 5)
                FL5.Cells(K, 7) = TV(I, 6)
                K = K + 1
                Exit For
            End If
        Next J
    Next I
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut
    Merci pour ce retour Thautheme!

    Je viens de tester le code.
    Celui-ci affiche une erreur sur cette ligne: For I = 1 To UBound(TV(I, 1)) ("l'indice n'appartient pas à la sélection").
    C'est peut-être For I = 1 To UBound(TV, 1) à la place? Ou j'ai mal compris UBound.

    Autre problème, FL5.Cells(K, 5) = TV(I, 1) ne renvoie plus les bonnes valeurs.
    TV est définit sur "I2:V" alors que les informations que je souhaite obtenir sont en colonnes B, E et F, et malheureusement on ne peut mettre de valeurs négatives...

    Je continue de regarder ton code dans le détail.
    Merci!

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    re
    Citation Envoyé par Thautheme Voir le message
    Bonjour Mr jack, bonjour le forum,

    Une autre méthode que Find avec l'utilisation d'une variable tableau où la lecture des données se fait extrêmement vite (non testée) :
    bonjour tautheme
    si je ne me trompe pas EN LECTURE!! la lecture d'un range va aussi vite c'est en écriture que ca va plus vite avec une variable tableau

    ps: mettre des debug.print pour voir ou ca cloche
    peut être que calculate prend de la mémoire lors des "Fl5....." (retranscription en fl5)
    la ou la variable tableau serait utile c'est bien ici (en écriture)
    la retranscription se ferait APRES!!!! avec le tableau complet
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut
    J'ai repris le code émis par Tautheme, en déclarant TV = FL4.Range("A2:V" & FL4.Range("V65535").End(xlUp).Row) mais je retrouve le même problème: toutes les données ne sont pas trouvées par .Find...
    Je n'arrive pas à comprendre car, malgré les changements de formes dans la déclaration de la zone de recherche, les problèmes persistent.

    Je me permets de mettre en copie une version du tableur (avec les seules données nécessaires)

    Merci à tous!

    P.S: Le plus surprenant, pour reprendre l'exemple de la loutre et 3 identification sur 5, c'est que les 3 premières lignes sont laissées vides
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     FL5.Cells(I, 5) = FL4.Cells(c.Row, 2)
                                    FL5.Cells(I, 6) = FL4.Cells(c.Row, 5)
                                    FL5.Cells(I, 7) = FL4.Cells(c.Row, 6)
    La première réponse est en FL5.Cells(5,5) et vide pour FL5.Cells(2,5), FL5.Cells(3,5) et FL5.Cells(4,5)
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    As-tu essayé mon code ?
    (je n'ouvre pas les fichiers joints avec macro)

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut
    Oui bien sur, je me penche dessus actuellement.
    J'ai du faire quelques modifications de forme mais le problème persiste...
    Je trouve, pour la loutre 6 identification sur 8, mais avec une donnée en double

    P.S: Je mets à disposition le fichier sans macro au besoin
    Fichiers attachés Fichiers attachés

  8. #8
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour, lorsque j'ai une base de données j'aime bien travailler avec des extractions effectuées suivant des critères choisis dans une liste d'une ListBox. En sachant que les données de la liste des critères ont été elles aussi choisi lors de la création d'une nouvelle fiche, d'après une liste, du moins en ce qui concerne celles identiques à celles éxistantes. Je ne sais pas si je serais bien compris, mais cela permet d'éviter a coup sur toutes les erreurs de frappe etc. Parce que les recherches par TextBox ou InputBox sont génératrices d'erreurs de frappe, de syntaxes ou autres.
    si vous ne connaissez pas les filtres élaborés voir ci dessous
    https://philippetulliez.developpez.c...dvancedfilter/
    Pour ma part je trouve les extractions élaborés très efficaces, sures et précises. d'un codage VBA très simple, ce qui ne gâche rien pour ceux qui sont faible en code VBA
    Cordialement

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    heu ..c'est un peu normal que tu es des doubles
    ma fois!!! ton find tu le fait dans les colonnes I:V ,il est bien envident que si tu a le mot loutre 2 fois sur la même ligne entre I et V il te le sortira 2 fois

    et en plus il y a des cellules fusionnées dans tes tableaux c'est pas fait pour plaire a vba ca et au développeur qui maitrise mal visiblement les object range,areas,column ,etc....
    et en plus pour couronner le tout il y a deux langues pour la recherche ca va pas être triste
    non sérieusement oublie le find et fait le dans une boucle classique et met le nombre de colonnes en optional car soit tu fait une recherche en langue zimbabouais ou en Français et selon la langue tu choisi ta colonne dans la boucle
    dans ta boucle memo les row trouvé et a chaque trouvé test avec les row déjà trouvés pour éviter les doublons si tu persiste bien sur a chercher dans I:V au lieu d'une seul colonne
    bref j'ai fermé ton fichier ca m'a donné mal a la tète

    et même les filtres avancés vont cafouiller avec les fusions
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Le problème vient probablement de la définition de la zone de recherche.
    Si il s'agit d'un tableau (sans ligne ni colonne entièrement vide) :
    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
    Option Explicit
    Sub Recherche_espèce()
    Dim f As Worksheet
    Dim a As String
    Dim e As String
    Dim c As Range
    Dim r As Range
     
      Set f = Worksheets("Espèces")
      Set r = Worksheets("Espèces_Valorisation").Rows(2)
      e = InputBox("Bonjour, quelle espèce recherches tu ?")
      With f.Range("B2").CurrentRegion  'ou A1
        Set c = .Find(what:=e, LookIn:=xlValues, LookAt:=xlPart)
        If Not c Is Nothing Then
          a = c.Address
          Do
            r.Cells(1, "B").Value = c.EntireRow.Cells(1, "B").Value
            r.Cells(1, "F").Value = c.EntireRow.Cells(1, "E").Value
            r.Cells(1, "G").Value = c.EntireRow.Cells(1, "F").Value
            r.Cells(1, "I").Value = c.Address
            Set c = .FindNext(c)
            Set r = r.Offset(1)
          Loop While c.Address <> a
        End If
      End With
      Set f = Nothing
      Set c = Nothing
      Set r = Nothing
     
    End Sub

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut
    Bonjour Patrice740,

    Merci pour ton aide.
    J'ai effectivement le sentiment tenace que le problème vient de la zone de recherche... sans pour autant pouvoir identifier l'erreur.

    Je vais essayer avec le code que tu proposes et vous ferai un retour.
    Merci!

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

Discussions similaires

  1. Remplacer toutes les données manquantes
    Par PhYx dans le forum SAS Base
    Réponses: 6
    Dernier message: 04/07/2013, 12h09
  2. Fournisseur de données ou paquets de données manquants
    Par muadhib dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/10/2007, 16h56
  3. [Oracle][Delphi]Données manquantes apre sun select
    Par LAPLACE dans le forum Oracle
    Réponses: 3
    Dernier message: 24/09/2007, 13h40
  4. mauvais controlfile créé - données manquantes
    Par saptech dans le forum Administration
    Réponses: 6
    Dernier message: 01/07/2007, 13h06
  5. Remplacement données manquantes
    Par HurtMarley dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/07/2006, 11h36

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