VBA: запись массива в лист в блоке (один доступ к памяти) - PullRequest
0 голосов
/ 05 июля 2019

У меня есть большой массив (45000 элементов), который мне нужно записать в лист Excel. Однако это происходит слишком долго при циклическом переключении значений (запрос доступа к памяти для каждого значения)

(я уже отключил такие функции, как обновление экрана)

Я нашел несколько способов сделать это, используя тип Variant (французский: https://www.lecfomasque.com/vba-rediger-des-macros-plus-rapides/) Однако, в какой-то момент я, должно быть, все испортил, см. Пример кода

Sub test()
    Dim table(4) As Variant
    Dim writeArray() As Variant


    table(0) = 0
    table(1) = 1
    table(2) = 2
    table(3) = 3
    table(4) = 4

    writeArray = table

    'Supposed to write 0 to A1, 1 to A2,... but not working that way
    Range("A1:A5").Value = writeArray

End Sub

Этот код записывает только первое значение (0) во весь диапазон, даже если вариант writearray содержит также другие значения (1,2,3,4).

Любая идея (без запроса памяти для каждого значения) о том, как решить эту проблему, приветствуется, Спасибо ^ - ^

РЕДАКТИРОВАТЬ (РЕШЕНИЕ) -----------------------

Кажется, что решения Paul (transpose) и Mikku (2D-array) работают, и оба обеспечивают в десять раз сокращение времени выполнения в моем случае. Транспонирование в среднем немного быстрее.

Ответы [ 3 ]

1 голос
/ 05 июля 2019

На этом сайте Я нашел этот полезный маленький кусочек ...

Dim Destination As Range
Set Destination = Range("K1")
Destination.Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr

Вы можете транспонировать массив при записи на лист:

Set Destination = Range("K1")
Destination.Resize(UBound(Arr, 2), UBound(Arr, 1)).Value = Application.Transpose(Arr)
0 голосов
/ 05 июля 2019

Основная проблема заключается в том, что массив 1D соответствует строке на листе. Таким образом, вы можете поставить

Range("A1:E1") = table

и работает нормально.

Если вы хотите поместить свой массив в столбец, самый простой способ - использовать transpose, как упомянуто @Paul:

writeArray = Application.WorksheetFunction.Transpose(table)

, который дает двумерный массив с пятью строками и 1 столбцом.

Sub test2()
    Dim table(0 To 4) As Variant
    Dim writeArray() As Variant


    table(0) = 0
    table(1) = 1
    table(2) = 2
    table(3) = 3
    table(4) = 4

    writeArray = Application.WorksheetFunction.Transpose(table)

    Debug.Print ("ubound=" & UBound(writeArray, 1))
    Debug.Print ("ubound=" & UBound(writeArray, 2))

    Range("A1:A5") = writeArray
    Range("A1:E1") = table
End Sub

enter image description here

0 голосов
/ 05 июля 2019

Ну, 2-D массив может сделать это

Sub test()

    Dim table(0 To 4, 1 To 1) As Variant

    table(0, 1) = 0
    table(1, 1) = 1
    table(2, 1) = 2
    table(3, 1) = 3
    table(4, 1) = 4


    Range("A1:A5") = table


End Sub
...