Recherche dans BD

Bonjour,

Je suis tout nouveau sur le forum!

J'ai une base de données sur une feuille et j'aimerais avoir des résultats de recherche sur une autre feuille et sur une seule ligne!

Voici la feuille 1

SALLE1 ORDINATEUR

SALLE1 ECRAN

SALLE1 BEAMER

SALLE1 PANNEAU

SALLE1 PROJECTEUR

SALLE2 ECRAN

SALLE2 BEAMER

SALLE2 PANNEAU

SALLE2 PROJECTEUR

SALLE3 PANNEAU

SALLE3 PROJECTEUR

SALLE4 PROJECTEUR

et voici la feuille 2 avec le résultat que je souhaite atteindre (chaque résultat est donc dans la cellule suivante):

ORDINATEUR SALLE1

ECRAN SALLE1 SALLE2

BEAMER SALLE1 SALLE2

PANNEAU SALLE1 SALLE2 SALLE3

PROJECTEUR SALLE1 SALLE2 SALLE3 SALLE4

J'aimerais donc avoir sur une ligne toutes les salles dans lesquelles il y a soit un ordinateur, un écran, etc ... et les salles doivent être sur la même ligne.

Comment puis-je afficher toutes les salles en partant de l'objet recherché, ici le premier étant l'ordinateur?

Je ne suis pas très fort en EXCEL, la fonction RECHERCHEV va trouver 1 seule salle et pas toutes ...

Merci pour votre coup de main!

Cordialement,

Didier

En tableau croisé dynamique

Bonjour et bienvenue sur le forum

Bonjour à tous

Une autre approche.

Bye !

9essai-v1.xlsm (24.52 Ko)

bonjour et;bienvenue

un essai par formules (matricielles)

11hermes.xlsx (11.26 Ko)

cordialement

Bonjour à tous et surtout merci à tous!

J'ai regardé vos 3 solutions et c'est la solution à tulipe_4 qui correspond à 100% à mon attente. Maintenant, je dois analyser la formule "qui trouve les correspondances", elle est corsée pour moi, et dès que j'aurai compris son fonctionnement, je l'adapterai à mon cas concret!

A tout bientôt.

J'ai regardé la formule et je vois que la fonction INDEX est utilisée (je ne la connaissais pas celle-là).

Puisque dans mon cas concret, j'ai environ 500 "salles" (dans la colonne A) différentes et 6000 "objets" (dans la colonne B). J'ai voulu changer (pour comprendre) mes données en ajoutant 1 "salle" en A13 et j'ai changé $B$12 par $B$13, $A$12 par $A$13 et B$12 par B$13 ... et ça plante dans ma formule!

Où ai-je fait faux?

As-tu enregistré en formule matricielle cette superbe contribution de Tulipe ?

Mais vu la quantité de données ... je préférerais le TCD.

Cela dit, j'ai stocké cette formule matricielle magique !

Merci Steelson, c'était bien l'enregistrement en formule matricielle! Je peux poursuivre dans mon analyse!

bonjour

steelson est dans le vrai ;personnellement j'evite de depasser les 1000/1500lignes ,car au dela les matricielles (gourmandes en energie calculante ) on tendance à faire mouliner

le tdc c'est bien ;mais helas moins directement parlant

il ne te reste plus que du VBA (ultra performant) mais ;il faut en maitriser la syntaxe; (je n'y arrive pas ;c'est comme le solfege ;je suis immediatement paumé)

il te suffit de fournir une piecejointe definitivement bien construiteet; inssessament sous peu la solution te sera proposée par des membres qui, n'attendent que cela, ne serait-ce que pour justifier leur statut de "passionné d'excel" ; lequel pour certains;est fraichement acquis

la balle est dans ton camp , fonce

cordialement

un exemple, je n'en suis pas fana ... mais comme je suis fada d'excel !

Bonjour à tous

tulipe_4 a écrit :

la balle est dans ton camp

Encouragé par Tulipe (quel as !) je me permets de reprendre la balle au bond pour 2 nouvelles propostions, histoire de me racheter car, à la lumière des autres réponses, je m'aperçois que j'avais répondu à coté, une fois de plus (quel âne !)

Bye !

10essai-v2.xlsm (27.13 Ko)

l'as...... matic ou l'as.....smala ;peut etre l'as ...ticot

Bonjour,

si la feuille 1 est bien séparée en deux colonnes pour les salles et les matériels avec une ligne de titres,

vu le nombre important de lignes à traiter, voici une démonstration via un filtre avancé :

Sub Demo()
Dim Rg1 As Range, Rg2 As Range
Application.ScreenUpdating = False

With Feuil1
    If .FilterMode Then .ShowAllData
    With .Cells(1).CurrentRegion:  Set Rg1 = .Columns(1):  Set Rg2 = .Columns(2):  End With
End With

With Feuil2
    .UsedRange.Clear
    Rg2.AdvancedFilter xlFilterCopy, , .Cells(2), True
                       L& = .UsedRange.Rows.Count
          .Cells(1).Value = .Cells(2).Value
    Feuil1.Rows(1).Hidden = True

    For R& = 2 To L
        .Cells(2, 1).Value = .Cells(R, 2).Value
        Rg2.AdvancedFilter xlFilterInPlace, .[A1:A2]
        Rg1.Copy .Cells(L + 3, R)
    Next

      Set Rg1 = .Cells(L + 3, 2).CurrentRegion
          Rg1.Copy: .Cells(2, 3).PasteSpecial Transpose:=True
    Union(Rg1, .[A1:A2]).Clear:   .Columns(2).AutoFit:   .Activate:   .Cells(1).Select
End With

Feuil1.ShowAllData:  Set Rg1 = Nothing:  Set Rg2 = Nothing
End Sub

Mais c'est un vrai concours ! keskon gagne ?

Va falloir départager, en espérant que tout le monde soit ex aequo !

Mets le champagne au frais ... (je préfère la clairette de Die)

Steelson a écrit :

keskon gagne ?

Au minimum, un Mars ‼ 8)

Une autre voie plus simple et peut-être plus rapide (à tester avec un classeur conséquent)

via des variables de type tableau et la fonctionnalité Convertir du menu Données d'Excel :

Sub Macro1()
With Feuil2
    .UsedRange.Clear:  Application.ScreenUpdating = False

    With Feuil1.Cells(1).CurrentRegion
        VA = .Value
        .Columns(2).AdvancedFilter xlFilterCopy, , Feuil2.Cells(2), True
    End With

    .Columns(2).AutoFit
    ReDim TS$(1 To .UsedRange.Rows.Count - 1, 0)
    TM = Application.Transpose(.Cells(2, 2).Resize(UBound(TS)).Value)

    For R& = 2 To UBound(VA)
              M& = Application.Match(VA(R, 2), TM, 0)
        TS(M, 0) = TS(M, 0) & VA(R, 1) & vbTab
    Next

    With .Cells(2, 3).Resize(UBound(TS)):  .Value = TS:  .TextToColumns Tab:=True:  End With
End With
End Sub

N'étant pas plus rapide de mon côté avec les données du post initial,

sait-on jamais, tester dans un gros classeur ce code utilisant un dictionnaire externe :

Sub Macro2()
With CreateObject("Scripting.Dictionary")
    VA = Feuil1.Cells(1).CurrentRegion
    For R& = 2 To UBound(VA):  .Item(VA(R, 2)) = .Item(VA(R, 2)) & VA(R, 1) & vbTab:  Next
    Feuil2.UsedRange.Clear:                      Application.ScreenUpdating = False
    Feuil2.Cells(2, 2).Resize(.Count, 2).Value = Application.Transpose(Array(.Keys, .Items))
    Feuil2.Cells(2, 3).Resize(.Count).TextToColumns Tab:=True
    Feuil2.Columns(2).AutoFit
    .RemoveAll
End With
End Sub

La procédure Macro1 utilise en interne le même principe de dictionnaire,

ses variables TM et TS étant équivalentes aux collections Key et Item de l'objet Dictionary

Rechercher des sujets similaires à "recherche"