Renvoi de donnee, via une recherche

Résolu/Fermé
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 - 28 juil. 2014 à 09:34
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 29 juil. 2014 à 08:02
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

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 juil. 2014 à 09:44
Bonjour,

Vous avez le choix :
- La recherchev polyvalente

- La fonction FindAll
1
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1
28 juil. 2014 à 09:56
Merci,
Jai regardé les deux fonction,
Mais d'après toi, quelle serait la plus simple a adapter a mon fichier :/
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 juil. 2014 à 10:14
FindAll semble efficace car elle te renvoie une variable tableau contenant les numéros des lignes...
0
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
28 juil. 2014 à 10:58
j'essaye en vain d'y adapter mon fichier, mais dur dur...
Je vous fais parvenir mon fichier Excel en pièce jointe d'ici 1h30
en tous cas, merci de votre attention a mon problème
Cordialement, uly2562
0
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1
Modifié par uly2562 le 28/07/2014 à 12:35
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 28/07/2014 à 14:31
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 ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 juil. 2014 à 14:42
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
28 juil. 2014 à 15:01
je vais faire le mien sans regarder ton code pour ne pas être influencer ! ;o)
0
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1
28 juil. 2014 à 15:05
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 juil. 2014 à 15:17
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.
0
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1
28 juil. 2014 à 15:25
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

0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 juil. 2014 à 15:26
ç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...
0
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1
28 juil. 2014 à 15:29
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...
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 28/07/2014 à 15:40
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?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 juil. 2014 à 15:41
ps : je n'attends ici que pour voir la réponse de Michel_m
0
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1
Modifié par uly2562 le 28/07/2014 à 15:46
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é. :/
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 28/07/2014 à 15:49
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
0
uly2562 Messages postés 70 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 28 juillet 2014 1
28 juil. 2014 à 15:51
Merci pour le code,
Mais pourquoi un tel jugement au début de ton message ?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
28 juil. 2014 à 15:55
C'est pas vrai !!!!
relis toi un peu

et tu te présentes comme visionnaire ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 juil. 2014 à 15:56
@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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
28 juil. 2014 à 18:18
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
29 juil. 2014 à 07:54
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.
0