Ссылка на диапазон Excel

#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)