В Excel введите Alt+F11, чтобы открыть окно Visual Basic.
Слева щелкните правой кнопкой мыши имя вашей электронной таблицы и выберите Insert
→ Module
.
Module1 - Code
откроется справа. Вставьте следующее в этом окне:
Function SHEET_NUM()
SHEET_NUM = Application.Caller.Parent.Index
End Function
Теперь вернитесь к таблице. Просто для удовольствия, чтобы увидеть, как это работает, введите =SHEET_NUM()
в любую ячейку. Он должен отображать номер листа, на котором он находится. Итак, введите
=INDIRECT("[sub.xlsx]Sheet1!$B$" & (SHEET_NUM()+1))
в ячейку H4
на каждом листе. SHEET_NUM()+1
будет оцениваться как 2
на Sheet1
, 3
на Sheet2
и т.д. - другими словами, номер строки, который вы хотите использовать в своей ссылке.
&
является оператором сцепления; он объединит постоянную строку "[sub.xlsx]Sheet1!$B$"
с вычисленным номером строки, приводя к нужной ссылке.
Функция INDIRECT
берет строку, которая выглядит как ссылка, и отменяет ссылки на нее; т.е. он выбирает значение, на которое ссылается.
Несколько предупреждений:
- Если вы имеете дело с одной книгой (
stu.xlsx
), ссылающейся на другую (sub.xlsx
), вам потребуется открывать вторую книгу всякий раз, когда вы работаете с первой - хотя Excel может ссылаться на данные в закрытой книге, INDIRECT
функция не может.
Если это проблема, вы можете выполнить маневр копирования и вставки значений.
- Вам нужно будет сохранить книгу в виде файла
.xlsm
и включать макросы каждый раз, когда вы ее открываете.
(Или выполните вышеупомянутый маневр копирования и вставки значений.)
- AFAICT, рабочим листам присваивается номер при их создании, и их трудно изменить.
В частности, если вы переместите свои листы, они сохранят свои первоначальные номера, что может привести к путанице.
(Но с другой стороны, вы можете переименовать их, не беспокоясь об изменении их номеров.)