Как я могу создать массив чисел между несколькими диапазонами, определенными в отдельных ячейках в Sheet? - PullRequest
1 голос
/ 29 апреля 2020

А1: 1 | B1: 4
A2: 3 | B2: 6

Как мне получить {1, 2, 3, 3, 4, 4, 5, 6} из этого?

- - - - - -

Я знаю так:
=ArrayFormula({ROW(INDIRECT(A1&":"&B1)); ROW(INDIRECT(A2&":"&B2))})

Это отлично работает, но что, если я не знаю, сколько диапазонов будет быть? Я хочу создать массив всех чисел между значениями, указанными в ячейках от A1: B1 вплоть до A: B.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Вот относительно простая формула для генерации массива, о котором вы говорите, на основе бесконечного числа диапазонов в столбцах A и B.

=ARRAYFORMULA(QUERY(SPLIT(FLATTEN(SEQUENCE(1,MAX(B1:B10-A1:A10)+1,0)+A1:A10&"|"&B1:B10),"|",0,0),"Select Col1 where Col1<=Col2 order by Col1",0))

Это можно увидеть на вкладке под названием Демонстрация 2 на этом листе.

1 голос
/ 29 апреля 2020

В Excel 365 с вашими данными в столбцах A и B , выберите ячейку и введите:

="{" & TEXTJOIN(",",TRUE,SEQUENCE(,MAX(A:B),MIN(A:B))) & "}"

enter image description here

РЕДАКТИРОВАТЬ # 1:

Попробуйте этот макрос VBA:

Sub MakeArray()
    Dim I As Long, N As Long, J, k
    Dim strng As String
    Dim arr As Variant

    N = Cells(Rows.Count, "A").End(xlUp).Row
    For I = 1 To N
        For J = Cells(I, 1) To Cells(I, 2)
            strng = strng & "," & J
        Next J
    Next I
    strng = Mid(strng, 2)

    strng = "{" & Join(fSort(Split(strng, ",")), ",") & "}"


    MsgBox strng
End Sub

Public Function fSort(ByVal arry)
Dim I As Long, J As Long, Low As Long
    Dim Hi As Long, Temp As Variant

    Low = LBound(arry)
    Hi = UBound(arry)

    J = (Hi - Low + 1) \ 2
    Do While J > 0
        For I = Low To Hi - J
          If arry(I) > arry(I + J) Then
            Temp = arry(I)
            arry(I) = arry(I + J)
            arry(I + J) = Temp
          End If
        Next I
        For I = Hi - J To Low Step -1
          If arry(I) > arry(I + J) Then
            Temp = arry(I)
            arry(I) = arry(I + J)
            arry(I + J) = Temp
          End If
        Next I
        J = J \ 2
    Loop
    fSort = arry
End Function

enter image description here

Макрос:

  1. создает разделенную запятыми строку из каждой A / B пары
  2. сортирует строку
  3. выводит строку
...