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 plusieurs mots dans un cellule ou plusieurs cellules dans une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Points : 94
    Points
    94
    Par défaut Recherche de plusieurs mots dans un cellule ou plusieurs cellules dans une colonne
    Bonsoir,

    Je viens de lire le document "Manipuler les chaines de caractères en VB6 et VBA EXCEL" pour ma recherche de plusieurs mots dans une cellule d'une colonne
    A partir d'un textbox, on écrit plusieurs mots séparés par un espace. Je veux rechercher l'existence d'un de ces mots sur chaque ligne d'une colonne. Alors, je pensais utiliser les codes SPLIT et INSTR

    J'ai essayé le code suivant sans succès :

    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
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        '
    Dim Recherche As String
    Dim Tableau() As String
    Dim Text As String
    '
    Recherche = TextBox1
    Tableau = Split(Recherche, " ")
    For i = 0 To UBound(Tableau)
    MsgBox Tableau(i)
    Next i
     
    Windows("revue referentiel.xls").Activate
    Sheets("Ref").Select
     
    For Y = 0 To UBound(Tableau)
    Text = Tableau(Y) & ","
    MsgBox Text
    Next Y
     
    If InStr(Text, Cells(2, 3)) = 0 Then
    MsgBox InStr(Text, Range("c2"))
    Else
    MsgBox InStr(Text, Range("c2"))
    End If
        '
    End Sub
    La première partie Split fonctionne mais la deuxième partie ne fonctionne pas. En réalité, je voulais mettre les mots récupérés dans tableau les mettre sous la forme mot1,mot2,mot3,etc comme dans le doc avec la variable cible
    Puis, le code INSTR ne trouve pas le mot même lorsque je le teste avec un seul mot

    merci d'avance

  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 922
    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 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La première partie Split fonctionne mais la deuxième partie ne fonctionne pas
    Je ne vois qu'un seul Split ???

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Points : 94
    Points
    94
    Par défaut
    Bonjour
    lorsque je parle de la deuxième partie c'est pour désigner le instr qui ne fonctionne pas

  4. #4
    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 922
    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 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si tu veux avoir des réponses rapides, tu as intérêt à indiquer le ou les n° de lignes où tu rencontre un problème.
    De plus "cela ne fonctionne pas" ou "ne marche pas" n'est pas précis.
    Je suppose que tu as un soucis avec le résultat de la formule Instr de la ligne 22
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InStr(Text, Cells(2, 3))
    Il y a deux choses à connaître. La valeur des variables Text et cells(2,3) . Il y a des chances que cette dernière n'a pas la valeur attendue parce-que tu ne précises pas de quelle feuille et de quel classeur dépend cette cellule.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    Tu as raison,

    En réalité, je veux rechercher toutes les lignes d'une colonne qui possèdent au moins un mot inscrit dans un textbox séparé par des espaces.

    Pour cela, je voulais utiliser la fonction Instr trouvé dans le document "Manipuler les chaines de caractères en VB6 et VBA EXCEL" et le code indiqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub RechercheMultiple()
        Dim Cible As String
     
        Cible = "engrenage,reducteur,courroie"
     
        If InStr(Cible, Range("A1")) = 0 Then
            MsgBox "Non"
        Else
            MsgBox "Oui"
        End If
    End Sub
    où il est noté : La fonction Instr peut aussi servir à contrôler si le contenu d'une chaîne est égal à un des mots "cible" défini dans la procédure.
    Cet exemple vérifie si le contenu de la cellule A1 est égal à un des 3 mots indiqué dans la variable "Cible".


    En utilisant replace, je peux reconstituer la variable Cible du code ci dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim Cible as String
    Recherche = TextBox1
     
    Cible= Replace(TextBox1, " ", ",")
    et cela fonctionne

    Ensuite, je veux utiliser le code du document où j'ai écrit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If InStr(Cible, Range("c2")) = 0 Then
    MsgBox "non"
    Else
    MsgBox InStr(Cible, Range("c2"))
    End If
    Pour le test, j'ai mis en C2 la phrase suivante : EMETTEUR STATION ALVARION et dans le textbox, j'ai écrit STATION ALVARION

    La variable Cible me retourne bien STATION,ALVARION et le Range("C2") me retourne bien EMETTEUR STATION ALVARION

    Par contre, malgré la présence de deux mots dans la phrase, il me retourne "non"

    Je ne comprends pas pourquoi

    merci pour votre aide en espérant avoir été plus claire

  6. #6
    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 922
    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 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ce qui serait aussi intéressant de savoir, c'est par quelle chaîne de caractères souhaites-tu modifier la chaîne cherchée parce-que plutôt que de passer par une boucle sur chaque ligne de la colonne et faire une recherche à l'aide de la fonction Instr, il serait plus simple d'utiliser la méthode Replace de l'objet Range.
    Comme par exemple (Dans cette procédure on remplace le mot Word par Writer dans la plage A2:A12.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub PhaseTest_3()
     Dim Text As Variant, SearchRange As Range, cel As Range
     Set SearchRange = ThisWorkbook.Worksheets("Feuil1").Range("A2:A12")
     SearchRange.Replace "Word", "Writer"
    End Sub
    Sinon, voici une procédure utilisant Instr.
    La constante TextBox1 simule le contrôle TextBox1 d'un UserForm et contient la chaîne "Vba Excel"
    Une boucle permet d'afficher dans la colonne A, l'adresse des cellules contenant le mot Vba ou Excel.
    Dans une cellule de la colonne A, la chaîne de caractères contient des mots séparés par des points virgules mais le séparateur n'a pas d'importance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub PhaseTest_2()
     Const TextBox1 As String = "VBA Excel" ' Simulation de TextBox1
     Dim Text As Variant, SearchRange As Range, cel As Range
     Set SearchRange = ThisWorkbook.Worksheets("Feuil1").Range("A2:A12")
     
     For Each cel In SearchRange
       For Each Text In Split(TextBox1)
         If InStr(cel, Text) Then Debug.Print "Trouvé " & Text & " à l'adresse " & cel.Address
       Next Text
     Next cel
    End Sub

  7. #7
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ça
    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
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim R As Range
    Dim L As Long
    Dim I As LoadPictureConstants
    Dim Tb
    Dim Rchercher As String
    Dim Itb As Long
    Dim tb2()
    Dim trouve As Boolean
    If KeyCode = 13 Then
    If Trim("" & TextBox1) = "" Then Exit Sub
        Tb = Split(TextBox1 & " ", " ")
        Set R = Workbooks("revue referentiel.xls").Sheets("Ref").UsedRange
        ReDim tb2(Itb)
        Itb = -1
        For L = 2 To R.Rows.Count
        trouve = False
            For I = 0 To UBound(Tb)
            If trouve = False Then Itb = Itb + 1
                         trouve = True
                If Trim("" & Tb(I)) <> "" Then
                    If InStr(1, R(L, 3), UCase(Trim("" & Tb(I)))) > 0 Then
                         ReDim Preserve tb2(Itb)
                         If Trim("" & tb2(Itb)) = "" Then
                             tb2(Itb) = Trim("" & Tb(I))
                         Else
                             tb2(Itb) = tb2(Itb) & "," & Trim("" & Tb(I))
                         End If
     
                    End If
                End If
            Next
        Next
    End If
    End Sub

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Points : 94
    Points
    94
    Par défaut
    Bonsoir,

    Dans le dernier code de Rdurupt, peux tu me dire à quoi correspond LoadPictureConstant et pourquoi ajouter dans le tableau tb la valeur ""

    J'ai modifié ces lignes pour avoir l'adresse de la ligne dans le tb2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Trim("" & tb2(Itb)) = "" Then
                             tb2(Itb) = L 'Trim("" & Tb(I)).Adresse
                         Else
                             tb2(Itb) = L 'tb2(Itb) & "," & Trim("" & Tb(I))
                         End If
    Par contre, comment faire pour ne pas avoir les valeurs vide ?

    Merci d'avance

    Cordialement,

    en plus de mes questions ci dessus, j'ai voulu ajouter ce code à la suite de ton code pour mettre les informations trouvées dans une listbox11, mais j'ai une erreur sur le l'erreur est "l'indice n'appartient pas à la sélection"

    pourquoi ? le tableau est pourtant déclaré !

    Cordialement,

  9. #9
    Invité
    Invité(e)
    Par défaut Bonjour,
    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
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim R As Range
    Dim L As Long
    Dim I As Long 'Ici je me suis trompé j'ai demandé a vb de terminer ma phrase  mais je lui est trop fait confiance.
    Dim Tb
    Dim Rchercher As String
    Dim Itb As Long
    Dim tb2()
    Dim trouve As Boolean
    If KeyCode = 13 Then
    If Trim("" & TextBox1) = "" Then Exit Sub
        Tb = Split(TextBox1 & " ", " ") 'ici je fait un tableau en utilisant comme caractère de séparation les espace.
        Set R = Workbooks("revue referentiel.xls").Sheets("Ref").UsedRange
        ReDim tb2(Itb)
        Itb = -1
        For L = 2 To R.Rows.Count 'pour chaque ligne 
        trouve = False
            For I = 0 To UBound(Tb)'je recherche un des mots saisie dans TextBox1
    'dans la partie qui suis je place le résultat dans un deuxième tableau je ne savais pas ce que tu voulais en faire!
            If trouve = False Then Itb = Itb + 1 
                         trouve = True
                If Trim("" & Tb(I)) <> "" Then
                    If InStr(1, R(L, 3), UCase(Trim("" & Tb(I)))) > 0 Then 'si le mot est trouvé dans la cellule?
                         ReDim Preserve tb2(Itb)  'je redimentionne mon tableau
                         If Trim("" & tb2(Itb)) = "" Then 'si c'est la la premier mot
                             tb2(Itb) = Trim("" & Tb(I))
                         Else
                             tb2(Itb) = tb2(Itb) & "," & Trim("" & Tb(I)) 'pour les suivant je place ma virgule.
                         End If
     
                    End If
                End If
            Next
        Next
    End If
    End Sub
    maintenant si stocker les valeur dans une colonne et pas dans un tableau?
    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
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim R As Range
    Dim L As Long
    Dim I As Long 'Ici je me suis trompé j'ai demandé a vb de terminer ma phrase  mais je lui est trop fait confiance.
    Dim Tb
    Dim Rchercher As String
    Dim Itb As Long
    If KeyCode = 13 Then
        If Trim("" & TextBox1) = "" Then Exit Sub
        Tb = Split(TextBox1 & " ", " ") 'ici je fait un tableau en utilisant comme caractère de séparation les espace.
        Set R = Workbooks("revue referentiel.xls").Sheets("Ref").UsedRange
        For L = 2 To R.Rows.Count 'pour chaque ligne
            For I = 0 To UBound(Tb) 'je recherche un des mots saisie dans TextBox1
                'dans la partie qui suis je place le résultat dans un deuxième tableau je ne savais pas ce que tu voulais en faire!
                If Trim("" & Tb(I)) <> "" Then
                    If InStr(1, R(L, 3), UCase(Trim("" & Tb(I)))) > 0 Then 'si le mot est trouvé dans la cellule?
                        If Trim("" & R(L, 3)) = "" Then 'si c'est la la premier mot
                            R(L, 3) = Trim("" & Tb(I))
                        Else
                            R(L, 3) = R(L, 3) & "," & Trim("" & Tb(I)) 'pour les suivant je place ma virgule.
                        End If
                    End If
                End If
            Next
        Next
    End If
    End Sub

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Points : 94
    Points
    94
    Par défaut
    Merci,

    Par contre, comment indexer le tb2 seulement quand je trouve une valeur ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    C'est déjà le cas!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Points : 94
    Points
    94
    Par défaut
    Hélas, non !

    Je viens de faire un test et Itb fait 30153 et le tb2 va de tb2(0) à tb2(29854) alors que toujours dans mon test seul le tb2(0) à tb2(9) me sont utiles !
    Cordialement,

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Points : 94
    Points
    94
    Par défaut
    Bonsoir,

    En réalité, j'ai supprimé la ligne 11 et positionnée Itb = Itb +1 à la ligne 15 et cela a l'air de fonctionner
    merci pour le temps passé dessus

    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
     
    If KeyCode = 13 Then
        If Trim("" & TextBox1) = "" Then Exit Sub
            Tb = Split(TextBox1 & " ", " ")
            Set R = Workbooks("revue referentiel.xls").Sheets("Ref").UsedRange
            ReDim tb2(Itb)
            Itb = -1
                For L = 2 To R.Rows.Count
                trouve = False
                    For I = 0 To UBound(Tb)
                        'If trouve = False Then Itb = Itb + 1
                                     trouve = True
                            If Trim("" & Tb(I)) <> "" Then
                                If InStr(1, R(L, 3), UCase(Trim("" & Tb(I)))) > 0 Then
                                    Itb = Itb + 1
                                     ReDim Preserve tb2(Itb)
                                     If Trim("" & tb2(Itb)) = "" Then
                                         tb2(Itb) = L ' numéro de la ligne de l'onglet
                                     Else
                                         tb2(Itb) = L 'numéro de la ligne de l'onglet
                                     End If
                                End If
                            End If
                    Next I
                Next L

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/03/2015, 13h32
  2. Réponses: 1
    Dernier message: 02/05/2014, 17h05
  3. Réponses: 4
    Dernier message: 04/04/2014, 15h54
  4. [XL-2007] Copier coller plage de cellule VBA en decalant d'une colonne si remplie
    Par thibault12500 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/11/2013, 11h53
  5. [AC-2010] Afficher dans un message(Msgbox) les valeurs d'une colonne d'une requete
    Par sebing dans le forum VBA Access
    Réponses: 40
    Dernier message: 11/12/2012, 22h52

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