Recherche sur Base de Donnée Excel

Résolu/Fermé
Mrfrize
Messages postés
185
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
17 août 2018
- 17 janv. 2012 à 11:05
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
- 19 janv. 2012 à 08:11
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

pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
17 janv. 2012 à 11:31
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
Mrfrize
Messages postés
185
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
17 août 2018
6
Modifié par Mrfrize le 17/01/2012 à 11:50
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
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
17 janv. 2012 à 12:44
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
Mrfrize
Messages postés
185
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
17 août 2018
6
17 janv. 2012 à 15:53
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
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
17 janv. 2012 à 16:22
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
Mrfrize
Messages postés
185
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
17 août 2018
6
17 janv. 2012 à 16:45
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
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
17 janv. 2012 à 16:53
3 critères? ou 4 ou 5 ....
Dis nous tout, tout de suite ça serait mieux.
0
Mrfrize
Messages postés
185
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
17 août 2018
6
17 janv. 2012 à 17:01
J'ai 5 critere et parfois 6.
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
Modifié par pijaku le 17/01/2012 à 17:04
6 critères, à chercher dans qu'elles colonnes? nom de ta feuille? informations saisies dans quoi dans l'userform? Combobox? textbox? leur noms...
0
Mrfrize
Messages postés
185
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
17 août 2018
6
17 janv. 2012 à 17:28
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
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
18 janv. 2012 à 12:31
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
Mrfrize
Messages postés
185
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
17 août 2018
6
18 janv. 2012 à 18:22
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
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
19 janv. 2012 à 08:11
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