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

3 réponses

  1. 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
    1. 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
  2. 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
    1. 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
  3. 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
    1. 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