Recherche multicritère excel
sam1982
-
Sam1982 -
Sam1982 -
Bonjour,
Dans le cadre de mon travail, je fais actuellement un suivi de livraison de matériel.
Je dois pouvoir extraire dans une feuille excel des données issues d'une 2° feuille excel grâce à des valeurs choisies dans des combo box par l'utilisateur.
Actuellement, je peux avoir 3 choix en simultané.
Ce que je n'arrive pas à faire :
1 - rechercher mes valeurs dans la feuille excel (à une colonne précise) en comparant à ma donnée Combobox (ComboCommand, par exemple)
2 - Copier la ligne dans une nouvelle page.
Je tiens à préciser que mes Combo se chargent automatiquement en fonction des valeurs trouvées dans la feuille d'origine excel et que ceci fonctionne bien.
Voici le code tapé pour l'instant :
Dans le cadre de mon travail, je fais actuellement un suivi de livraison de matériel.
Je dois pouvoir extraire dans une feuille excel des données issues d'une 2° feuille excel grâce à des valeurs choisies dans des combo box par l'utilisateur.
Actuellement, je peux avoir 3 choix en simultané.
Ce que je n'arrive pas à faire :
1 - rechercher mes valeurs dans la feuille excel (à une colonne précise) en comparant à ma donnée Combobox (ComboCommand, par exemple)
2 - Copier la ligne dans une nouvelle page.
Je tiens à préciser que mes Combo se chargent automatiquement en fonction des valeurs trouvées dans la feuille d'origine excel et que ceci fonctionne bien.
Voici le code tapé pour l'instant :
Private Sub Userform_initialize()
'Initialisation des variables
Dim I As Long
Dim LastLine As Long
Dim Command As String
Dim Client As String
Dim Livr As String
'Test fin de tableau
LastLine = Worksheets("Ep 40 mm").Cells(65535, 1).End(xlUp).Row
'MsgBox (LastLine)
'Initialisation des combo
'Commande
ComboCommand.AddItem ("")
For I = 2 To LastLine
Command = Worksheets("Ep 40 mm").Cells(I, 1).Value
ComboCommand.Text = Command
If ComboCommand.ListIndex = -1 Then
ComboCommand.AddItem (Command)
End If
Next I
ComboCommand.ListIndex = 0
'Client
ComboClient.AddItem ("")
For I = 2 To LastLine
Client = Worksheets("Ep 40 mm").Cells(I, 7).Value
ComboClient.Text = Client
If ComboClient.ListIndex = -1 Then
ComboClient.AddItem (Client)
End If
Next I
ComboClient.ListIndex = 0
'Livraison
ComboLivr.AddItem ("")
For I = 2 To LastLine
Livr = Worksheets("Ep 40 mm").Cells(I, 8).Value
ComboLivr.Text = Livr
If ComboLivr.ListIndex = -1 Then
ComboLivr.AddItem (Livr)
End If
Next I
ComboLivr.ListIndex = 0
End Sub
Private Sub BtFind_Click()
Dim LastLine As Long
Dim Col As Long
Dim Lig As Long
'Test fin de tableau
LastLine = Worksheets("Ep 40 mm").Cells(65535, 1).End(xlUp).Row
Sheets("recherche Ep 40 mm").Activate ' feuille de destination
With Sheets("Ep 40 mm") 'feuille origine
Col = 1
Lig = 2
For Lig = 2 To Lig = LastLine
If .Cells(Lig, Col).Value = ComboCommand.Value Then
.Cells(Lig, Col).EntireRow.Copy
Lig = Lig + 1
Sheets("recherche Ep 40 mm").Cells(Lig, 1).Insert Shift:=xlDown
End If
Next
End With
End Sub
A voir également:
- Recherche multicritère excel
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
3 réponses
Bonjour,
Juste une précision.
Tu utilise la commande ComboCommand.AddItem ("") pour initialiser ta combobox.
En fait cette commande insere une ligne vide dans la liste mais n'efface rien du tout.
Il faut mettre ComboCommand.Clear pour que ça marche.
Ton code pourrait etre optimisé ainsi:
A+
Juste une précision.
Tu utilise la commande ComboCommand.AddItem ("") pour initialiser ta combobox.
En fait cette commande insere une ligne vide dans la liste mais n'efface rien du tout.
Il faut mettre ComboCommand.Clear pour que ça marche.
Ton code pourrait etre optimisé ainsi:
'Initialisation des combo
'Commande
ComboCommand.Clear
For I = 2 To LastLine
Command = Worksheets("Ep 40 mm").Cells(I, 1).Value
ComboCommand.AddItem (Command)
Next I
ComboCommand.ListIndex = -1
A+
Ok,
Je n'arrive pas à comprendre cette partie du code
Je suppose que tu dois coller la ligne trouvée. alors essai comme ça:
Je n'arrive pas à comprendre cette partie du code
For Lig = 2 To Lig = LastLine
If .Cells(Lig, Col).Value = ComboCommand.Value Then
.Cells(Lig, Col).EntireRow.Copy
Lig = Lig + 1
Sheets("recherche Ep 40 mm").Cells(Lig, 1).Insert Shift:=xlDown
End If
Next
Je suppose que tu dois coller la ligne trouvée. alors essai comme ça:
For Lig = 2 To LastLine
If .Cells(Lig, Col).Value = ComboCommand.Value Then
Sheets("recherche Ep 40 mm").Select
.Cells(Lig+1, Col).Select
Selection.EntireRow.Insert
Sheets("Ep 40 mm").Select
.Cells(Lig, Col).EntireRow.Copy
Sheets("recherche Ep 40 mm").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Ep 40 mm").Select
Lig=Lig+1
End If
Next
Salut.
Tout d'abord merci pour ta réponse qui m'a l'air bien plus complète que ce que j'avais fait.
J'ai testé ce matin, mais il y a un petit souci. Lors de l'exécution, il me sort un message d'erreur :
La méthode Select de la classe Range a échoué sur la ligne
.Cells(Lig + 1, Col).Select.
J'ai vérifié le nom des variables et des feuilles excel mais tout est bon.
Je ne comprends vraiment pas.
Merci d'avance si tu as déjà vécu ça pour ton aide.
Cordialement.
Tout d'abord merci pour ta réponse qui m'a l'air bien plus complète que ce que j'avais fait.
J'ai testé ce matin, mais il y a un petit souci. Lors de l'exécution, il me sort un message d'erreur :
La méthode Select de la classe Range a échoué sur la ligne
.Cells(Lig + 1, Col).Select.
J'ai vérifié le nom des variables et des feuilles excel mais tout est bon.
Je ne comprends vraiment pas.
Merci d'avance si tu as déjà vécu ça pour ton aide.
Cordialement.
Bonjour,
ça ne m'etonne pas que tu aies ce genre d'erreur, n'ayant pas ton fichier sous les yeux, j'ai repris ce que tu avais écrit sans pouvoir vérifier.
Ce qu'il faut comprendre, c'est comment fonctionnent les methodes .Copy et .Paste.
Le plus simple serait d'enregistrer une macro en faisant manuellement un copier/coller des lignes selectionnées.
Ensuite tu édites la macro et tu récupères le code généré par Excel, en ajoutant des variables, et tu complètes tes propres macros.
A+.
ça ne m'etonne pas que tu aies ce genre d'erreur, n'ayant pas ton fichier sous les yeux, j'ai repris ce que tu avais écrit sans pouvoir vérifier.
Ce qu'il faut comprendre, c'est comment fonctionnent les methodes .Copy et .Paste.
Le plus simple serait d'enregistrer une macro en faisant manuellement un copier/coller des lignes selectionnées.
Ensuite tu édites la macro et tu récupères le code généré par Excel, en ajoutant des variables, et tu complètes tes propres macros.
A+.
Salut,
j'ai trouvé la solution :
While Lig <> LastLine
If .Cells(Lig, Col).Value = ComboCommand.Value Then
Sheets("recherche Ep 40 mm").Select 'Bascule sur l'autre feuille
ActiveCell.Offset(1, 0).Activate 'Passe à la ligne suivante
Sheets("Ep 40 mm").Rows(Lig).Copy
Sheets("recherche Ep 40 mm").Paste
Sheets("Ep 40 mm").Select 'Revient à la feuille d'origine
End If
Lig = Lig + 1
Wend
Par contre j'ai un souci par la suite :
Je dois, suite à la recherche précédente, supprimer des lignes dans la feuille résultat en fonction de mes autres critères de recherche. J'ai tapé du code qui me paraissait bon, mais la suppression n'est pas très fructueuse;
Dans le cas présent, sur 86 lignes de résultats, je devrais en récupérer que 6, or j'en récupère 43.
Il y a peut-être une erreur du conditionnement du if :
Sheets("recherche Ep 40 mm").Select
LastLineCopy = Worksheets("recherche Ep 40 mm").Cells(65535, 1).End(xlUp).Row
Lig = 2
While Lig <> LastLineCopy
If (.Cells(Lig, 5).Value = ComboWatt.Value) Or (.Cells(Lig, 7).Value = ComboClient.Value) Or (.Cells(Lig, 8).Value = ComboLivr.Value) Then
ActiveSheet.Rows(7).Delete (xlShiftUp)
End If
Lig = Lig + 1
Wend
Donc si toi, ou quelqu'un d'autre peut m'aider, ce sera avec plaisir.
j'ai trouvé la solution :
While Lig <> LastLine
If .Cells(Lig, Col).Value = ComboCommand.Value Then
Sheets("recherche Ep 40 mm").Select 'Bascule sur l'autre feuille
ActiveCell.Offset(1, 0).Activate 'Passe à la ligne suivante
Sheets("Ep 40 mm").Rows(Lig).Copy
Sheets("recherche Ep 40 mm").Paste
Sheets("Ep 40 mm").Select 'Revient à la feuille d'origine
End If
Lig = Lig + 1
Wend
Par contre j'ai un souci par la suite :
Je dois, suite à la recherche précédente, supprimer des lignes dans la feuille résultat en fonction de mes autres critères de recherche. J'ai tapé du code qui me paraissait bon, mais la suppression n'est pas très fructueuse;
Dans le cas présent, sur 86 lignes de résultats, je devrais en récupérer que 6, or j'en récupère 43.
Il y a peut-être une erreur du conditionnement du if :
Sheets("recherche Ep 40 mm").Select
LastLineCopy = Worksheets("recherche Ep 40 mm").Cells(65535, 1).End(xlUp).Row
Lig = 2
While Lig <> LastLineCopy
If (.Cells(Lig, 5).Value = ComboWatt.Value) Or (.Cells(Lig, 7).Value = ComboClient.Value) Or (.Cells(Lig, 8).Value = ComboLivr.Value) Then
ActiveSheet.Rows(7).Delete (xlShiftUp)
End If
Lig = Lig + 1
Wend
Donc si toi, ou quelqu'un d'autre peut m'aider, ce sera avec plaisir.
La ligne blanche me permettra de dire que je dois considérer la colonne entière de données.
Mais merci pour ta réflexion.