Я отвечаю на ваш вопрос:
... Есть ли обходной путь, который не использует INDIRECT (который является изменчивой функцией)?
Или ... есть ли его замена? (перефразировано)
Вы можете использовать VBA. Следующая функция работала для меня
Public Function shifted_lookup(lookup_value As Variant, table_array As Range, column_index As Integer, range_lookup As Integer) As Variant
Dim curr_wsname As String, oth_wsname As String
Dim curr_ws As Worksheet, oth_ws As Worksheet
Set curr_ws = ActiveSheet
curr_wsname = curr_ws.Name
oth_wsname = Right(curr_wsname, 3)
Set oth_ws = Worksheets(oth_wsname)
Dim src_rng_base As String, src_rng As Range
src_rng_base = table_array.Address
Set src_rng = oth_ws.Range(src_rng_base)
Dim aux As Variant
shifted_lookup = Application.WorksheetFunction.VLookup(lookup_value, src_rng, column_index, range_lookup)
End Function
Пример, который я использовал для тестирования (у меня Excel в испанском sh):
Формулы:
B1: =shifted_lookup(A1,$A$1:$B$6,2,1)
B2: =shifted_lookup(A2,$A$1:$B$6,2,0)
B3: =shifted_lookup(A3,$A$1:$B$6,2,1)
B4: =shifted_lookup(A4,$A$1:$B$6,2,0)
B5: =shifted_lookup(A5,$A$1:$B$6,2,1)
Примечания:
Я бы не знал о производительности или возможных зависаниях, я не настроил " testbed "для этого.
Вы можете использовать range_lookup As Integer
в качестве необязательного параметра, аналогично VLOOKUP
.
Вы можете немного укоротить функцию, убрав несколько промежуточных переменных. Они были определены для упрощения автозаполнения, написания кода и отладки. Я не думаю, что это поможет каким-либо образом.