Renvoi de donnee, via une recherche

Résolu/Fermé
Signaler
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
-
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021
-
Bonjour,
je travaille actuellement sur Excel 2007, et je développe un logiciel contenant des grosse macro.
Malheuresement, je bloque sur l'une d'entre elle:
je souhaiterai effectuer une recherche concernant une cellule, et quelle me revoi des valeurs, via une base de donnée.
Une RECHERCHEV me dirais vous :),
Oui, mais le souci, cest que plusieurs ligne correspondent a cette cellule(qui est une référence) or, une recherchev ne renvoie qu'une donnée.
J'aimerai simplement qu'il me retourne toute les lignes, correspondant a cette référence, recherchée au préalable.
Merci de votre attention :)

4 réponses

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
Bonjour,

Vous avez le choix :
- La recherchev polyvalente

- La fonction FindAll
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1
https://www.cjoint.com/?DGCmdya4nMk
Voila le fichier ci-joint :)
Je vous ai mi une petite explication précise de mon problème,
en ésperant qu'elle soit le plus explicite possible.
Cordialement, uly2562
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021
3 251
Bonjour Uly, Frank

tes références sont elles toujours groupées dans la base de données ?

Edit:
Et est ce normal d'avoir 2 colonnes "désignation" identiques dans la base de données ?
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1 >
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021

Oui,
Le calcul de prix, que tu vois a coté, se fais uniquement avec la feuille NPRIX
Alors que ma recherche, en dessous du graphe, se fais uniquement avec "Base de donnée"
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1 >
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014

Et la liaison, se fais avec la cellule B11,
Elle permet d'exécuter le calcul de prix, mais j'aimerai notament qu'elle l'affiche les ligne en dessous du graphe
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1 >
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021

pour la colonne cloné de la designation, n'y fais pas attention, mauvaise manip de ma pars :p
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
Bonjour Michel,

Bienvenu à toi.

Voici comment j'ai traité le "bouzin" :
1- suppression des formules en S29:X29

2- insertion de la procédure événementielle et de la fonction dans le module de la feuille OFFRE DE PRIX :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$B$11" Then Exit Sub
If Target.Value = "" Then Exit Sub

Dim References() As String
Dim ValCherchee As String
Dim Nom_Feuil As String
Dim Plage As String
Dim dl As Long
Dim Test As Boolean
Dim i As Integer

ValCherchee = Target.Value
Nom_Feuil = "BaseDonnée"
With Sheets(Nom_Feuil)
dl = .Range("A" & Rows.Count).End(xlUp).Row
End With
Plage = "A1:A" & dl
'---------------------------------------------------------------
Test = FindAll(ValCherchee, Sheets(Nom_Feuil), Plage, References())
'---------------------------------------------------------------

If Test = True Then
Ligne = Range("S" & Rows.Count).End(xlUp).Row
If Ligne > 28 Then Range("S29:X" & Ligne).Clear
Ligne = 28
For i = 1 To UBound(References)
With Sheets(Nom_Feuil)
Ligne = Ligne + 1
Range("S" & Ligne).Value = .Range("A" & References(i)).Value
Range("T" & Ligne).Value = .Range("C" & References(i)).Value
Range("U" & Ligne).Value = .Range("D" & References(i)).Value
Range("V" & Ligne).Value = .Range("E" & References(i)).Value
Range("W" & Ligne).Value = .Range("F" & References(i)).Value
Range("X" & Ligne).Value = .Range("G" & References(i)).Value
End With
Next
End If
End Sub

Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches() As String) As Boolean
' --------------------------------------------------------------------------------------------------------------
' FindAll - To find all instances of the1 given string and return the row numbers.
' If there are not any matches the function will return false
' --------------------------------------------------------------------------------------------------------------
On Error GoTo Err_Trap
Dim rFnd As Range ' Range Object
Dim iArr As Integer ' Counter for Array
Dim rFirstAddress ' Address of the First Find
' -----------------
' Clear the Array
' -----------------
Erase arMatches
Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)

If Not rFnd Is Nothing Then
rFirstAddress = rFnd.Address
Do Until rFnd Is Nothing
iArr = iArr + 1
ReDim Preserve arMatches(iArr)
arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
Set rFnd = oSht.Range(sRange).FindNext(rFnd)
If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
Loop
FindAll = True
Else
' ----------------------
' No Value is Found
' ----------------------
FindAll = False
End If
' -----------------------
' Error Handling
' -----------------------
Err_Trap:
If Err <> 0 Then
MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
Err.Clear
FindAll = False
Exit Function
End If
End Function

A suivre...
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021
3 251
je vais faire le mien sans regarder ton code pour ne pas être influencer ! ;o)
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1
J'ai donc essayé de créer une macro avec ce code, mais il m'affiche des erreur de synthaxe :/
je ne peut donc pas vérifier si cela fonctionne
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
Voici un fichier à partir de ton classeur.
Les références en colonne AB ont été placées là à des fins de test...

Une amélioration possible : message à l'utilisateur en cas d'erreur de saisie si référence non trouvée...

@Michel : je vais faire le mien sans regarder ton code pour ne pas être influencer ! ;o)
Bien entendu ;-).
Et , comme d'hab, j'attends celui-ci impatiemment.
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1
Les deux fichier sont bien autant l'un que l'autre, :)
Même si j'ai une petite préference pour celui de pijaku
en tout merci a vous deux de votre altruisme, et d'avoir pris de votre temps pour résoudre mon problème

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
ça veut dire quoi ça?
Je n'ai pas encore vu celui de Michel........
Et si tu attendais les propositions des internautes bénévoles qui cherchent pour toi...
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1
Et bien j'ai testé les deux méthodes dans mon fichier excel,
et il répondent tous deux a leur objectifs,
autant pour moi si je t'ai vexé, ca n'etait pas dans mon attention...
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
Je ne suis pas vexé. Nous sommes deux sur le sujet, tu prends la solution que tu veux.
Je sors néanmoins de mes gonds parce que :

1- là, Michel est parti avec ton fichier sous le bras pour te bricoler une troisième possibilité (peut être, surement même), et que tu ne l'attendes pas.

2- Je me rends compte, après coup, que votre sujet est en fait UN DOUBLON vous n'aviez qu'à relancer f89...

3- qu'il y a déjà eu une "petite histoire" de plagiat entre nous 3 => Je ferais attention dans les jours a venir ;), et tacherais de rectifier le tir
==> aucun tir n'a été rectifié dans le fichier que vous fournissez comme étant le votre...

ça commence à faire pas mal non?
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
ps : je n'attends ici que pour voir la réponse de Michel_m
Messages postés
70
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
28 juillet 2014
1
oui... je le consoit, et j'en suis désolé...
je n'ai pas encore pris l'habitude de mettre le titre de l'auteur, lorsque je publie mon fichier.
Alors que je l'ai moi même fais sur mon pc.
Une facheuse habitude, que j'arrive pas encore a faire disparaître
encore dsl
Et pour moi, ca ,n'est pas un doublon, car dans l'ancien topic, la recherche concernait une zone de texte (textbox_1) et non une cellule, comme aujourd'hui
Peut être pas pour vous, mais pour moi, ca a tous changé. :/
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021
3 251
Si je dérange trop, tu le dis, Uly , ou arrête de fumer, tu planes et baisse le son de cette musique rasta.... :o)

Option Explicit
'-----
Sub rechercher_svt_reference()
Dim Ref As String
Dim Nbre_ref As Integer, Ligne As Integer, T_ref

Application.ScreenUpdating = False
Ref = Sheets("Offre de prix").Range("B11")
If Ref = "" Then GoTo vide
'---- recherche des Références
With Sheets("basedonnée")
Nbre_ref = Application.CountIf(.Columns("A"), Ref)
If Nbre_ref = 0 Then GoTo inconnu
Ligne = .Columns("A").Find(Ref, Range("A1"), xlValues).Row
'mémorisation de toutes les données données de la référence
T_ref = .Range(.Cells(Ligne, "A"), Cells(Ligne + Nbre_ref - 1, "F"))
End With
'-------- Restitution des données sélectionnées dans l'offre de prix
With Sheets("Offre de prix")
.Range("S29:X15000").Clear
With .Range("S29").Resize(Nbre_ref, 6)
.Value = T_ref
.Borders.Weight = xlThin
.applicate
End With
End With

Exit Sub

'----gestion erreurs
vide:
MsgBox " aucune référence saisie !", vbCritical
Exit Sub
inconnu:
MsgBox "Référence inconnue dans la base de données", vbCritical
End Sub

il faut mettre au préalable la colonne X au format nombre désiré ou incoporer une petite ligne dans le code



Michel
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021
3 251
C'est pas vrai !!!!
relis toi un peu

et tu te présentes comme visionnaire ?
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
@Michel : Effectivement, une troisième solution. Qui nécessite cependant que la feuille BaseDonnées soit triée au préalable ;-) Mais elle tient compte de cette possibilité d'Excel. Excel d'abord, VBA ensuite...

@uly : pourquoi un tel jugement au début de ton message ?
pour ceci je penses : non?

Sujet résolu
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021
3 251
en rentrant juste avant l'averse:
je lui avais demandé si les références étaient groupées et il m'avait répondu: oui
https://forums.commentcamarche.net/forum/affich-30572697-renvoi-de-donnee-via-une-recherche#6
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
Salut Michel,

Cela illustre, une fois de plus, "pensez Excel avant de penser VBA".
Dans le cas de ton code, tu penses Excel même lorsque l'on "nage" en plein VBA.
Ici, tu traites le problème en fonction du tri déjà établi (tri natif d'Excel). Ne te restes donc qu'à trouver la première occurrence (find = rechercher d'Excel) et le nombre d'occurrences. Encore une fois, pour cela, tu utilises une fonction native d'Excel NB.SI (Application.CountIf).
Très bonne analyse.
Messages postés
16538
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
1 décembre 2021
3 251
salut Frank

Si les références n'avaient pas été refroupées, le nb.si m'aurait donné le nombre de ref et j'aurais rempli une variable tableau avec find dans le genre
Ligne=columns("A").find(ref,cells(Ligne,"A"),xlvalues).row