Renvoi de donnee, via une recherche

Résolu
uly2562 Messages postés 86 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Vous avez le choix :
    - La recherchev polyvalente

    - La fonction FindAll
    1
    1. uly2562 Messages postés 86 Statut Membre 1
       
      Merci,
      Jai regardé les deux fonction,
      Mais d'après toi, quelle serait la plus simple a adapter a mon fichier :/
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      FindAll semble efficace car elle te renvoie une variable tableau contenant les numéros des lignes...
      0
    3. uly2562 Messages postés 86 Statut Membre 1 > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
       
      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
    4. uly2562 Messages postés 86 Statut Membre 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
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      je vais faire le mien sans regarder ton code pour ne pas être influencer ! ;o)
      0
    2. uly2562 Messages postés 86 Statut Membre 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
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  3. uly2562 Messages postés 86 Statut Membre 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

    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      ç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
    2. uly2562 Messages postés 86 Statut Membre 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...
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      ps : je n'attends ici que pour voir la réponse de Michel_m
      0
    5. uly2562 Messages postés 86 Statut Membre 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é. :/
      0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. uly2562 Messages postés 86 Statut Membre 1
       
      Merci pour le code,
      Mais pourquoi un tel jugement au début de ton message ?
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      C'est pas vrai !!!!
      relis toi un peu

      et tu te présentes comme visionnaire ?
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      @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
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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