Excel VBA Recherche Partielle
Résolu
-Tyrael-
Messages postés
103
Statut
Membre
-
-Tyrael- Messages postés 103 Statut Membre -
-Tyrael- Messages postés 103 Statut Membre -
Bonjour tout le monde,
Je souhaiterai faire une recherche partielle dans une liste Excel.
Je développe, j'ai une liste de films dans une feuille excel :
colonne 1 = titre
colonne 2 = réalisateur(s)
colonne 3 = année
colonne 4 = type
J'ai fais une formulaire de recherche (par titre pour le moment) et je voudrai pouvoir effectuer une recherche ou le mot clé est présent dans le titre.
Exemple j'ai beaucoup de James Bond et quand je les classe ils sont marqué :
"James Bond 007 - Moonraker" ou encore "James Bond 007 - Octopussy"
Ce que je souhaiterai c'est que lorsque je tape "james bond" dans la recherche (ou même james) j'ai en retour tous les james bond. Pareil pour les Die Hard.
Voici mon code pour le moment le problème c'est que si je tape "james" il ne me retourne rien car ce n'est pas le titre entier.
Donc ce code recherche dans la feuille "liste" si le mot clé (txtTitre.Text) est présent sans faire attention à la casse (UCase). Si oui il copie la ligne pour aller la coller dans la dernière ligne vide de la feuille "recherche". Si non il ouvre une message box pour dire Non trouvé.
J'ai fais une tartine pour un petit truc si ça se trouve, j'espère ne pas vous avoir noyé dans toutes mes phrases.
Merci d'avance.
Je souhaiterai faire une recherche partielle dans une liste Excel.
Je développe, j'ai une liste de films dans une feuille excel :
colonne 1 = titre
colonne 2 = réalisateur(s)
colonne 3 = année
colonne 4 = type
J'ai fais une formulaire de recherche (par titre pour le moment) et je voudrai pouvoir effectuer une recherche ou le mot clé est présent dans le titre.
Exemple j'ai beaucoup de James Bond et quand je les classe ils sont marqué :
"James Bond 007 - Moonraker" ou encore "James Bond 007 - Octopussy"
Ce que je souhaiterai c'est que lorsque je tape "james bond" dans la recherche (ou même james) j'ai en retour tous les james bond. Pareil pour les Die Hard.
Voici mon code pour le moment le problème c'est que si je tape "james" il ne me retourne rien car ce n'est pas le titre entier.
Private Sub cmdRechercher_Click()
Dim ligne As Integer
Dim LigneMax As Integer
Dim LigneVide As Integer
Dim Trouve As Integer
Trouve = 0
LigneVide = 0
LigneMax = Sheets("liste").Columns(1).Find("").Row
For ligne = 1 To LigneMax Step 1
'On cherche le titre sans faire attention à la casse (UCase)
If Not txtTitre.Text = "" And UCase(Sheets("liste").Columns(1).Rows(ligne)) = UCase(txtTitre.Text) And optTitre.Value = True Then
'On copy le titre trouvé
Sheets("liste").Rows(ligne).Copy
'On cherche la ligne vide de la feuille recherche pour coller le titre dedans
LigneVide = Sheets("Recherche").Columns(1).Find("").Row
Worksheets("Recherche").Activate
ActiveSheet.Columns(1).Rows(LigneVide).Select
ActiveSheet.Paste
Trouve = 1
End If
Next ligne
If Trouve = 0 Then
MsgBox "Non trouvé", vbInformation, "Oups !"
End If
End Sub
Donc ce code recherche dans la feuille "liste" si le mot clé (txtTitre.Text) est présent sans faire attention à la casse (UCase). Si oui il copie la ligne pour aller la coller dans la dernière ligne vide de la feuille "recherche". Si non il ouvre une message box pour dire Non trouvé.
J'ai fais une tartine pour un petit truc si ça se trouve, j'espère ne pas vous avoir noyé dans toutes mes phrases.
Merci d'avance.
A voir également:
- Recherche vba excel
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
4 réponses
Bonjour michel_m,
J'avoue que j'ai un peu de mal à tout comprendre.
Si tu repasse par ici pourrais tu m'expliquer un peu cette partie stp :
Ainsi que : .Range("A2").Resize(cptr_tablo + 1, 4) = Application.Transpose(tablo)
Merci.
Si d'autres personnes ont une solution, je suis preneur :)
J'avoue que j'ai un peu de mal à tout comprendre.
Si tu repasse par ici pourrais tu m'expliquer un peu cette partie stp :
With Sheets("liste")
For cptr = 1 To derlig
test = .Cells(cptr, 1)
If .Cells(cptr, 1) Like lettre & "*" Then
For col = 0 To 3
tablo(col, cptr_tablo) = .Cells(cptr, col + 1)
Next
cptr_tablo = cptr_tablo + 1
ReDim Preserve tablo(3, cptr_tablo)
End If
Next
End With
Ainsi que : .Range("A2").Resize(cptr_tablo + 1, 4) = Application.Transpose(tablo)
Merci.
Si d'autres personnes ont une solution, je suis preneur :)
bonjour,
Je ne réponds pas tout à fait à la question :
Il existe une solution sans VBA, par formule matricielle :
http://boisgontierjacques.free.fr/fichiers/Matriciel/MatRecherche3.xls
développé et présenté sur l'excellent site de Jacques BOISGONTIER :
http://boisgontierjacques.free.fr/
Je ne réponds pas tout à fait à la question :
Il existe une solution sans VBA, par formule matricielle :
http://boisgontierjacques.free.fr/fichiers/Matriciel/MatRecherche3.xls
développé et présenté sur l'excellent site de Jacques BOISGONTIER :
http://boisgontierjacques.free.fr/
Bonjour
essaies cette macro (à adapter à ton classeur et userform) on cherche d'après les n premières lettres dans la liste
remarque:
en déclenchant la macro à partir de l'événement
:-x
essaies cette macro (à adapter à ton classeur et userform) on cherche d'après les n premières lettres dans la liste
Dim lettre As String
Dim tablo
Dim derlig as integer
Dim cptr As Integer, col As Byte, cptr_tablo As Integer
lettre = UCase(TextBox1.Value)
If lettre = "" Then Exit Sub
ReDim tablo(3, 0)
derlig = Sheets("liste").Range("A1000").End(xlUp).Row
With Sheets("liste")
For cptr = 1 To derlig
test = .Cells(cptr, 1)
If .Cells(cptr, 1) Like lettre & "*" Then
For col = 0 To 3
tablo(col, cptr_tablo) = .Cells(cptr, col + 1)
Next
cptr_tablo = cptr_tablo + 1
ReDim Preserve tablo(3, cptr_tablo)
End If
Next
End With
With Sheets("cherche")
.Range("A2:D1000").ClearContents
.Range("A2").Resize(cptr_tablo + 1, 4) = Application.Transpose(tablo)
End With
remarque:
en déclenchant la macro à partir de l'événement
Private Sub TextBox1_Change()la liste de tes films avec la lettre apparaitra au fur et à mesure sans avoir à cliquer sur un bouton
:-x
Bonjour,
Ah bon! ce que je t'ai donné n'est pas une solution? pourtant, elle a été testée avec succès avant de te la proposer
Il ne faut pas le prendre comme ça ^^ Il existe toujours plusieurs solutions à un même problème (surtout en programmation). Des plus simple et des plus compliquées.
Je vais potasser ton tuto (merci d'ailleurs) quand j'aurai un peu plus de temps (c'est du loisir ça).
En tout cas merci pour ton aide, je refais signe si j'ai des soucis sinon c'est que tout va bien.
Je mets résolu quand même pour mon sujet.
Ah bon! ce que je t'ai donné n'est pas une solution? pourtant, elle a été testée avec succès avant de te la proposer
Il ne faut pas le prendre comme ça ^^ Il existe toujours plusieurs solutions à un même problème (surtout en programmation). Des plus simple et des plus compliquées.
Je vais potasser ton tuto (merci d'ailleurs) quand j'aurai un peu plus de temps (c'est du loisir ça).
En tout cas merci pour ton aide, je refais signe si j'ai des soucis sinon c'est que tout va bien.
Je mets résolu quand même pour mon sujet.
Si d'autres personnes ont une solution...
Ah bon! ce que je t'ai donné n'est pas une solution? pourtant, elle a été testée avec succès avant de te la proposer
Pour les explications, on verra demain !! :-)
en attendant, concernant la variable tablo, consultes ce tuto:
https://silkyroad.developpez.com/vba/tableaux/
pour l'opérateur like il compare le contenu de la cellule avec le modèle par ex ja avec le joker * retourne vrai si le contenu de la cellule commence par "ja" james ok, jaja ok, jean pas OK
quant à resize, cela consiste à créer une zone de la taille de la variable tablo: détails dans l'aide F1
pour la méthode transpose, il faudrait que tu ais à peu près assimilé le tuto cité + haut avant explications complémentaire
à demain fais moi signe lorsque tu auras potassé le tuto