Recherche sur Base de Donnée Excel

Résolu/Fermé
Mrfrize Messages postés 188 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 28 novembre 2023 - 17 janv. 2012 à 11:05
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 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.



A voir également:

3 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 188 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 28 novembre 2023 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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 188 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 28 novembre 2023 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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 188 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 28 novembre 2023 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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 188 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 28 novembre 2023 6
17 janv. 2012 à 17:01
J'ai 5 critere et parfois 6.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 188 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 28 novembre 2023 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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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 188 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 28 novembre 2023 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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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