2011-07-19 30 views
12

Próbuję użyć funkcji Winteks lub podobnej do przeszukiwania arkusza roboczego, dopasować numery kont, a następnie zwrócić określoną wartość. Mój problem polega na tym, że istnieją zduplikowane numery kont i chciałbym, aby wynik zsumował wyniki w jeden ciąg znaków.excel vlookup z wieloma wynikami

Acct No CropType 
------- --------- 
0001  Grain 
0001  OilSeed 
0001  Hay 
0002  Grain 

Czy w pierwszym arkuszu, na 2 arkuszu mam Acct Nie z innymi informacjami i muszę uzyskać wszystkie pasujące wyniki w jednej kolumnie na 2 arkusza IE. „Ziarno Rzepaku Hay”

+1

+1 dla łatwy do zrozumienia pierwsze pytanie :) – ChrisO

Odpowiedz

7

Oto funkcja, która zrobi to za Ciebie. Trochę różni się od Vlookup tym, że dasz mu tylko kolumnę wyszukiwania, a nie cały zakres, a potem jako trzeci parametr powiesz, ile kolumn ma iść w lewo (liczby ujemne) lub w prawo (wartość dodatnia), aby uzyskać twoja wartość zwrotu.

Dodałem również opcję użycia separatora, w twoim przypadku użyjesz "". Oto wywołanie funkcji dla Ciebie, zakładając, że pierwszy wiersz z ACCT nr to wynik jest wiersz B:

=vlookupall("0001", A:A, 1, " ") 

Oto funkcja:

Function VLookupAll(ByVal lookup_value As String, _ 
        ByVal lookup_column As range, _ 
        ByVal return_value_column As Long, _ 
        Optional seperator As String = ", ") As String 

Dim i As Long 
Dim result As String 

For i = 1 To lookup_column.Rows.count 
    If Len(lookup_column(i, 1).text) <> 0 Then 
     If lookup_column(i, 1).text = lookup_value Then 
      result = result & (lookup_column(i).offset(0, return_value_column).text & seperator) 
     End If 
    End If 
Next 

If Len(result) <> 0 Then 
    result = Left(result, Len(result) - Len(seperator)) 
End If 

VLookupAll = result 

End Function 

Uwagi:

  • Zrobiłem "," domyślny separator wyników, jeśli go nie wprowadzisz.
  • Jeśli istnieje jedno lub więcej trafień, dodałem kilka sprawdzeń na końcu do upewnij się, że ciąg nie kończy się dodatkowym seperatorem.
  • Użyłem A: A jako zakresu, ponieważ nie znam twojego zakresu, ale oczywiście jest szybszy, jeśli podasz rzeczywisty zakres.
+0

Działa świetnie! Niestety, zajmuje to dużo czasu :( – javydreamercsw

+0

Zdecydowanie nie jest to dobry pomysł, aby przekazać nieograniczony zakres za pomocą tego kodu.Jeśli przejdziesz w A: A jak w tym przykładzie, kod sprawdzi wszystkie 1048 576 wierszy przy każdym uruchomieniu. wpisz rzeczywisty zakres zamiast przechodzenia przez całą kolumnę – Jesse

+0

@evolko użyj WorksheetFunction.CountA (kolumna_rewylacyjna) do zliczenia, jest to szybsze! –

2

Jednym ze sposobów, aby to zrobić byłoby wykorzystanie formułę tablicową, aby wypełnić wszystkie mecze do ukrytej kolumny, a następnie złączyć te wartości do swojego łańcucha na wyświetlaczu:

=IFERROR(INDEX(cropTypeValues,SMALL(IF(accLookup=accNumValues,ROW(accNumValues)-MIN(ROW(accNumValues))+1,""),ROW(A1))),"") 
  • cropTypeValues ​​: Nazwany zakres zawierający listę typów upraw.
  • accLookup: nazwany zakres zawierający numer konta do wyszukania.
  • accNumValues ​​: Nazwany zakres zawierający listę numerów kont .

Wprowadź jako formułę tablicową (Ctrl + Shift + Enter), a następnie skopiuj tak daleko, jak to konieczne.

Daj mi znać, jeśli potrzebujesz jakiejkolwiek części wyjaśnienia formuły.

+0

To mój preferowanym rozwiązaniem, ponieważ unika makr, które można uzyskać, jeśli dzielą niepełnosprawnych. Nie jest idealny do nieograniczonej liczby meczów, ale dobrze, jeśli spodziewasz się tylko kilku. https://www.extendoffice.com/documents/excel/2699-excel-vlookup-find-first-2nd-match.html daje dobre przykłady. – beldaz

0

Po prostu miałem podobny problem i przez długi czas poszukiwałem podobnych rozwiązań, jednak nic tak naprawdę mnie nie przekonało. Albo musieliście napisać makro, albo jakąś specjalną funkcję, podczas gdy na moje potrzeby najprostszym rozwiązaniem jest użycie tabeli przestawnej w np. Przewyższać.

Jeśli utworzysz nową tabelę przestawną ze swoich danych i najpierw dodasz "Acct No" jako etykietę wiersza, a następnie dodasz "CropType" jako RowLabel, będziesz miał bardzo ładne grupowanie, które wyszczególnia dla każdego konta wszystkie typy upraw. Nie zrobi tego jednak w pojedynczej komórce.

-1
Function VLookupAll(vValue, rngAll As Range, iCol As Integer, Optional sSep As String = ", ") 
    Dim rCell As Range 
    Dim rng As Range 
    On Error GoTo ErrHandler 
    Set rng = Intersect(rngAll, rngAll.Columns(1)) 
    For Each rCell In rng 
     If rCell.Value = vValue Then 
      VLookupAll = VLookupAll & sSep & rCell.Offset(0, iCol - 1).Value 
     End If 
    Next rCell 
    If VLookupAll = "" Then 
     VLookupAll = CVErr(xlErrNA) 
    Else 
     VLookupAll = Right(VLookupAll, Len(VLookupAll) - Len(sSep)) 
    End If 
ErrHandler: 
    If Err.Number <> 0 Then VLookupAll = CVErr(xlErrValue) 
End Function 

Zastosowanie tak:

=VLookupAll(K1, A1:C25, 3)

aby wyszukać wszystkie wystąpienia wartości K1 w zakresie A1: A25 i powrót odpowiednie wartości z kolumny C, oddzielony przecinkami.

Jeśli chcesz zsumować wartości, można użyć SUMA.JEŻELI, na przykład

=SUMIF(A1:A25, K1, C1:C25)

do sumowania wartości w C1: C25, gdzie odpowiednie wartości w kolumnie A równa wartości K1.

ALL D BEST.

0

Tu jest mój kod, który nawet lepiej niż WYSZUKAJ.PIONOWO Excel, ponieważ można wybrać criterie Columa, a na pewno separatora (Carriege powrócić też) ...

Function Lookup_concat(source As String, tableau As Range, separator As String, colSRC As Integer, colDST As Integer) As String 
    Dim i, y As Integer 
    Dim result As String 

    If separator = "CRLF" Then 
     separator = Chr(10) 
    End If 

    y = tableau.Rows.Count 
    result = "" 
    For i = 1 To y 
     If (tableau.Cells(i, colSRC) = source) Then 
      If result = "" Then 
       result = tableau.Cells(i, colDST) 
      Else 
       result = result & separator & tableau.Cells(i, colDST) 
      End If 
     End If 
    Next 
    Lookup_concat = result 
End Function 

i prezent, można dokonać także wyszukiwanie na wielu elementach tej samej komórki (w oparciu o ten sam separator). Naprawdę przydatny

Function Concat_Lookup(source As String, tableau As Range, separator As String, colSRC As Integer, colDST As Integer) As String 
    Dim i, y As Integer 
    Dim result As String 

    Dim Splitted As Variant 

    If separator = "CRLF" Then 
     separator = Chr(10) 
    End If 

    Splitted = split(source, separator) 

    y = tableau.Rows.Count 
    result = "" 
    For i = 1 To y 
     For Each word In Splitted 
      If (tableau.Cells(i, colSRC) = word) Then 
       If result = "" Then 
        result = tableau.Cells(i, colDST) 
       Else 
        Dim Splitted1 As Variant 
        Splitted1 = split(result, separator) 
        If IsInArray(tableau.Cells(i, colDST), Splitted1) = False Then 
         result = result & separator & tableau.Cells(i, colDST) 
        End If 
       End If 
      End If 
     Next 
    Next 
    Concat_Lookup = result 
End Function 

Poprzednia potrzeb sub Ta funkcja

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 
Powiązane problemy