Excel Vba создает массив из 2 значений ячеек с размером шага 1

Я пытаюсь создать массив, который меняет размеры на основе двух значений ячеек. Затем этот массив будет использоваться в цикле For.

Например:

B3 = 1 C3 = 4 

Я хотел бы, чтобы массив имел нижнюю границу 1 и верхнюю границу 4 с размером шага или интервалом 1

Код работает, когда я набираю массив, как показано ниже, но я бы хотел, чтобы он был динамическим или изменялся на основе значений ячеек B3 и C3.

SheetList = Array("1", "2", "3", "4")

person Ross.P    schedule 05.02.2021    source источник


Ответы (2)


просто используйте цикл for:

 Sub workForFree()
 
 Dim sheetlist() As Variant
 ReDim sheetlist(ActiveSheet.Range("C3") - ActiveSheet.Range("B3"))
 
 Dim k As Long
 k = 0
 
 Dim i As Long
 For i = ActiveSheet.Range("B3") To ActiveSheet.Range("C3") Step 1
    sheetlist(k) = i
    k = k + 1
 Next i
 
 Debug.Print Join(sheetlist, ",")
    
    
 End Sub
person Scott Craner    schedule 05.02.2021
comment
LBound(sheetlist)=0 в вашем решении, а не 1, как требуется. Это должно быть: Список листов ReDim (ActiveSheet.Range(C3), ActiveSheet.Range(B3)) - person Gene; 07.02.2021
comment
Нет, это равно 1. Запустите его с 1 на b3 и 4 на c3. - person Scott Craner; 08.02.2021
comment
Массив ReDim'd только с одним числом в вашем коде, который устанавливает UBound = 3 (4-1 = 3); Lbound=0 по умолчанию: там ставится минус, а не запятая :) - person Gene; 08.02.2021
comment
Это правильно, OP хочет, чтобы на выходе был одномерный массив. Одномерный массив с числами от значения в B3 до значения в C3, поэтому {1,2,3,4} в данном примере OP. так что sheetlist(0) = 1,sheetlist(1)=2,sheetlist(2)=3 и sheetlist(3)=4 - person Scott Craner; 08.02.2021
comment
Q: Я хотел бы, чтобы массив имел нижнюю границу 1 и верхнюю границу 4 с размером шага или интервалом 1. Итак, если SheetList = Array(1, 2, 3, 4), то Lbound(SheetList)=0. И что теперь...? - person Gene; 08.02.2021
comment
ОП говорил о значениях в массиве, а не об элементах массива, когда речь шла о нижних и верхних границах. - person Scott Craner; 08.02.2021
comment
Итак, я явно не понимаю терминов «нижняя граница» и «верхняя граница». НП, я могу жить с этим :) - person Gene; 08.02.2021

Если вы избавляетесь от версии MS 365, вы можете использовать новую Sequence() (которая по умолчанию будет отсчитываться от 1):

Sub CreateSequence365()
    Dim lo As Long: lo = ActiveSheet.Range("B3")    ' start of sequence
    Dim hi As Long: hi = ActiveSheet.Range("C3")    ' end   of sequence
    'create sequence via single code line
    Dim sheetlist: sheetlist = Application.Sequence(1, hi - lo + 1, lo, 1)
    'display results in VB Editor's immediate window
    Debug.Print "~~> " & Join(sheetlist, ","), _
          vbNewLine & "Boundaries: " & LBound(sheetlist) & " To " & UBound(sheetlist)
End Sub

Результат в непосредственном окне редактора VB:

~~> 1,2,3,4   
Boundaries: 1 To 4

Правка №1: Альтернативный подход в других версиях:

Sub CreateSequence()
    Dim lo As Long: lo = ActiveSheet.Range("B3")
    Dim hi As Long: hi = ActiveSheet.Range("C3")
    Dim sheetlist: sheetlist = Application.Transpose(Evaluate("row(" & lo & ":" & hi & ")"))
    Debug.Print "~~> " & Join(sheetlist, ","), _
          vbNewLine & "Boundaries: " & LBound(sheetlist) & " To " & UBound(sheetlist)
End Sub
person T.M.    schedule 05.02.2021
comment
Когда я пытаюсь выполнить цикл For Loop построчно, код всегда открывает последний рабочий лист в книге, независимо от имени листа. Это похоже на то, что он не прерывает нижнюю и верхнюю границу, а просто переходит к последнему листу. Я могу указать диапазон, скажем, LB= 18 UB=22, но код просто начинается с последнего листа в позиции в рабочей книге. Однако при использовании определенной функции массива, такой как sheetlist = Array(18, 19, 20, 21, 22), цикл работает нормально. Какие-либо предложения? - person Ross.P; 08.02.2021
comment
@Ross.P - В приведенном выше коде нет цикла For - в какой строке кода у вас возникают проблемы? - Конечно, вы можете полностью уточнить ссылки на диапазоны (например, Sheet1.Range("...") или ThisWorkbook.Worksheets("Sheet1")) вместо ссылки на ActiveSheet. - person T.M.; 08.02.2021
comment
Код зависает здесь Worksheets(sheetlist(X)).Activate Если я использую sheetlist = Array("18", "19", "20") проблем нет, но при попытке переключиться на Dim lo As Long: lo = ActiveSheet.Range("B3") и Dim hi As Long: hi = ActiveSheet.Range("C3") код зависает и не запускается с нижней границы - person Ross.P; 08.02.2021
comment
Я не знаю возникающего сообщения об ошибке, и приведенный код выходит далеко за рамки исходного сообщения. IMO, все ответы решили ваш запрос на создание определенной последовательности, поэтому вы можете задать новый вопрос с точным описанием вместе с некоторыми примерами данных. @Росс.П. - person T.M.; 08.02.2021