Jak odwołać się lub wyświetlić listę wartości na podstawie rozdzielonej przecinkami listy odwołań do kolumn w komórce w programie Excel?

1

Chcę wykonać vlookup (lub podobny) na kolumnie, która jest listą wartości. Działa to dobrze w przypadku wyszukiwania wartości z pojedynczego wiersza, ale chcę mieć możliwość wyszukiwania wielu wierszy, sumowania wyników i dzielenia przez liczbę wierszy, do których się odwołuje.

Na przykład:

   ABCDEFG
   [---- podane wartości ----------------] [Praca / Auth] [suma (vlookup (każda (G), tabela, 5))
                                                      / count (G)] [podane vals]

1 Pozycja Autoryzowana OnHand Operational Operation% Dependencyor% Dependencies 
2 A 1 1 1 1, 55 B 
3 B 10 5 5, 50, 55 C, D
4 C 100 75 50,50 .60 D
5 D 10 10 6 .60 1              

Chcę być w stanie pokazać wskaźnik operacyjny i szybkość działania systemów zależnych od (F). Aby uzyskać wartość F, chcę zsumować każdą wartość w kolumnie-E, do której odwołuje się zależność w kolumnie-G, a następnie podzielić przez liczbę zależności w G. Kolumna-G może mieć różne długości i będzie być rozdzieloną przecinkami listą wartości z kolumny-A.

Czy jest jakiś sposób, aby to zrobić w programie Excel?

glallen
źródło

Odpowiedzi:

1

Szukasz wzoru na każdy wiersz? Więc gdzie masz C, D w G3 (?) Zakładam, że chcesz wyszukać C i D w kolumnie A i uśrednić odpowiednie wartości w kolumnie E? Jeśli tak, spróbuj skopiować formułę tablicy dla wiersza 2

=AVERAGE(IF(COUNTIF(G2,"*"&A$2:A$10&"*")*(A$2:A$10<>""),E$2:E$10))

Aby wprowadzić formułę tablicową, musisz użyć CTRL-SHIFT-ENTER. Excel umieści nawiasy klamrowe {} wokół funkcji, aby wskazać, że jest to funkcja tablicy.

barry houdini
źródło
Col-G będzie miał różne liczby wartości rozdzielanych przecinkami. Będę musiał przeczytać o tym, jak to robisz za pomocą formuł tablicowych i symboli wieloznacznych? Ale pracuję w tabeli, więc moja rzeczywista formuła wygląda bardziej jak =AVERAGE(IF(COUNTIF(Table1[[#This Row],[Dependencies]],"*"&[Asset]&"*")*([Asset]<>""),[EquipReadiness]))Nie powinna różnicować odniesień do komórek i odniesień do tabeli, ale ... ta formuła zgłasza wszystkie zera.
glallen
Trzeba by użyć nazwy tabel ze wszystkich kolumn, więc myślę, że powinno być to: =AVERAGE(IF(COUNTIF(Table1[[#This Row],[Dependencies]],"*"&Table1[Asset]&"*")*(Table1[Asset]<>""),Table1[EquipReadiness])). To działa dla mnie. Jest to formuła tablicowa, więc musisz potwierdzić klawiszami CTRL + SHIFT + ENTER, aby nawiasy klamrowe, takie jak {i}, pojawiły się wokół formuły na pasku formuły
barry houdini
CTRL + SHIFT + ENTER działa znacznie lepiej. Więc to działa głównie, chociaż nie mogę użyć if lub iferror, aby pozbyć się # DIV / 0. Także: to wydaje się działać tylko wtedy, gdy umieściłem N,kolumnę G zamiast Ngdzie N jest referencją. W przeciwnym razie działa.
glallen
Czy masz na myśli dosłowne „N”, czy jest to numer referencyjny? Aby uniknąć błędów, możesz po prostu zawinąć całą formułę w IFERROR, jak = IFERROR (original_formula, 0) zero jest tym, co dostajesz w miejsce błędu, jeśli chcesz użyć pustego ""
barry houdini
1

ponieważ masz zmienną ilość wartości, najłatwiej jest użyć UDF (funkcja zdefiniowana przez użytkownika)

To powinno dać ci odpowiedź:

Function CSVAverage(CSVList As String, DataRange As Range, NumberColumn As Long) 
Dim FindList() As String
Dim NumEntries As Long
Dim I As Long
Dim Tot As Double

FindList = Split(CSVList, ",")
Tot = 0
NumEntries = UBound(FindList) - LBound(FindList) + 1

On Error Resume Next
For I = LBound(FindList) To UBound(FindList)
    Tot = Tot + Application.WorksheetFunction.VLookup(FindList(I), DataRange, NumberColumn, False)
    If Err.Number <> 0 Then
        CSVAverage = CVErr(xlErrNum)
        Exit Function
    End If
Next I
CSVAverage = Tot / NumEntries
End Function

Jeśli masz wartość, która nie została znaleziona, funkcja powróci #NUM!
przy użyciu przykładowego arkusza kalkulacyjnego, F1 miałaby=CSVAverage(G1,A2:E5,5)

SeanC
źródło
Nie korzystałem wcześniej z vbscript (choć grałem w C i perl trochę), ale ustawiłem to w moim arkuszu kalkulacyjnym, dodając punkt przerwania do funkcji, a następnie przechodząc przez nią - wszystko wygląda dobrze, dopóki Application.WorksheetFunction.VLookup(FindList(I), DataRange, NumberColumn, False)nie ustawię zegarka to nigdy nie zwraca wartości.
glallen
jest to sposób używania tej vlookupfunkcji przez VBA . Dla każdej wartości oddzielonej przecinkami będzie szukać wartości w kolumnie 1 zakresu i zwróci pasującą wartość w kolumnie NumberColumntego zakresu. jeśli chcesz wypróbować tę funkcję ręcznie, możesz użyć VLookup("A", Range("A1:B5"), 2, False)A do znalezienia A w obszarze A1: B5 i zwrócić wartość w drugiej kolumnie
SeanC
Ponadto, jeśli wartość nie zostanie znaleziona w tabeli, zwróci 0, a numer err.n będzie ustawiony, aby to wskazać.
SeanC
Tak, zacząłem używać VLookup bezpośrednio w Excelu i próbowałem znaleźć klej, który sprawi, że będzie wiele razy wyszukiwany na podstawie wielu referencji. Stąd pytanie. Działa, gdy wywołam go bezpośrednio w Excelu, ale nie w VB. Ustawiłem na nim zegarek, a także próbowałem go wywołać ręcznie, tzn. foo= Application.WorksheetFunction.VLookup("3",Range("Table1"),8,False) Może próbuję przekazać do niego tabelę zamiast zakresu komórek? W moim prawdziwym pliku próbowałem go w obie strony: =CSVAverage(Table1[[#This Row],[Dependencies]],Table1,9)i =CSVAverage(L3,$A$3:$I$55,8)nie ma szczęścia w żaden sposób.
glallen
Zwróci 0, jeśli nie ma żadnej wartości w G, ale w przeciwnym razie daje albo # NUM!
glallen