Справочные таблицы Excel динамически - PullRequest
10 голосов
/ 20 августа 2011

У меня есть проблема, которая должна быть такой простой, но я не собираюсь ее решать. Я делаю печатные прайс-листы для магазина, и в этом году они разделили номера деталей на 5 рабочих листов вместо одного.

Когда пользователь хочет распечатать ценник, он вводит знак = в C10, щелкает на листе «Прайс-лист» и переходит к нужному номеру детали.

Полученная формула для C10: = Прейскурант! B40

E10 должен содержать больше информации о номере детали, поэтому формула E10: = VLOOKUP (C10, прайс-лист! B: N, 2, FALSE)

Однако теперь с новыми рабочими листами она может выбрать Рабочий лист "New_Items", и в этом случае полученная формула для C10 будет такой: = New_Items! B40

Как мне написать формулу для E10, чтобы она ссылалась на тот же рабочий лист, что и C10.

Мне нужно E10 = VLOOKUP (C10, Прейскурант ! B: N, 2, FALSE)

автоматически становится * = VLOOKUP (C10, New_Items ! B: N, 2, FALSE) *

Это имеет смысл? Возможно ли, чтобы Excel изменил ссылку на рабочий лист на основе ссылки на другую ячейку?

ТИА!

Ответы [ 3 ]

13 голосов
/ 20 августа 2011

Да, вы можете сделать это, используя INDIRECT (). Это может занять немного работы, так как вам нужно как-то проработать название листа.

=VLOOKUP(C10, INDIRECT( Concatenate(cell-with-sheet-name, "!B:N"),TRUE ) ,2,FALSE)
1 голос
/ 29 августа 2011

Вы можете создать VBA UDF

Function GetShtNm(rng As Range) As String
    Application.Volatile

    If InStr(1, rng.Formula, "!") = 0 Then
        GetShtNm = vbNullString
    Else
        GetShtNm = Mid$(rng.Formula, 2, InStr(1, rng.Formula, "!") - 2)
    End If
End Function

и используйте эту формулу с косвенным указанием Эдди.

Этот UDF позволит вам динамически отслеживать изменения имени листа в функции VLOOKUP INDIRECT.

1 голос
/ 20 августа 2011

Можете ли вы использовать VBA?

Если это так, попробуйте этот простой udf

Function MyLookup(ref As Range, Offset as Long) As Variant
    MyLookup = Range(ref.Formula).Offset(0, Offset)
End Function

Ячейка E10 =MyLookup(C10, 1)

...