Страницы: 1
RSS
Объединение массивов с непостоянной длиной
 
Всем доброго времени суток. Проблема следующая:
  Есть в общем пять массивов шириной 1 и длиной в всегда непредсказуемое множество значений. Необходимо объединить все пять массивов в один массив шириной 1 и длиной которого будет сумма длин всех пяти массивов. Пытаюсь сделать через CombineArrays, но основная загвоздка в том, что длины начальных массивов всегда будут меняться, соответственно и конечный суммарный массив должен быть без всяких пробелов и еще, желательно отсортированный по убыванию. Более того, после конечного суммарного массива, без пробела, нужно ввести, например, любую надпись (опять же проблема, что длинна суммарного массива всегда будет разной). Предполагаю ,что делается это через UBound, но с VBA третий день работаю, пока в синтаксисе и логике не разобрался, не отказался бы от помощи. Файл примера во вложении. Спасибо!
 
Код
Sub JoinArray()
  Dim a, b, c&, i&, r&
  For c = 4 To 12 Step 2
    r = Cells(Rows.Count, c).End(xlUp).Row - 5
  Next
  ReDim b(1 To r, 1 To 1): r = 1
  For c = 4 To 12 Step 2
    a = Range(Cells(6, c), Cells(Rows.Count, c).End(xlUp))
    For i = 1 To UBound(a)
      b(r - 1 + i, 1) = a(i, 1)
    Next
    r = r + UBound(a)
  Next
  Cells(5, 1).Resize(UBound(b), 1) = b
End Sub
Изменено: Ігор Гончаренко - 22.10.2023 11:29:40
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
КодSub JoinArray()
 Dim a, b, c&, d(1 To 5), i&, r&
 For c = 4 To 12 Step 2
   i = i + 1: d(i) = Cells(Rows.Count, c).End(xlUp).Row - 5
   r = r + d(i)
 Next
 ReDim b(1 To r, 1 To 1): r = 1
 For c = 4 To 12 Step 2
   a = Range(Cells(6, c), Cells(Rows.Count, c).End(xlUp))
   For i = 1 To UBound(a)
     b(r - 1 + i, 1) = a(i, 1)
   Next
   r = r + UBound(a)
 Next
 Cells(5, 1).Resize(UBound(b), 1) = b
End Sub
Снимаю шляпу. Все работает, теперь буду разбираться, как это работает  :)  
 
PaxomGG, вместо цитирования всего сообщения (которое ни вам ни нам не нужно), вы можете нажимать кнопку "Имя", которая находится на 1 см правее от кнопки "Цитировать"
 
New, принято
 
Если в одну колонку А и В, то можно воспользоваться Power Query.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"A", type number}, {"B", type number}, {"A2", type number}, {"B3", type number}, {"A4", type number}, {"B5", type number}, {"A6", type number}, {"B7", type number}, {"A8", type number}, {"B9", type number}}),
    #"Demoted Headers" = Table.DemoteHeaders(#"Changed Type"),
    #"Transposed Table" = Table.Transpose(#"Demoted Headers"),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Transposed Table", {"Column1"}, "Attribute", "Value"),
    #"Sorted Rows" = Table.Sort(#"Unpivoted Other Columns",{{"Value", Order.Descending}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Sorted Rows",{"Value"})
in
    #"Removed Other Columns"
Изменено: jakim - 22.10.2023 15:56:07
 
Код
Sub JoinArray()
 Dim a, b, c&, d(1 To 5), i&, r&
 For c = 4 To 12 Step 2
   i = i + 1: d(i) = Cells(Rows.Count, c).End(xlUp).Row - 5
   r = r + d(i)
 Next
 ReDim b(1 To r, 1 To 1): r = 1
 For c = 4 To 12 Step 2
   a = Range(Cells(6, c), Cells(Rows.Count, c).End(xlUp))
   For i = 1 To UBound(a)
     b(r - 1 + i, 1) = a(i, 1)
   Next
   r = r + UBound(a)
 Next
 Cells(5, 1).Resize(UBound(b), 1) = b
End Sub
В ходе эксплуатирования :) данного кода выявилась одна критичная проблема и еще один вопрос. Проблема в том, что, когда один из массивов или несколько полностью пустые, то код вообще не отрабатывает. А вопрос следующего плана, если в одном массиве между значениями есть пропуски, возможно ли их не учитывать в конечном объединённом массиве? Пока что на ум пришел способ через удаление пустых ячеек уже после формирования объединенного массива, но хотелось бы, чтобы они не учитывались на стадии формирования конечного массива, а не после.
Страницы: 1
Наверх