VBA: mettre en place un fonction recherche

kikeusse Messages postés 4 Date d'inscription jeudi 13 janvier 2011 Statut Membre Dernière intervention 18 janvier 2011 - 13 janv. 2011 à 16:04
kikeusse Messages postés 4 Date d'inscription jeudi 13 janvier 2011 Statut Membre Dernière intervention 18 janvier 2011 - 18 janv. 2011 à 17:48
Bonjour à tous et à toutes,

je suis débutant en VBA et a déjà un gros problème : je ne sais pas comment rédiger un programme de recherche...

Donc pour vous détailler, je dispose d'une base de donnée regroupant près de 500 entreprises dans ma "feuil1" constituée de 5 colonnes, dans l'ordre: CODE (boursier), MEMO, SECTEUR, NOM, DESCRIPTION.

Je souhaiterais créer un programme dans la feuil2, qui lorsque je mets dans une cellule en C3 le secteur de l'entreprise, me sorte toutes les entreprises d'un même secteur avec leurs noms et descriptions.

Donc pour résumer me sortirait le résultat de sa recherche sous forme de tableau de 3 colonnes: 1ere colonne "Secteur ", et respectivement "nom" et "description".

Voila mon problème, j'espère avoir été clair.. lol

Si quelqi'un peut gentillement m'aider ca serait super cool, parce que la ...

5 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
14 janv. 2011 à 08:22
Bonjour,
Il existe une fonction qui permet de chercher tout (FindAll).
Elle est disponible sur ce site par exemple :
FINDALL

Si des valeurs sont trouvées, il te retourne TRUE sinon.. FALSE.
Les Adresses de cellules (ou les N° de ligne si tu utilises le .row) sont stockées dans un tableau de variables arMatches()

Ensuite pour l'utiliser tu peux faire comme ça :
'Explication des variables 
'ChercheX : Valeur à chercher
'Nom_Feuil : Nom de la feuille où chercher
'Ma_plage : Plage de recherche (Range)
'arTemp : Tableau qui reçoit le resultat de la recherche
' bFound : TRUE si des resultats sont trouvés.
'---------------------------------------------------------------
bFound = FindAll(ChercheX, Sheets(Nom_Feuil), ma_plage, arTemp())
'---------------------------------------------------------------

If bFound = True Then
    Debug.Print "Nb occurences : " & UBound(arTemp)  'Nb de valeurs dans le tableau
    For X = 1 To UBound(arTemp) 'boucle pour parcourir le tableau.
        Debug.Print "La " & x & " valeur du tableau est : " & arTemp(X) ' lecture du tableau
    Next
End If



Voila

Pour ce qui est de l'utilisation des tableaux en VBA, je t'invite à faire une recherche sur le net... des tutos expliquent tout ça très bien.


Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
0
kikeusse Messages postés 4 Date d'inscription jeudi 13 janvier 2011 Statut Membre Dernière intervention 18 janvier 2011
14 janv. 2011 à 08:24
Merci beaucoup!

Je vais essayer ça de suite!
0
Magiczorro Messages postés 4 Date d'inscription vendredi 14 janvier 2011 Statut Membre Dernière intervention 17 janvier 2011
14 janv. 2011 à 23:21
Bonsoir,

Peut-être que ma réponse va paraître décalée mais il n'est pas du tout nécessaire de programmer en VBA pour ce que tu demandes ; EXCEL possède la fonction "tableau croisé dynamique" qui est vraiment très puissante par rapport à ton besoin.

Cdt
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
17 janv. 2011 à 11:50
Hello,
Un petit bout de code perfectible qui pourra t'aider à avancer;

Ce code se déclenchera lorsque tu modifie la valeur de la celulle C3 de la seconde feuille
Pour cela sur la Feuil2 de ton classeur applique le code ci-dessous
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row 3 And Target.Column 3 Then
Application.Run "Alim_Rech"
End If
End Sub




Sub Alim_Rech()

Dim myval
myval = Sheets(2).Cells(3, 3).Value ' DEFINITION DU CRITERE DE RECHERCHE

'1ère etape : effacer l'ancienne liste d'occurences
rf2 = Sheets(2).Cells(65536, 1).End(xlUp).Row 'recuperation de la derniere cellule non vide de la colonne A
If rf2 > 3 Then 'si > à 3 il y a une liste donc on efface
Range(Sheets(2).Cells(4, 1), Sheets(2).Cells(rf2, 3)).ClearContents
End If

rf1 = Sheets(1).Cells(65536, 1).End(xlUp).Row 'delimite la BDD
occ = 4 ' initialise la 1ère ligne de la liste des occurence de la 2nde feuille
Count = 0 ' initialise le nombre d'occurence trouvé
For Each cell In Range(Sheets(1).Cells(2, 3), Sheets(1).Cells(rf1, 3)) 'BDD à partir de la ligne 2, la valeur recherchée se trouve dans la colonne C
If cell.Value = myval Then 'on trouve une occurence
Count = Count + 1 'ajout au nombre d'occurence
Sheets(2).Cells(occ, 1).Value = cell.Value
Sheets(2).Cells(occ, 2).Value = cell.Offset(0, 1).Value
Sheets(2).Cells(occ, 3).Value = cell.Offset(0, 2).Value
'on alimente la feuil2
occ = occ + 1
'ligne suivante
End If
Next cell

MsgBox ("Votre recherche pour " & myval & " a générer " & Count & " réponses positives.")
End Sub


BR
USERRRQI115
Simple user
Great brain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kikeusse Messages postés 4 Date d'inscription jeudi 13 janvier 2011 Statut Membre Dernière intervention 18 janvier 2011
18 janv. 2011 à 17:48
Bonsoir à tous,

Tout d'abord, un grand merci à tous ceux qui ont lu mon problème et qui y ont répondu!

Ensuite, le tableau croisé dynamique ne restitue pas les valeurs telles quelle, mais compile les données pour en sortir un résultat transversal.

Pour finir, user115, MERCI 1000 fois!!!
1) ton code marche A MERVEILLE
2) il est plus que compréhensible et m'a tres clairement permis d'adapter et d'intégrer cette macro. Je saurai la réutiliser ultérieurement, et c'est tout le but de ce forum: faire évoluer les débutants ;)

Encore merci à tous et bonne soirée
0
Rejoignez-nous