Recherche sur Base de Donnée Excel

Résolu
Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Tout d'abord je sais que Excel n'est pas fait pour gérer des bases de données et que ce serai mieux de le faire sous Acces mais vu que le systeme que je vais essayer mettre en place ne m'est pas destiné je pense qu'il est est plus facile pour quelqu'un de comprendre une macro Excel bien commenté qu'une base Acces.

Donc voila mon probleme, j'ai une liste de pompe avec certaines caractéristiques. J'ai crée des userforms pour sélectionner les caractéristiques que je souhaite mais je ne sais pas comment utiliser ces informations pour faire une recherche dans la base pour voir quelle pompe correspond a la recherche. (il n'y a que une et une seule pompe dans qui correspond a une recherche.)

J'avais pensé utilisé les fitres personalisé pour y arriver et selectionner a la fin la seul ligne qui reste mais je pense qu'il y a surement beaucoup mieux comme solution.

Merci d'avance de vos conseils.

3 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    Pour rechercher un "mot" dans une feuille excel, tu peux utiliser la méthode Find sous VBA.
    Voici un exemple qui va chercher, dans la feuille "Feuil1", dans la colonne B (Columns(2)), le contenu de la ComboBox13 :
    Dim Trouve As Range
    Dim Valeur_trouvee As String
    Dim Lign As Long
    
    If ComboBox13 = "" Then Exit Sub
    With Sheets("Feuil1")
        Set Trouve = .Columns(2).Cells.Find(ComboBox13)
            If Trouve Is Nothing Then
                MsgBox ComboBox13 & " pas trouvée!"
            Else
                Valeur_trouvee = Trouve.Address
                Lign = Trouve.Row
                MsgBox ComboBox13 & " trouvée dans la cellule : " & Valeur_trouvee & " ligne : " & Lign
            End If
    End With
    Set Trouve = Nothing
    0
    1. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Merci mais cela ne marche que avec un critere non?

      J'ai plusieur criteres dans plusieur colone, et je voudrai faire une recherche sur l'ensemble des criteres.

      Colonne A Colonne B ....
      Ligne 1 A C
      Ligne 2 A D
      Ligne 3 B C
      Ligne 4 B D
      .....

      Dans cette exemple je voudrai trouver la ligne qui contient et A et C.


      Merci
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Si tu es sur et certain de trouver A en colonne A ET C en colonne B : utilises Find et find.next comme ceci :

      Dim c As Range, firstAddress As String, test As Boolean
      Dim Valeur1 As String, Valeur2 As String
      
      Valeur1 = "A"
      Valeur2 = "C"
      With Sheets(1).Columns(1)
          Set c = .Cells.Find(Valeur1)
          If Not c Is Nothing Then
              firstAddress = c.Address
              Do
                  Set c = .Cells.FindNext(c)
                  If c.Offset(0, 1) <> Valeur2 Then
                      test = False
                  Else
                      test = True
                  End If
              Loop While Not c Is Nothing And c.Address <> firstAddress
          Else
              MsgBox Valeur1 & " pas trouvé"
              Exit Sub
          End If
          If test = True Then
              MsgBox "trouvé en ligne : " & c.Row
          Else
              MsgBox Valeur2 & " pas trouvée dans la même ligne que " & Valeur1
          End If
      End With
      0
    3. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Je viens de l'essayer mais cela ne fonctionne pas ca tombe sur " C pas trouver dans la meme ligne que A"

      Désoler d'insiter mais je ne comprends pas comment fonctionne ta macro.
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Il serait plus aisé pour moi de t'orienter si tu me disais :
    - le nom de la feuille dans laquelle chercher les données,
    - le numéro de la colonne ou chercher et qu'elle colonne voisine (ou pas) vérifie la seconde condition,
    - ou sont contenues, dans ton userform, les infos à chercher? TextBox? ComboBox? autre... Me donner leurs noms...

    ps : je me rends compte que la macro ci dessus ne fonctionne pas dans ton cas. Je la reprendrais dès que tu m'auras donné les infos nécessaires à son adaptation.
    0
    1. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Je vais essayer de faire un exemple simple:


      Feuille 1
      Collone A Collone B Collone C
      A C E
      A C F
      A D E
      A D F
      B C E
      B C F
      B D E
      B D F

      Et je recherche par exemple le numéro de la ligne qui contient : A D F

      Je me chargerai de faire les adaptations a mon besoin spécifique, comme ca je vérifirai que j'ai bien compris comment marche la macro.

      Ps: Mais userform me serviront qu'a atribuer des valeur a mes criteres de recherche ("valeur 1", "valeur 2",...)
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      3 critères? ou 4 ou 5 ....
      Dis nous tout, tout de suite ça serait mieux.
      0
    3. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      J'ai 5 critere et parfois 6.
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      6 critères, à chercher dans qu'elles colonnes? nom de ta feuille? informations saisies dans quoi dans l'userform? Combobox? textbox? leur noms...
      0
    5. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      les criteres sont a chercher dans les colonnes A B C D E G.
      Nom de la feuille :TOTO
      Dans les user form il n'y a que des OptionButton.
      qui définiron les valeurs de valeur1, valeur 2....valeur6

      Il y a l'userform1 avec OptionButton1,OptionButton2,OptionButton3
      userform2 avec OptionButton3,OptionButton4,OptionButton5
      ect..
      0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    Comme promis, une solution. J'ai perso utilisé des combobox, mais le code doit être identique avec des optionbutton. J'avais juste pas envie de me casser la nénette...

    Le code est assez "complexe", donc je l'ai largement commenté. En cas de souci, ne pas hésiter à poser vos questions.

    Tu peux aléatoirement choisir de 3 à 6 critères de recherches, si inférieur à 3 = blocage.

    Le code du bouton de l'Userform :
    Private Sub CommandButton1_Click()
    'au clic sur le bouton, recherche :
        'dans la colonne B du contenu de la liste 1
        'test si contenu de C = liste2
    Dim TablDonnees(), Valeur(5), i As Long, j As Long, drlig As Long, Cpt As Byte
    
    'comptage du nombre de critères renseignés :
    For i = 1 To 6
        If Me.Controls("ComboBox" & i).Value <> "" Then
            Cpt = Cpt + 1
        End If
    Next
    'Si le nombre de critères renseignés est inférieur à 3,
    'message à l'utilisateur et ... on ne fait rien!
    If Cpt < 3 Then
        MsgBox "Merci de renseigner plus de " & Cpt & " critères"
        Exit Sub
    End If
    'Valeur(5) est une variable tableau qui permet de stocker 6 noms,
    '(6 car on commence à l'indice 0, Valeur(0), et on finit à 5, Valeur(5), soit 6 éléments)
    'le contenu donc de nos 6 combobox
        'la boucle qui suit est en fait équivalente à :
            'Valeur(0) = ComboBox1
            'Valeur(1) = ComboBox2
            'Valeur(2) = ComboBox3
            'Valeur(3) = ComboBox4
            'Valeur(4) = ComboBox5
            'Valeur(5) = ComboBox6
    '--- Remplissage de la variable Valeur(i) :
    For i = 0 To 5
        Valeur(i) = Me.Controls("ComboBox" & i + 1).Value
    Next
    
    With Sheets("Feuil1")
        drlig = .Range("A" & Rows.Count).End(xlUp).Row
        ReDim TablDonnees(1 To 6, 1 To drlig - 1)
        '--- Remplissage de la variable TablDonnees() :
        For i = 2 To drlig
            '1ère ligne du tableau = colonne A de la feuille
            TablDonnees(1, i - 1) = .Cells(i, 1).Value
            '2ème  ligne du tableau = colonne B de la feuille
            TablDonnees(2, i - 1) = .Cells(i, 2).Value
            '3ème  ligne du tableau = colonne C de la feuille
            TablDonnees(3, i - 1) = .Cells(i, 3).Value
            '4ème  ligne du tableau = colonne D de la feuille
            TablDonnees(4, i - 1) = .Cells(i, 4).Value
            '5ème  ligne du tableau = colonne E de la feuille
            TablDonnees(5, i - 1) = .Cells(i, 5).Value
            '6ème  ligne du tableau = colonne G de la feuille
            TablDonnees(6, i - 1) = .Cells(i, 7).Value
        Next
        'explications :
            'TablDonnees = Application.Transpose(.Range("A2:G" & drlig).Value)
            'va remplir une variable tableau multidimensionnelle, de sorte que :
            'TablDonnees(1, 1) = Range("A2"), TablDonnees(2, 1) = Range("B2"),
            'TablDonnees(3, 1) = Range("C2"), TablDonnees(4, 2) = Range("D3")
            'TablDonnees(6, i) = Range("G" & i) ou i = variable n° de ligne
    End With
    'Si un ou plusieurs critères ne sont pas souhaités, et donc pas choisis dans les combobox
    'la comparaison entre la concaténation des Valeur et celle des TablDonnees
    'renverra toujours FAUX, il faut donc, Si valeur = rien que le tabldonnees de la colonne
    'correspondante soient tous = à rien :
    For i = 0 To 5
        If Valeur(i) = "" Then
            For j = 1 To drlig - 1
                TablDonnees(i + 1, j) = ""
            Next
        End If
    Next
    'il convient de comparer maintenant, la concaténation de nos variables Valeur
    'et la concaténation des "colonnes" de notre variable tableau
    'si les concaténations sont identiques, nous avons trouvé la bonne ligne
    'cette ligne est en fait l'indice i de notre variable tableau, + 1 car on commence en 2ème ligne (A2...)
    For i = 1 To drlig - 1
        If TablDonnees(1, i) & TablDonnees(2, i) & TablDonnees(3, i) & TablDonnees(4, i) & TablDonnees(5, i) & TablDonnees(6, i) = Join(Valeur, "") Then
            MsgBox "trouvé ligne : " & i + 1
            Exit Sub
        End If
    Next
    MsgBox "pas trouvé"
    End Sub


    Tu trouveras ci joint mon classeur exemple. Mon userform est basé sur des combobox, comme le code ci-dessus, mais tu pourras, je penses l'adapter avec tes optionbutton.
    En cas de difficulté d'adaptation, il me faudra le classeur contenant l'userform, sans données confidentielles...
    0
    1. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Merci je suis en ce moment en trian d'essayer de comprendre comment ca marche.

      SI j'ai bien compris TablDonnees est une matrice de taille variable qui stock en mémoire tempon les lignes de mon tableau réel?
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,

      SI j'ai bien compris TablDonnees est une matrice de taille variable qui stock en mémoire tempon les lignes de mon tableau réel?
      C'est tout à fait ça.
      N'hésite pas à poser moultes questions...
      0