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 dans un tableau


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 93
    Par défaut Recherche dans un tableau
    Bonjour,

    J'ai un fichier excel avec plusieurs feuilles. Sur une de ces feuilles j'ai 2 colonnes. La première colonne correspond aux 3 premières lettres d'une ville et la 2 eme colonne correspond au nom de la ville entier. J'utilise dans ma macro le code ci-dessous:
    Dans la cellule A1 je met les 3 lettres de la ville que je cherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Cells.Find(What:=Range("A1"), After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
            , SearchFormat:=False).Activate
    Le problème est que certaines villes ont dans leur nom les 3 premières lettres d'autres villes.

    Je souhaiterais que la recherche ne prend pas en compte s'il y a des caractères avant ou après.

    Et je souhaite également inséré un IF dans la macro si la recherche n'a rien donné, qu'un MsgBox apparaisse avec "Pas de sélection".

    Merci d'avance pour vos réponse si utile et si pros.

  2. #2
    Membre chevronné
    Inscrit en
    Avril 2008
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 270
    Par défaut
    Re bonjour gigalia,


    Voici un exemple de recherche :
    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
    Sub ExempleRecherche()
    'déclaration des variables
    Dim zoneRecherche As Range, celluleRecherche As Range
    Dim texteRecherche As String, memAdresse As String
     
        'initialiser les variables
        Set zoneRecherche = ActiveSheet.Cells
        texteRecherche = ActiveSheet.Range("A1").Text
     
        'rechercher la cellule
        Set celluleRecherche = zoneRecherche.Find(texteRecherche, , xlValues, xlWhole)
     
        'vérifier si on a bien trouvé une cellule
        If celluleRecherche Is Nothing Then
            'on n'a pas trouvé
            MsgBox "Aucune cellule n'a été trouvée..."
        Else
            'on a trouvé une cellule. on va boucler sur toutes les cellules contenant le texte recherché
            memAdresse = celluleRecherche.Address
            Do
     
                'traiter la cellule trouvée
                MsgBox "La cellule """ & celluleRecherche.Address(0, 0) & """ contient le texte recherché."
     
                'continuer la recherche
                Set celluleRecherche = zoneRecherche.FindNext(celluleRecherche)
            Loop Until memAdresse = celluleRecherche.Address
        End If
    End Sub
    Le xlWhole spécifie que la cellule doit contenir exactement le texte cherché.

    Bonne journée

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Tout d'abord, si tu cherches une valeur exacte (tes 3 lettres) tu doit attribuer à LookAt la valeur xlWhole.
    Ensuite, dans ta méthode .find, tu règles la propriété LookIn sur XlFormulas. Suis pas sur que cela fonctionne...
    Tu recherches, en ne sélectionnant pas une plage particulière, sur toute ta feuille de calcul. Par conséquent, ta méthode find va toujours trouver ta valeur, au moins en A1...
    Donc pour pallier tout cela, je t'ai préparé ce code avec LookIn:=XlValues, LookAt:=XlWhole, une plage de recherche qui s'étends de A2 à la dernière cellule non vide de la colonne A, un petit message d'erreur etc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim RngTrouve As Range
    Dim Valeur_Cherchee As String
    Dim DernLig As Long
    DernLig = Range("A65536").End(xlUp).Row
    Valeur_Cherchee = Range("A1")
    Set RngTrouve = Range("A2:A" & DernLig).Cells.Find(What:=Valeur_Cherchee, LookIn:=xlValues, LookAt:=xlWhole)
    If RngTrouve Is Nothing Then
        MsgBox "Pas trouvé"
    Else
        RngTrouve.Offset(0, 1).Activate
    End If
    Set RngTrouve = Nothing
    Par contre, en cas de doublons (exemple SAINT NECTAIRE, SAINT ALBRET, SAINT MORET etc... En col A on ne trouvera que SAI...) en colonne A, seule la première valeur sera "retournée"...
    Bonne continuation

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Avec Find tu peux chercher une correspondance exacte (xlWhole) ou en partie (xlPart) mais dans ce second cas, les lettres son cherchées à l'intérieur de la chaîne et pas seulement au début. Pour ça, il te faut boucler sur ta plage et utiliser l'opérateur Like. l'importance de la casse est fonction de l'option de recherche (par défaut binaire) et dans ce cas, la casse a une importance. Si tu ne veux pas tenir compte de la casse il te faut le déclarer en tête de module avec "Option Compare Text"
    Voici un petit code d'exemple qu'il te faut adapter à tes besoins :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Sub ChercherVille()
     
        Dim Tbl() As String
        Dim Plage As Range
        Dim Cel As Range
        Dim I As Integer
        Dim Adr As String
     
        'la plage est en colonne A et part de A2 à Ax
        With Worksheets("feuil1")
            Set Plage = .Range(.[A2], .[A65536].End(xlUp))
        End With
     
        'parcour la plage et cherche une correspondance
        'sur les x premiers caractères entrés en cellule A1
        For Each Cel In Plage
     
            If Cel Like Worksheets("feuil1").[A1] & "*" Then
     
                'si trouvé, mémorise l'adresse de la cellule
                'dans un tableau
                I = I + 1
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = Cel.Address(0, 0)
     
            End If
     
        Next Cel
     
        'si I est égal à 0, aucune correspondance
        'sinon, affiche les adresses dans une boite de message
        If I = 0 Then
     
            MsgBox "Aucune correspondance !"
     
        Else
     
            For I = 1 To UBound(Tbl)
     
                Adr = Adr & Tbl(I) & vbCrLf
     
            Next I
     
            MsgBox "la ou les cellules correspondantes sont :" & vbCrLf & Adr
     
        End If
     
    End Sub
    Hervé.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 93
    Par défaut
    Bonjour,

    Merci pour ces 3 réponses qui fonctionnent très bien.

    Je vais garde celle de Pijaku qui est le plus adapté à ma macro.

    Encore une fois merci.

    Pijaku as-tu une solution pour les cas que tu as évoqué ou les villes se ressemblent?

  6. #6
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Pijaku as-tu une solution pour les cas que tu as évoqué ou les villes se ressemblent?
    Euh oui! Les deux solutions de mromain et Theze.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 93
    Par défaut
    Bonjour,

    J'aurais plutot pensé à quelque chose du genre Cell.FindNext ...

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

Discussions similaires

  1. [Tableaux] recherche dans un TABLEAU
    Par dunbar dans le forum Langage
    Réponses: 3
    Dernier message: 15/08/2006, 00h06
  2. [VBA-E]Recherche dans un tableau
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 49
    Dernier message: 05/07/2006, 10h35
  3. Recherche dans un tableau
    Par Bes74 dans le forum Access
    Réponses: 5
    Dernier message: 04/07/2006, 17h26
  4. [VBA-E] recherche dans un tableau
    Par tibss dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 03/05/2006, 17h52
  5. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 17h21

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