Я пытаюсь вставить значения массива в диапазон, но он вставляет в диапазон только первое значение.

Dim Array1()

For i = 0 to 9
   ReDim Preserve Array1
   Array1(i)= Int((6 * Rnd) + 1)
Next

ws.Range("A1").Value = Array1

Выход :

enter image description here

Я что-то делаю не так?

3
TourEiffel 26 Ноя 2021 в 13:23
Поскольку вы знаете размер (а) массива, вы должны объявить его как 2D-массив с соответствующими размерами и заполнить его в правильном измерении. ReDim Preserve часто используется - это своего рода стресс для памяти ...
 – 
FaneDuru
26 Ноя 2021 в 13:59
Привет, спасибо за отзывы. Мне пришлось использовать Resize, чтобы это заработало
 – 
TourEiffel
26 Ноя 2021 в 14:01
1
В любом случае необходимо использовать Resize ... Я отправлю ответ только для того, чтобы увидеть, что я не хочу предлагать.
 – 
FaneDuru
26 Ноя 2021 в 14:04

3 ответа

Лучший ответ

Вы должны правильно изменить размер массива, а затем транспонировать его.

Option Explicit

Sub Sample()
    Dim Array1()
    Dim ws As Worksheet
    Dim i As Long
    
    '~~> Change to respective sheet
    Set ws = Sheet1

    For i = 0 To 9
        ReDim Preserve Array1(i) '<~~ increment by i
        Array1(i) = Int((6 * Rnd) + 1)
    Next
    
    '~~> Store in the worksheet
    ws.Range("A1").Resize(UBound(Array1) + 1, 1).Value = Application.Transpose(Array1)
End Sub
3
Siddharth Rout 26 Ноя 2021 в 13:30
Спасибо, я видел это, но не работал, так как Transpose отсутствует в последней строке вашего кода
 – 
TourEiffel
26 Ноя 2021 в 13:37
Да, это потому, что в этой ссылке это 2D-массив. Попробуйте приведенный выше код. оно работает.
 – 
Siddharth Rout
26 Ноя 2021 в 13:39

Пожалуйста, попробуйте следующий способ, чтобы заполнить уже имеющий размеры 2D-массив, легко перетащив его содержимое в диапазон:

Sub fill2DArray()
  Dim Array1(1 To 10, 1 To 1), ws As Worksheet, i As Long
  Set ws = ActiveSheet
    For i = 0 To 9
       Array1(i + 1, 1) = Int((6 * Rnd) + 1)
    Next

 ws.Range("A1").Resize(UBound(Array1), UBound(Array1, 2)).value = Array1
End Sub

Следующая версия - это ваш исправленный код, но без использования Redim Preserve для каждой итерации:

Sub fill1DEfficient()
    Dim Array1(), i As Long, ws As Worksheet
    Set ws = ActiveSheet
    ReDim Array1(9)
    For i = 0 To 9
       Array1(i) = Int((6 * Rnd) + 1)
    Next
   ws.Range("A1").Resize(UBound(Array1) + 1, 1).value = Application.Transpose(Array1)
End Sub
1
FaneDuru 26 Ноя 2021 в 14:13
Тоже интересный трюк
 – 
TourEiffel
26 Ноя 2021 в 14:09
И ваш код может избежать Redim Preserve ... Использование Redim перед циклом. Я отредактирую ответ, чтобы показать его.
 – 
FaneDuru
26 Ноя 2021 в 14:12

Массив из одного столбца в диапазон из одного столбца

Option Explicit

Sub WriteArrayToOneColumnRange()
    
    Const rCount As Long = 10 ' Number of Elements (rows in this case)
    Const rndMin As Long = 1
    Const rndMax As Long = 6
    
    ' Define the 2D one-based one-column array.
    Dim Data As Variant: ReDim Data(1 To rCount, 1 To 1)
    
    Dim r As Long ' Element (Row) Counter
    
    ' Populate the array.
    For r = 1 To rCount
        Data(r, 1) = Int(((rndMax - rndMin + 1) * Rnd) + rndMin)
        'Debug.Print Data(r, 1)
    Next r
    
    ' Write the array values to a one-column range starting in 'A1'.
    Dim ws As Worksheet: Set ws = ActiveSheet ' be more specific
    ws.Range("A1").Resize(rCount).Value = Data

End Sub
0
VBasic2008 26 Ноя 2021 в 14:12