В идеале мы хотели бы избегать использования VBA для этого (если это возможно).
Я предоставил две таблицы в качестве примера, чтобы проиллюстрировать проблему, поскольку, вероятно, лучше использовать пример, а не давать запутанные объяснения.*
По сути, нам нужно вытянуть диапазон неизвестной длины, начиная с неизвестногосмещение от закрытой книги, затем используйте MATCH
, чтобы найти индекс строки искомого значения и вернуть значение.
Мы опробовали три различных метода.Все формулы работают, когда рабочая книга открыта, но нам нужно использовать решение без открытой рабочей книги.
Я не изучал использование INDIRECT
, поскольку MS строго заявляет, что INDIRECT
несовместима с закрытой книгой.
Вот формулы с отступом для улучшения наглядности:
Метод # 1: Использование index + count (if ()) (array)
Это решение возвращает #REF!
, когда внешняя рабочая книга закрыта
INDEX(
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$G:$G,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
)
:
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$G:$G,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
+
COUNT(
IF('Z:\...\[Suppliers.xlsx]suppliers'!$A:$A=$L$9,1)
)-1
)
,
MATCH(
K11,
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$D:$D,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
)
:
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$D:$D,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
+
COUNT(
IF('Z:\...\[Suppliers.xlsx]suppliers'!$A:$A=$L$9,1)
)-1
)
,0)
,0)
Метод № 2: Использование index + countif ()
Это решение возвращает #VALUE!
когда внешняя рабочая книга закрыта
INDEX(
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$G:$G,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
)
:
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$G:$G,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
+
COUNTIF('Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,$L$9))-1
)
,
MATCH(
K11,
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$D:$D,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
)
:
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$D:$D,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
+
COUNTIF('Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,$L$9))-1
)
,0)
,0)
Метод № 3: Использование index + sumproduct ()
Это решение возвращает #REF!
при закрытой внешней рабочей книге
INDEX(
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$G:$G,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
)
:
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$G:$G,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
+
SUMPRODUCT( -- ('Z:\...\[Suppliers.xlsx]suppliers'!$A:$A=$L$9))-1
)
,
MATCH(
K11,
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$D:$D,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
)
:
INDEX('Z:\...\[Suppliers.xlsx]suppliers'!$D:$D,
MATCH($L$9,'Z:\...\[Suppliers.xlsx]suppliers'!$A:$A,0)
+
SUMPRODUCT( -- ('Z:\...\[Suppliers.xlsx]suppliers'!$A:$A=$L$9))-1
)
,0)
,0)
Если я правильно понимаю, хитрый бит строит динамический диапазон, используя INDEX(ref,row,col):INDEX(ref,row,col)
, поскольку каждый бит работает сам по себе, но при использовании таким образом он возвращает ошибку.
Примечание: Вам может потребоваться обновить абсолютный путь к электронной таблицеsuppliers.xlsx
в main.xlsx
, если вы загрузите прилагаемую демоверсию
Вся помощь с благодарностью!