Использование индекса для построения диапазона из закрытой внешней книги - PullRequest
0 голосов
/ 14 февраля 2019

В идеале мы хотели бы избегать использования 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, если вы загрузите прилагаемую демоверсию

Вся помощь с благодарностью!

...