В 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, рабочим листам присваивается номер при их создании, и их трудно изменить.
В частности, если вы переместите свои листы, они сохранят свои первоначальные номера, что может привести к путанице.
(Но с другой стороны, вы можете переименовать их, не беспокоясь об изменении их номеров.)