Последовательные числа в столбце с максимальным диапазоном Excel VBA - PullRequest
3 голосов
/ 28 мая 2020

Я совершенно новичок в VBA, и я пытался решить базовые c проблемы на практике. Я просто хочу заполнить столбец последовательными числами от 1 до N. Число N будет значением в указанной c ячейке.

Таким образом, значение N в ячейке C4, например, равно 5, и Я хочу выводить из B2 - BN = 1,2,3,4,5 У меня есть этот код, основанный на похожих вопросах и моих знаниях о циклах, но я не могу заставить его работать ...



Sub ejemplo()

Dim total() As Variant


maximo = Range("C4").Value

For i = 1 To maximo
total(i) = i
Next i

total = Application.WorksheetFunction.Transpose(total)
Range("B7:B").Value = total





End Sub

Иногда появляется ошибка "вне допустимого диапазона" в строке total (i) = i, я действительно не знаю, что происходит ...

Ответы [ 4 ]

5 голосов
/ 28 мая 2020

Массив в рабочий лист

  • Во всех трех случаях вместо For i = ... вы можете использовать:
    For i = LBound(total) To UBound(total).
  • Transpose ограничено максимумом 65536 элементов, поэтому изучите третье решение, которое его не использует.

Код

Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Purpose:      Writes the numbers from 1 to "maximo" to the column range
'               starting with cell "B7".
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 1D array (0-based, 'one-row')
Sub ejemplo1()

    Dim total() As Variant
    Dim maximo As Long
    Dim i As Long

    maximo = Range("C4").Value
    ReDim total(maximo - 1)

    For i = 0 To maximo - 1
        total(i) = i + 1
    Next i

    total = Application.Transpose(total)

    Range("B7").Resize(UBound(total)).Value = total

End Sub

' 1D array (1-based, 'one row')
Sub ejemplo2()

    Dim total() As Variant
    Dim maximo As Long
    Dim i As Long

    maximo = Range("C4").Value
    ReDim total(1 To maximo)

    For i = 1 To maximo
        total(i) = i
    Next i

    total = Application.Transpose(total)

    Range("B7").Resize(UBound(total)).Value = total

End Sub

' 2D array (1-based, 'one column')
Sub ejemplo3()

    Dim total() As Variant
    Dim maximo As Long
    Dim i As Long

    maximo = Range("C4").Value
    ReDim total(1 To maximo, 1 To 1)

    For i = 1 To maximo
        total(i, 1) = i
    Next i

    Range("B7").Resize(UBound(total)).Value = total

End Sub
4 голосов
/ 28 мая 2020

Довольно близко:

Sub ejemplo()
    Dim total As Variant
    maximo = Range("C4").Value
    ReDim total(1 To maximo) As Long

    For i = 1 To maximo
        total(i) = i
    Next i

    total = Application.WorksheetFunction.Transpose(total)
    Range("B7").Resize(maximo, 1).Value = total
End Sub

ПРИМЕЧАНИЕ:

  • оператор ReDim
  • оператор с Resize

enter image description here

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

Если вы используете Excel 365, то код можно сократить до одной строки :

Sub NoLoops()
    Range("B7").Formula2 = "=SEQUENCE(" & Range("C4").Value & ",1,1,1)"
End Sub
3 голосов
/ 28 мая 2020

Я всегда рекомендовал бы по крайней мере четко указывать на вашу Worksheet ссылку. Я бы использовал оператор With, использующий CodeName.

листа. Кроме того, я хотел бы добавить еще один ответ, который создает массив через Evaluate(). Хотя эта функция имеет ограничение в 255 символов, в этом упражнении это никогда не подвергнется риску. IMO) портит читаемость:

With Sheet1
    .Range("B7").Resize(.[C4]).Value = .Evaluate("ROW(1:" & .[C4] & ")")
End With
3 голосов
/ 28 мая 2020

Стандартный метод подсчета:

i = i + 1

При многократном вызове этой функции i подсчитывает. Применительно к вашей проблеме l oop For i = 1 To maximo будет подсчитывать количество циклов, но не дает начального i, числа, с которого нужно начинать. Следовательно, вам нужно следующее: -

Dim MyNumber As Integer
Dim i As Integer

MyNumber = 0
For i = 1 To maximo
    MyNumber = MyNumber + 1
Next i

Следующая задача - определить ячейки для записи. Это в основном тот же лог c. Вам нужна точка для начала, скажем, B2.

Dim StartCell As Range
Set StartCell = Range("B2")

И теперь вы можете собрать все вместе.

Dim Maximo As Integer
Dim StartCell As Range
Dim MyNumber As Integer
Dim i As Integer

Maximo = Range("C4").Value
MyNumber = 0
Set StartCell = Range("B2")
For i = 1 To maximo
    MyNumber = MyNumber + 1
    StartCell.Offset(0, i - 1).Value = MyNumber
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...