Excel - Come visualizzare per restituire più valori?


18

Sto cercando di utilizzare Excel per cercare e restituire più valori di riferimento per una determinata chiave. VLookup fa qualcosa di molto simile a quello di cui ho bisogno, ma restituisce solo una singola partita.

Presumo che comporterà metodi di restituzione e gestione degli array, sebbene non li abbia mai affrontati prima. Alcuni googling iniziano a appoggiarsi all'if ([lookuparray] = [value], row [lookuparray]) come parte di una soluzione, anche se non riesco a ottenerlo per restituire una singola partita ...

Ad esempio, se ho questi dati di riferimento:

Adam    Red
Adam    Green
Adam    Blue
Bob     Red
Bob     Yellow
Bob     Green
Carl    Red 

Sto cercando di ottenere i valori di ritorno multipli sulla destra. (Virgola separata, se possibile)

Red      Adam, Bob, Carl
Green    Adam, Bob
Blue     Adam
Yellow   Bob

(Ho già il valore chiave sulla sinistra - non è necessario estrarre quei valori)

Qualsiasi aiuto su come affrontare la gestione di più valori in questo contesto è apprezzato. Grazie.

Risposte:


13

Supponendo che desideri un approccio formula come indicato (non usando VLOOKUP, ma comunque una formula), ecco come ho presentato i dati:

Layout dei dati

Ho quindi usato la seguente formula nella cella C12:

=INDEX($C$2:$C$8, SMALL(IF($B12=$B$2:$B$8, ROW($B$2:$B$8)-MIN(ROW($B$2:$B$8))+1, ""), 1))

Questa è una formula di matrice, quindi dopo averla copiata e incollata nella cella, devi premere Ctrl+Shift+Enter. L'ho quindi trascinato verso destra e verso il basso.

Se non ci sono altri valori che danno l' #NUM!errore, ho fornito un esempio di giallo nell'esempio dell'immagine caricata.

Penso che un approccio VBA / Macro sarebbe una soluzione migliore se hai tonnellate di file.


Per coloro che desiderano sommare i valori recuperati (dove l'ordine non ha importanza), è più semplice utilizzare IF con un array:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox,

Ho provato questa formula ma l'output che sto ottenendo dopo aver trascinato il mouse sopra e sotto restituisce solo Adam e Bob - sto facendo qualcosa di sbagliato? Guarda lo screenshot qui snag.gy/qW7UKM.jpg
ziggy,

@ziggy hai premuto ctrl + maiusc + invio?
Dan,

5
  1. Scambia le colonne in modo che i colori siano nella colonna A e i nomi nella colonna B, quindi ordina il colore.

  2. Formula in C2 (copiarlo nella colonna): = IF (A2 <> A1, B2, C1 & "," & B2)

  3. Formula in D2 (copiarlo nella colonna): = A2 <> A3

  4. Filtra per "VERO" nella colonna D per ottenere i risultati desiderati. Vedi sotto:

inserisci qui la descrizione dell'immagine


TIL è possibile utilizzare l'operatore "&" anziché la formula CONCATENATE () goffa. Grazie!
bpcookson,

3

Se vuoi un approccio formula, è molto più semplice ottenere i risultati in celle separate, quindi supponiamo che la tua prima tabella sia A2: B8 e che i colori siano nuovamente elencati in D2: D5. Prova questa formula in E2

=IFERROR(INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))),"")

confermato con CTRL+SHIFT+ENTERe copiato su e giù. Quando le partite finiscono si ottengono spazi vuoti.

Formula presuppone Excel 2007 o versione successiva: se la versione precedente è possibile utilizzare COUNTIF anziché IFERROR, ad es

=IF(COLUMNS($E2:E2)>COUNTIF($B$2:$B$8,$D2),"",INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))))


3

Ecco la soluzione VBA per te. Innanzitutto, ecco come appaiono i risultati:

Immagine dello schermo

Ed ecco il codice:

Option Explicit
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String

    Dim s As String 'Results placeholder
    Dim sTmp As String  'Cell value placeholder
    Dim r As Long   'Row
    Dim c As Long   'Column
    Const strDelimiter = "|||"  'Makes InStr more robust

    s = strDelimiter
    For r = 1 To lookupRange.Rows.Count
        For c = 1 To lookupRange.Columns.Count
            If lookupRange.Cells(r, c).Value = lookupValue Then
                'I know it's weird to use offset but it works even if the two ranges
                'are of different sizes and it's the same way that SUMIF works
                sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
                If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
                    s = s & sTmp & strDelimiter
                End If
            End If
        Next
    Next

    'Now make it look like CSV
    s = Replace(s, strDelimiter, ",")
    If Left(s, 1) = "," Then s = Mid(s, 2)
    If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)

    LookupCSVResults = s 'Return the function

End Function
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.