#vba #excel #range
#vba #excel #диапазон
Вопрос:
Позвольте мне предварить этот вопрос, сказав, что я не очень техничен, поэтому большая часть моего словоблудия может показаться неясной..
На листе 1 у меня есть три отдельных горизонтальных диапазона ячеек (3 отдельных ряда шагов):
A1:D1
A2:C2
A3:E3
На втором листе я хотел бы создать ссылки для создания живых ссылок на эти диапазоны, чтобы, если я изменю информацию на листе 1, она автоматически отразится на листе 2.
Проблема в том, что на листе 2 я хочу, чтобы диапазоны были перечислены друг за другом в одной строке, чтобы создать одну длинную серию шагов.
Диапазон 1 —> Диапазон 2 —> Диапазон 3 (все в одной строке)
Как мне гарантировать, что если я добавлю дополнительный шаг, скажем, к первому диапазону на листе 1, то на листе 2 будет добавлена новая ячейка, а все следующие ячейки будут сдвинуты вправо на одну ячейку?
Комментарии:
1. Вы знаете, что вы можете сделать что-то подобное
='sheet1'!A1
в ячейках вашего второго листа?
Ответ №1:
Чтобы учесть диапазоны, которые могут увеличиваться, начните с первой ячейки, а затем найдите последнюю занятую ячейку с End(xlToRight)
помощью . После того, как вы нашли все экстенты диапазона, вы можете объединить их с массивом UDF:
Function ConcatRanges(ParamArray ranges()) As Variant()
Application.Volatile
Dim ret() As Variant
ReDim ret(1 To 1, 1 To (Application.Caller.Columns.Count))
Dim RetIdxamp;, iamp;, cell As Range
RetIdx = 1
For i = 0 To UBound(ranges)
For Each cell in Application.Range(ranges(i), ranges(i).End(xlToRight))
ret(1, RetIdx) = cell.Value
RetIdx = RetIdx 1
Next
Next
For RetIdx = RetIdx To UBound(ret, 2)
ret(1, RetIdx) = vbNullString
Next
ConcatRanges = ret
End Function
Для вашего примера вы бы назвали это так:
=ConcatRanges(Sheet1!A1, Sheet1!A2, Sheet1!A3)