Как сделать ссылку или vlookup список значений на основе списка ссылок на столбцы в ячейке в Excel, разделенных запятыми?

1

Я хочу сделать vlookup (или аналогичный) для столбца, который представляет собой список значений. Это прекрасно работает для поиска значения из одной строки, но я хочу иметь возможность искать несколько строк, суммировать результаты и делить на количество строк, на которые ссылаются.

Например:

   АБВГДЕЖ
   [---- заданные значения ----------------] [Работа / Автор] [сумма (vlookup (каждая (G), таблица, 5))
                                                      / count (G)] [данные значения]

1 пункт Авторизовано OnHand Работает Оперативная% Зависимость или% Зависимости 
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              

Я хочу показать операционную скорость и операционную скорость систем, от которых зависит каждая система (F). Чтобы получить значение для F, я хочу суммировать по каждому значению в column-E, на которое ссылалась зависимость в column-G, а затем делить на количество зависимостей в G. Column-G может иметь переменную длину и будет быть разделенным запятыми списком значений из столбца-A.

Есть ли способ сделать это в Excel?

glallen
источник

Ответы:

1

Вы ищете формулу для каждой строки? Итак, где у вас есть C, D в G3 (?) Я предполагаю, что вы хотите найти C и D в столбце A и усреднить соответствующие значения в столбце E? Если это так, попробуйте эту формулу массива для строки 2, скопированной вниз

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

Для ввода формулы массива вы должны использовать CTRL-SHIFT-ENTER. Excel поместит {} фигурные скобки вокруг функции, чтобы указать, что это функция массива.

Барри Гудини
источник
Col-G будет иметь различное количество значений через запятую. Мне придется прочитать о том, как вы делаете это с формулами массива и подстановочными знаками? Но я работаю с таблицей, поэтому моя фактическая формула выглядит так, как будто =AVERAGE(IF(COUNTIF(Table1[[#This Row],[Dependencies]],"*"&[Asset]&"*")*([Asset]<>""),[EquipReadiness]))не должно быть разницы между ссылками на ячейки и ссылками на таблицы, но ... эта формула сообщает обо всех нулях.
выпал
Вы должны были бы использовать имя таблицы со всеми столбцами , так что я думаю , что это должно быть: =AVERAGE(IF(COUNTIF(Table1[[#This Row],[Dependencies]],"*"&Table1[Asset]&"*")*(Table1[Asset]<>""),Table1[EquipReadiness])). Это подходит для меня. Это формула массива, поэтому вам нужно подтвердить с помощью CTRL + SHIFT + ENTER, чтобы фигурные скобки, такие как {и}, появлялись вокруг формулы в строке формул
Барри Гудини
CTRL + SHIFT + ENTER работает намного лучше. Итак, это в основном работает, хотя я не могу использовать if или iferror, чтобы избавиться от # DIV / 0. Кроме того: кажется, что это работает, только если я N,добавлю столбец G вместо того, Nгде N является ссылкой. В противном случае это работает.
выпал
Вы имеете в виду буквальное "N" или ссылка номер? Чтобы избежать ошибок, вы можете просто обернуть всю формулу в IFERROR следующим образом: = IFERROR (original_formula, 0) ноль - это то, что вы получите вместо ошибки, если вы хотите использовать пустое значение ""
Барри Гудини
1

так как у вас есть переменное количество значений, самый простой способ - использовать UDF (пользовательскую функцию)

Это должно получить ваш ответ:

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

Если у вас есть значение, которое не найдено, функция вернется, #NUM!
используя вашу электронную таблицу в качестве примера, F1 будет иметь=CSVAverage(G1,A2:E5,5)

SeanC
источник
Я не использовал vbscript раньше (хотя я играл с C и perl некоторые), но установил это в своей электронной таблице, добавил точку останова к функции, а затем прошел через нее - все выглядит хорошо, пока Application.WorksheetFunction.VLookup(FindList(I), DataRange, NumberColumn, False)я не установил часы это никогда не возвращает значение.
выпал
это способ использования vlookupфункции VBA . Для каждого из значений, разделенных запятыми, он будет искать значение в столбце 1 вашего диапазона и возвращать совпадающее значение в столбце NumberColumnэтого диапазона. если вы хотите попробовать эту функцию вручную, то вы можете VLookup("A", Range("A1:B5"), 2, False)найти A в области A1: B5 и вернуть значение во 2-м столбце
SeanC
Кроме того, если значение не найдено в вашей таблице, оно вернет 0, и для этого будет задан номер err.number.
SeanC
Да, я начал использовать VLookup непосредственно в Excel и пытался найти клей, чтобы он несколько раз просматривался на основе нескольких ссылок. Отсюда и вопрос. Это работает, когда я звоню прямо в Excel, но не в VB. Я установил часы на него, а также попытался вызвать его вручную, т.е. foo= Application.WorksheetFunction.VLookup("3",Range("Table1"),8,False) может быть, я пытаюсь передать ему таблицу вместо диапазона ячеек? В моем настоящем файле я пробовал оба пути: =CSVAverage(Table1[[#This Row],[Dependencies]],Table1,9)и =CSVAverage(L3,$A$3:$I$55,8)ни в коем случае не повезло.
выпал
Он вернет 0, если в G нет значения, но в противном случае он выдаст либо #NUM!
выпал