Как обновить лист из словаря VBA без проблем с производительностью? - PullRequest
0 голосов
/ 08 февраля 2019

У меня довольно большая электронная таблица (лист A) (400 тыс. Строк), все с уникальным идентификатором.

У меня ~ 150 тыс. Из них в другой электронной таблице (лист B), которой необходимо передать ее значения,Для этого я сохраняю каждый идентификатор в словаре и его значения для обновления в массиве по своему значению.Например,

dict.Add 'ID_01', Array('val1', 'val2', 'val3')

Затем, чтобы обновить, я запускаю лист A, и при каждом обнаружении этого идентификатора он обновляет ячейки.Для грубой идеи:

With sheet A
For i = 2 to lastrow:
    If dict.exists(.Cells(i, 1).value) Then
        .Cells(i, 2).Value = dict.Item(.Cells(i,1).Value)(0)
        .Cells(i, 3).Value = dict.Item(.Cells(i,1).Value)(1)
        .Cells(i, 4).Value = dict.Item(.Cells(i,1).Value)(2)
Next i    

Конец

Вышеприведенный пример является лишь ложным примером, но вы можете понять, почему это может занять много времени, часто более 10 минут.Узким местом является не добавление идентификаторов / значений в словарь из листа B, а их обновление обратно на листе A.

Мой вопрос: есть ли способ для меня, чтобы обновить эти значения гораздо быстрее, пока ещесохранить структуру моего словаря?

Любая помощь приветствуется, но было бы предпочтительно, если бы любые предложенные решения не отклонялись слишком далеко от общего подхода, который я изложил выше.

1 Ответ

0 голосов
/ 08 февраля 2019

Создайте и заполните 2-D массив в памяти, затем сбросьте массив обратно на лист.

'at this point the dictionary is already populated similar to
'dict.Add 'ID_01', Array('val1', 'val2', 'val3')

dim i as long, arr as variant

with sheet a

    arr = .range(.cells(2, "A"), .cells(.rows.count, "A").end(xlup)).value2
    redim preserve arr(lbound(arr, 1) to ubound(arr, 1), 1 to 4)
    'if sheet A already has values that only require updating,
    'then use this instead
    'arr = .range(.cells(2, "A"), .cells(.rows.count, "A").end(xlup).offset(0, 3)).value2

    for i=lbound(arr, 1) to ubound(arr, 1)
        If dict.exists(arr(i, 1)) Then
            arr(i, 2) = dict.Item(arr(i, 1))(0)
            arr(i, 3) = dict.Item(arr(i, 1))(1)
            arr(i, 4) = dict.Item(arr(i, 1))(2)
        end if
    next i

    .cells(2, "A").resize(ubound(arr, 1), ubound(arr, 2)) = arr

end with
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...