Recherche multicritère excel

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 :

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:

3 réponses

calibos
 
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:
'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+
0
sam1982
 
Pour ComboCommand.AddItem ("") , j'ai fait exprès de façon à avoir une ligne vide car aucun critère n'est obligatoire pour la recherche. Je dois pouvoir faire ma recherche sur 1, 2, ou 3 critères.
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.
0
calibos
 
Ok,

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
0
Sam1982
 
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.
0
calibos
 
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+.
0
Sam1982
 
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.
0