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 une feuille avec résultat unique par ligne [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de DurDur
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2005
    Messages : 244
    Points : 135
    Points
    135
    Par défaut Recherche dans une feuille avec résultat unique par ligne
    Bonjour,

    Je suis entrain de transcrire une application "ACCESS" sous "EXCEL".
    Mes connaissances EXCEL étant pratiquement nulle, je me suis inspiré d'un modéle trouvé sur le net pour créer un formulaire.
    Après mes modifications, le fonctionnement est satisfaisant.

    J'ai besoin de votre aide pour affiner la recherche d'un mot dans toute la feuille.
    Le code suivant me renvoie plusieurs fois un résultat quand plusieurs cellules d'une même ligne contiennent le mot recherché.
    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
    Private Sub B_ok1_Click()
        Me.ComboBox1.Clear
        I = 0
    'selectionne toute les cellules de la feuille nommée : ws
        Set plage = Ws.[A1].CurrentRegion
    'MotRecherche provient d'un textbox du formulaire
        Set c = plage.Find(Me.MotRecherche, , , xlPart)
            If Not c Is Nothing Then
                premier = c.Address
            Do
                Me.ComboBox1.AddItem
                lig = c.Row
                Me.ComboBox1.List(I, 0) = plage.Cells(lig, 1)
                Me.ComboBox1.List(I, 1) = lig
                I = I + 1
                Set c = plage.FindNext(c)
            Loop While Not c Is Nothing And c.Address <> premier
        End If
        If Me.ComboBox1.ListCount > 0 Then
            pointeur = 0
            ligne = Me.ComboBox1.List(pointeur, 1)
            affiche
        Else
            MsgBox " ATTENTION - Recherche sans résultat "
        End If
    End Sub
    Comment faire pour que le combobox ne contienne qu'une seule fois la ligne dont une ou plusieurs cellules contiennent le mot recherché ?

    Merci de vos réponses.

    JCB

  2. #2
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Tester les éléments de ta Combobox avant d'utiliser la propiété .AddItem

    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
    If Not c Is Nothing Then
                premier = c.Address
            Do
                For i = 0 to I
                  If Me.ComboBox1.List(i, 1) = c.Row Goto LigneExiste
                Next i
                Me.ComboBox1.AddItem
                lig = c.Row
                Me.ComboBox1.List(I, 0) = plage.Cells(lig, 1)
                Me.ComboBox1.List(I, 1) = lig
    LigneExiste:            
                I = I + 1
                Set c = plage.FindNext(c)
            Loop While Not c Is Nothing And c.Address <> premier

  3. #3
    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 984
    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 984
    Points : 29 027
    Points
    29 027
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu peux faire une recherche par ligne et utiliser la méthode AddItem ou bien utiliser une table et ensuite la propriété List
    Voici un exemple à adapter d'une procédure qui recherche la mot toto quelle que soit la casse et qui place le numéro de la ligne dans une variable tableau nommée tbl.
    Exemple La plage de données dans cet exemple commence en cellule A1 de la feuille active
    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
    Sub t()
     Dim rng As Range, rngRow As Range, cell As Range
     Dim r As Long, tbl(), cr As Long
     Set rng = ActiveSheet.Range("A1").CurrentRegion
     For r = 2 To rng.Rows.Count
      Set rngRow = rng.Rows(r).Cells
      With rngRow
       Set cell = .Find("toto")
       If Not cell Is Nothing Then
        ReDim Preserve tbl(cr): tbl(cr) = cell.Row: cr = cr + 1
       End If
      End With
     Next
     For r = 0 To UBound(tbl)
      MsgBox "Trouvé Toto à la ligne " & tbl(r)
     Next
    End Sub

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    une piste à adapter. L'événement SelectionChange n'est peut-être pas le meilleur.
    XFD si version Excel 2010 sur 2007 je sais pas la dernière colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
    For i = 1 To 2000
    If Cells(i, 41) = "essai" Then Range("A" & i & ":XFD" & i).Interior.Color = 45059
    If Cells(i, 10) = "essai2" Then Range("A" & i & ":XFD" & i).Interior.Color = 5488
    If Cells(i, 41) = "" Then Range("A" & i & "XFD" & i).Interior.Color = xlNone
    Next
    End Sub

  5. #5
    Membre habitué Avatar de DurDur
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2005
    Messages : 244
    Points : 135
    Points
    135
    Par défaut
    Bonsoir,

    Merci à tous pour vos réponses que je me suis empressé de tester.

    Comme je l'ai écrit dans mon post, je suis nul avec EXCEL et la réponse de Rastaquerre, pour moi, c'est abscont.
    Dommage.

    PierrotMfff,
    Votre répobse me plait bien car elle est simple, mais malheureusement elle me renvoie le message d'erreur suivant:
    Erreur d'exécution "381"
    Impossible de lire la propiété list.index de table de propriété non valide
    Philippe TULLIEZ:
    Le test de votre code est positif, mais comment faire pour que les résultats se trouvent dans le combobox1?

    @+

    JCB

  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 984
    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 984
    Points : 29 027
    Points
    29 027
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici un petit exemple où l'on retrouve dans la liste du ComboBox le contenu de la cellule de la colonne A si le mot cherché se trouve dans une des cellules de la ligne.
    Si l'on préfère obtenir dans la liste le contenu de la première cellule de la ligne où se trouve le mot cherché, il faut enlever le commentaire de la ligne 10 et placer en commentaire les lignes 11 à 13.

    Je suis entrain de transcrire une application "ACCESS" sous "EXCEL".
    Si tu as déjà développé en Access comme tu le laisses entendre, cela ne devrait pas être très compliqué.
    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
    Dim rng As Range
    Private Sub UserForm_Initialize()
     Set rng = ActiveSheet.Range("A1").CurrentRegion
     LoadComboBox rng, "toto"
    End Sub
    Sub LoadComboBox(SearchRange As Range, FindWord As String)
     Dim cell As Range, r As Long
     For r = 2 To SearchRange.Rows.Count
      Set cell = SearchRange.Rows(r).Cells.Find(FindWord)
      'If Not cell Is Nothing Then Me.ComboBox1.AddItem cell.Value
      If Not cell Is Nothing Then
       Me.ComboBox1.AddItem SearchRange.Cells(r, 1).Value
      End If
     Next
    End Sub

  7. #7
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut
    Erreur d'exécution "381"
    Impossible de lire la propiété list.index de table de propriété non valide
    Oups excuse moi je pensais que ça passait ! Même Avec .Value à la fin?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Me.ComboBox1.List(i, 1).Value = ...
    Je ne suis pas pro j'essaie juste de débloquer

    Bonne journée!

  8. #8
    Membre habitué Avatar de DurDur
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2005
    Messages : 244
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    Merci à tous, vous qui m'avez proposé des solutions.

    Après moulte essais, j'ai trouvé tout simple.

    Ajouter après I=I+1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    i = i + 1
                newlig = lig
                While newlig = lig
                    avant = c.Address
                    Set c = plage.FindNext(c)
                        If avant <> c.Address Then
                            lig = c.Row
                        Else
                            lig = lig + 1
                        End If
                Wend
    et le tour est joué.

    Encore merci à tous.

    JCB

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

Discussions similaires

  1. somme de valeurs d'une colonne dans une feuille avec un nombre de lignes inconnus
    Par Platon d'athene dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/09/2012, 16h53
  2. Réponses: 2
    Dernier message: 19/05/2008, 22h48
  3. Réponses: 2
    Dernier message: 19/11/2007, 17h53
  4. Recherche dans une feuille excel
    Par sebeni dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/05/2007, 07h04
  5. Réponses: 2
    Dernier message: 07/07/2006, 11h00

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