Большое спасибо ВСЕМ за ваш вклад! очень признателен! Я решил go по предложению Виталия Прушака и сначала получил размеры моего массива, а затем один раз ReDim'ed, который избавляет от головной боли ...
Dim rng As Range: Set rng = Sheet1.UsedRange
Dim rws() As String
Dim r As Integer, FirstRow As Integer, LastRow As Integer, g As Integer
Dim groupLevel(), RowsCount As Long, i As Long
'get rows to look in for grouped rows
rws = Split(Replace(rng.AddressLocal, ":", ""), "$")
FirstRow = rws(2)
LastRow = rws(4)
'get dimentions for array first ----------------------------------
With rng.Rows
For r = FirstRow To LastRow
If .Rows(r).OutlineLevel > 1 Then RowsCount = RowsCount + 1
Next r '------------------------------------------------------
'set array----------------------------------------------------
ReDim groupLevel(1 To RowsCount, 1 To 2)
'-------------------------------------------------------------
'populate array with rows using a group-----------------------
i = 1
For r = FirstRow To LastRow
For g = 2 To 8
If .Rows(r).OutlineLevel = g Then
groupLevel(i, 1) = r
groupLevel(i, 2) = .Rows(r).OutlineLevel
i = i + 1
End If
Next
Next r'-------------------------------------------------------
End With
'for debug
For r = 1 To UBound(groupLevel, 1)
Debug.Print "Row " & groupLevel(r, 1) & vbTab & " GroupLevel [" & groupLevel(r, 2) & "]"
Next r
Debug.Print " ************ end *************"
Одна вещь, которая до сих пор беспокоит меня, это наличие использовать один и тот же For ... Next
дважды, один раз, чтобы проверить только уровень контура, превышающий 1, чтобы определить размер массива, и второй раз, чтобы фактически заполнить массив. Существует ли способ обойти это, не так ли? Я спрашиваю, потому что количество строк может сильно различаться (в некоторых случаях дюжина, в других сотни или тысячи ..).
Не будет ли это замедляться при циклическом переключении больших диапазонов? Я также должен был бы применить большую часть того же самого, чтобы проверить и сгруппированные столбцы ..
Спасибо!