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 valeurs dans plusieurs fichiers


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut Recherche de valeurs dans plusieurs fichiers
    Bonjour à tous,

    J'ai besoin d'un coup de pouce pour effectuer une recherche de valeur dans 4 fichiers Excel différents et ensuite afficher les résultat dans une messagebox.

    Voila mon bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Message = "Entrez la valeur"
    'Titre = "Recherche dans les 4 fichiers"
    'NC = InputBox(Message, Titre, "")
    si par exemple je rentre la valeur "12345678", et qu'il trouve 6 resultats répartis dans les 4 fichiers j'aurais besoin des résultats dans une
    en indiquant dedans La date et un nom corespondant à cette valeur recherchée. Par exemple :

    "NC trouvé dans le fichier xx.xls à la date de date$ sous le nom de nom$"
    "NC trouvé dans le fichier yy.xls à la date de date$ sous le nom de nom$"
    "NC trouvé dans le fichier zz.xls à la date de date$ sous le nom de nom$"

    Je n'arrive pas à appliquer la commande "Recherchev" dans mon cas.

    Merci de m'accompagner sur le chemin qui me menera à la (lol)

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Pendant ce temps, j'ai trouvé dans ce Forum, à cette adresse
    http://www.developpez.net/forums/sho...d.php?t=301105 le début de ma réponse, (merci Ouskel'n'or).
    J'ai modifié le code pour qu'il me renvoi le vrai N°de ligne, à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NoLigne = c.Row '+ 1 on mémorise le N° de ligne
    ! J'ai retirer le "+1" !

    Je cherche maintenant, par rapport à ce code, à avoir dans ma MSGBOX, la totalité des réponses, avec le nom de fichier dans lequel il à trouvé une occurence, le N° de la ligne concernée, et l'affichage de 2 champs, (Nom et adresse par exemple), de ce même fichier.
    A l'arrivée, cela donnerai par exemple :

    Fichier XX.xls, Ligne 338, Nom, Adresse
    Fichier YY.xls, Ligne 28, Nom, Adresse
    Fichier ZZ.xls, Ligne 654, Nom, Adresse

    Merci d'avance. Moi je continue mes recherches.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    bonjour,
    tu doit savoir sur quel colonne se trouve les données que tu recherches, comme la date, etc..

    en principe, dés que tu appel une feuille ou un range dans un classeur il s'ouvre automatiquement

    Tu doit également faire une recherche par ligne ?

    N'oublie pas de fermer les classeurs après usage et avant d'enrégistrer, sinon à l'enrégistrement il serront mis ensemble et pour les séparer c'est la galère, dés que tu en ouvre un il viennent tout les 4.

    Avec ces données je ne vois pas où est le problème, sinon explicite...
    A+

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Je sais dans quelle colonne se trouve la donnée à rechercher. Le truc c'est au niveau du resultat de la recherche. Si je cherche dans la colonne "Nom" la valeur "Dupont", j'aurais besoin d'avoir, par exemple, dans ma MSGBOX le résultat suivant :

    "Dupont trouvé à la ligne 220 du fichier XXX.XLS"
    "Dupont trouvé à la ligne 620 du fichier XXX.XLS"
    "Dupont trouvé à la ligne 22 du fichier YYY.XLS"
    "Dupont trouvé à la ligne 240 du fichier ZZZ.XLS"
    "Dupont trouvé à la ligne 480 du fichier XXX.XLS"

    Etc.....

    Pour l'instant mon code me renvoi juste la valeur de ligne du classeur ouvert.
    J'ai beau chercher, mais là je suis vraiment nul en VBA.

    Et puis est-ce seulement possible de chercher quelque chose dans un XLS sans l'ouvrir, (physiquement à l'écran) ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    je t'ai péché ça. peut etre que ça peut t'aider

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Merci pour ton aide Alsimbad, mais là, je ne capte pas grand chose dans les exemples de ton lien .

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    En cherchant dans le forum j'ai trouvé quelques codes que j'ai additionné pour donner cela :

    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
    Private Sub RECH_Click()
    Dim Message, Title, Default, MyValue
    ' Définit le message.
    Message = "Ce que je recherche"
    Title = "Démonstration de InputBox"    ' Définit le titre.
    Default = ""    ' Définition la valeur par défaut.
    ' Affiche le message, le titre et la valeur par défaut.
    npc = InputBox(Message, Title, Default)
     
    Dim maVal As Variant, c As Variant, NoLigne As Long
     
    Dim F1 As Worksheet
        Set F1 = Worksheets("TOT")
        maVal = npc
     
        With F1.Range("K1:K2000")  'plage de recherche
            Set c = .Find(maVal, LookIn:=xlValues) 'Recherche de la 1ère occurrence
     
            'Si la donnée est trouvée, entrée dans la boucle
            If Not c Is Nothing Then
                Do
                    NoLigne = c.Row '+ 1  on mémorise le N° de ligne
                    'Opération sur la ligne trouvée (votre code)
                    MsgBox NoLigne 'ou Debug.Print NoLigne  'Juste pour voir
     
     MsgBox npc 'ou Debug.Print NoLigne  'Juste pour voir
     
                    'recherche de l'occurrence suivante
                    Set c = .FindNext(c)
     
                    'Si aucune donnée trouvée, sortie de la boucle
                Loop While Not c Is Nothing And c.Row > NoLigne
            End If
        End With
        Set c = Nothing
        Set F1 = Nothing
     
    End Sub
    J'ai donc bien les réponses voulues, mais une par une.
    Est-il possible d'afficher toutes les infos dans une seule Msgbox ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonjour

    tout d abord est ce que ta recherche porte uniquement sur une colonne de ou sur toute une feuille de chaque fichier?

    ensuite un msgbox me parait inapproprié pour recuperer plusieurs ligneS
    une boite de dialogue avec un listbox serai je pense plus convivial

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    La recherche se comporte sur toute une feuille de chaque fichiers mais d'une seule colonne variable en fonction du choix de l'utilisateur.

    Je ne sais pas si la MSGBOX est appropriée, mais ce type d'affichage est direct, ce qui en facilite l'utilisation des données affichées.
    Pour reprendre ma demande :

    Je sais dans quelle colonne se trouve la donnée à rechercher. Le truc c'est au niveau du resultat de la recherche. Si je cherche dans la colonne "Nom" la valeur "Dupont", j'aurais besoin d'avoir, par exemple, dans ma MSGBOX le résultat suivant :

    "Dupont trouvé à la ligne 220 du fichier XXX.XLS"
    "Dupont trouvé à la ligne 620 du fichier XXX.XLS"
    "Dupont trouvé à la ligne 22 du fichier YYY.XLS"
    "Dupont trouvé à la ligne 240 du fichier ZZZ.XLS"
    "Dupont trouvé à la ligne 480 du fichier XXX.XLS"

    Etc.....
    Si je ne suis pas suffisament clair, dites le moi, que je reformule autrement.

  10. #10
    Membre confirmé Avatar de Commodore
    Homme Profil pro
    Business manager
    Inscrit en
    Février 2004
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Business manager

    Informations forums :
    Inscription : Février 2004
    Messages : 599
    Points : 632
    Points
    632
    Par défaut
    resumons:
    1)tu entres dans une inputbox une valeur
    2)tu recherches cette valeur dans 4 fichiers différents
    3)tu restitues les n° de ligne(s) et de colonne(s) avec le fichier correspondant dans une msgbox

    ai-je tout bon jusque là ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Salut Commodore, (A quand AMIGA ?)

    Tu as tout bon jusque-là, c'est cela qu'il me faut.

  12. #12
    Membre confirmé Avatar de Commodore
    Homme Profil pro
    Business manager
    Inscrit en
    Février 2004
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Business manager

    Informations forums :
    Inscription : Février 2004
    Messages : 599
    Points : 632
    Points
    632
    Par défaut
    Entrer la valeur via InputBox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim val as Variant
    val = InputBox("Entrer la valeur a chercher","InputBox_Titre")
    Supposons que chaque fichier dans lequel tu vas rechercher ta valeur est organisé en colonnes. Disons que l'on effectue la recherche sur la colonne A.

    Pour 1 fichier ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim lig As Integer, col As Integer
    lig=1: col=1 'mettre ici les valeurs correctes
    Workbooks.Open "fichier_1.xls"
    While Cells(lig,col) <> Empty
        If cells(lig,col) = val Then MsgBox "Trouvé!! ligne :" & lig
    Wend
    Workbooks("fichier_1.xls").Close
    edit: j'ai commencé sur AMSTRAD

    /!\ non testé

  13. #13
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    En fait ce qu'il te manque c'est d'ouvrir les classeur et les refermer sans voir les mvts de feuilles...
    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
    Sub OuvrirLesClasseursPourChercherQuelqueChose()
    Dim lafeuille As Worksheet, i As Byte, msg
    Dim Liste 'classeurs à ouvrir
    Application.screenupdating = false
        Liste = Array("NomBook1.xls", "NomBook2.xls", "NomBook3.xls", "NomBook4.xls")
        For i = 0 To UBound(Liste)
            Workbooks.Open Filename:=Liste(i)
            For Each lafeuille In ActiveWorkbook.Worksheets
                'Recherche de la donnée
                msg = msg & "La Donnée" & NoLigne & vbcr 'ou addresse (tu as le code)
            Next
            ActiveWorkbook.Close False
        Next
        MsgBox msg
        Application.screenupdating = True
    End Sub
    Tu dis
    A+

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Test pour le code de Commodore, voila ton code intégré dans ma base par l'intermédiaire d'un simple boutton pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton1_Click()
    Dim lig As Integer, col As Integer
    lig = 1: col = 4 'mettre ici les valeurs correctes
    Workbooks.Open "c:\A2.xls"
    While Cells(lig, col) <> Empty
        If Cells(lig, col) = Val Then MsgBox "Trouvé!! ligne :" & lig
    Wend
    Workbooks("c:\A2.xls").Close
    End Sub
    J'ai le message d'erreur suivant qui arrive :
    Erreur de compilation

    Argument non facultatif
    en surlignant en bleu ...... Val then ......

  15. #15
    Membre confirmé Avatar de Commodore
    Homme Profil pro
    Business manager
    Inscrit en
    Février 2004
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Business manager

    Informations forums :
    Inscription : Février 2004
    Messages : 599
    Points : 632
    Points
    632
    Par défaut
    oh dsl, val est un mot réservé... change le nom de la variable en toto et ça marche

  16. #16
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Une solution plus rapide pour visiter plusieurs feuilles dans plusieurs classeurs serait Find, méthode qui t'éviterait d'avoir à lire toutes les lignes. En outre tu as un code complet dans l'aide en ligne à Find.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    En utilisant ton code, Commodore, j'obtient surtout un plantage grave d' EXCEL.
    Je regarde à FIND de l'aide en ligne.

  18. #18
    Membre confirmé Avatar de Commodore
    Homme Profil pro
    Business manager
    Inscrit en
    Février 2004
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Business manager

    Informations forums :
    Inscription : Février 2004
    Messages : 599
    Points : 632
    Points
    632
    Par défaut

    une boucle infinie... j'ai oublié d'incrémenter la variable lig avant Wend



    j'avais bien dit que c'était pas testé

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Dans l'aide en ligne, je n'ai rien de semblable sur Find. Ou se trouve le code complet ?

  20. #20
    Membre confirmé Avatar de Commodore
    Homme Profil pro
    Business manager
    Inscrit en
    Février 2004
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Business manager

    Informations forums :
    Inscription : Février 2004
    Messages : 599
    Points : 632
    Points
    632
    Par défaut
    Citation Envoyé par Aide Excel
    Find, méthode
    Voir aussiS'applique àExempleDétailsMéthode Find telle qu'elle s'applique à l'objet WorksheetFunction.

    Cette méthode recherche des informations spécifiques dans une feuille de calcul.

    expression.Find(Arg1, Arg2, Arg3)
    expression Obligatoire. Expression qui renvoie un objet WorksheetFunction.

    Arg1 Argument de type String obligatoire. Nom de la feuille de calcul.

    Arg2 Argument de type String obligatoire. Nom de la plage.

    Arg3 Argument de type Variant facultatif. Nom d'un argument permettant d'affiner la recherche.

    Méthode Find telle qu'elle s'applique à l'objet Range.

    Cette méthode recherche une information spécifique dans une plage et renvoie un objet Range qui représente la première cellule où cette information apparaît. Cette méthode renvoie la valeur Nothing si l'information n'est pas trouvée. N'affecte ni la sélection ni la cellule active.

    Pour plus d'informations sur la fonction de feuille de calcul Find de Visual Basic, consultez Utilisation des fonctions de feuille de calcul dans Visual Basic.

    expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
    expression Obligatoire. Expression qui renvoie un objet Range.

    What Argument de type Variant obligatoire. Données à rechercher. Il peut s'agir d'une chaîne de caractères ou de tout autre type de données Microsoft Excel.

    After Argument de type Variant facultatif. Cellule après laquelle vous souhaitez commencer la recherche. Cela correspond à la position de la cellule active lorsqu'une recherche est effectuée à partir de l'interface utilisateur. Notez que l'argument After doit correspondre à une seule cellule dans la plage. Rappelez-vous que la recherche commence après cette cellule ; la cellule spécifiée n'est pas recherchée jusqu'à ce que la méthode reviennent à cette cellule. Si vous ne spécifiez pas cet argument, la recherche commence après la cellule située dans le coin supérieur gauche de la plage.

    LookIn Argument de type Variant facultatif. Type d'informations.

    LookAt Argument de type Variant facultatif. Il peut s'agir de l'une des constantesXlLookAt suivantes : xlWhole ou xlPart.

    SearchOrder Argument de type Variant facultatif. Il peut s'agir de l'une des constantes XlSearchOrder suivantes : xlByRows ou xlByColumns.

    SearchDirection Argument de type XlSearchDirection facultatif. Direction de la recherche.

    XlSearchDirection peut être l'une de ces constantes XlSearchDirection.
    xlNext par défaut
    xlPrevious

    MatchCase Argument de type Variant facultatif. Affectez-lui la valeur True pour que la recherche respecte la casse. La valeur par défaut est False.

    MatchByte Argument de type Variant facultatif. Cet argument est utilisé uniquement si vous avez sélectionné ou installé la prise en charge des langues codées sur deux octets. Affectez-lui la valeur True pour que les caractères codés sur deux octets ne correspondent qu'aux caractères codés sur deux octets. Affectez-lui la valeur False pour que les caractères codés sur deux octets correspondent à leurs équivalents codés sur un octet.

    SearchFormat Argument de type Variant facultatif. Format de la recherche.

    Notes
    Les paramètres des arguments LookIn, LookAt, SearchOrder et MatchByte sont enregistrés chaque fois que vous utilisez cette méthode. Si vous ne spécifiez aucun paramètre pour ces arguments lors du prochain appel de la méthode, les paramètres enregistrés sont utilisés. Le fait de définir les paramètres de ces arguments modifie les paramètres de la boîte de dialogue Rechercher, ce qui a pour effet de changer les paramètres enregistrés qui sont utilisés lorsque vous ne spécifiez pas les arguments. Pour éviter toute ambiguïté, définissez ces arguments de façon explicite chaque fois que vous utilisez cette méthode.

    Les méthodes FindNext et FindPrevious permettent de répéter la recherche.

    Lorsque la recherche atteint la fin de la plage de recherche spécifiée, elle revient au début de cette plage. Pour arrêter une recherche lorsqu'elle revient au point de départ, enregistrez l'adresse de la première cellule trouvée, puis comparez l'adresse de chaque cellule ultérieurement trouvée avec l'adresse enregistrée.

    Pour effectuer des recherches plus complexes, utilisez une instruction For Each...Next avec l'opérateur Like. Par exemple, le code suivant effectue une recherche dans toutes les cellules contenues dans la plage A1:C5 qui utilise une police dont le nom commence par les lettres Cour. Lorsque Microsoft Excel trouve une cellule correspondante, il lui affecte la police Times New Roman.

    For Each c In [A1:C5]
    If c.Font.Name Like "Cour*" Then
    c.Font.Name = "Times New Roman"
    End If
    Next

    Exemple
    Cet exemple montre comment rechercher toutes les cellules de la plage A1:A500 dans la feuille de calcul Worksheet 1 contenant la valeur 2 et comment la remplacer par la valeur 5.

    With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
    firstAddress = c.Address
    Do
    c.Value = 5
    Set c = .FindNext(c)
    Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
    End With

Discussions similaires

  1. Logiciel de recherche d'expression dans plusieurs fichiers
    Par Deciprog dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 31/03/2010, 16h23
  2. Rechercher une valeur dans plusieurs feuilles
    Par modus57 dans le forum Excel
    Réponses: 28
    Dernier message: 30/03/2008, 18h54
  3. Recherche de string dans plusieurs fichiers (findstr like)
    Par Booster2ooo dans le forum Langage
    Réponses: 10
    Dernier message: 07/09/2007, 17h19
  4. Module de recherche de mots dans plusieurs fichiers
    Par hat_et_m dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/09/2006, 20h09

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