Сохранить объект `.Range` полностью в памяти? - PullRequest
0 голосов
/ 15 ноября 2018

Есть ли способ сохранить объект .Range целиком в памяти?

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

Вот код, который у меня есть для хранения диапазонов в словаре:

Sub range_to_dict()

Application.EnableEvents = False

Dim d As New scripting.Dictionary
Dim rng As Range
Dim rw As Range
Dim paste_loc As Range

Set rng = Range("A1:B13")
Set paste_loc = rng.Offset(rng.Rows.Count + 2, 0).Resize(1, 1)

For Each rw In rng.Rows
    d.Add (rw.Cells(1).Value), rw
Next rw

For Each k In d.Keys
    d(k).Copy
    paste_loc.PasteSpecial xlPasteValues
    Set paste_loc = paste_loc.Offset(1, 0)
Next k

Application.EnableEvents = True

End Sub

Он выполнит эту работу, только если я этого не сделаюизмените диапазоны между созданием dict и распаковкой, потому что при распаковке VBA по-прежнему считывает диапазоны из листа, а не из памяти (словарь):

Sub range_to_dict()

Application.EnableEvents = False

Dim d As New scripting.Dictionary
Dim rng As Range
Dim rw As Range
Dim paste_loc As Range

Set rng = Range("A1:B13")
Set paste_loc = rng.Offset(rng.Rows.Count + 2, 0).Resize(1, 1)

For Each rw In rng.Rows
    d.Add (rw.Cells(1).Value), rw
Next rw

'modify (clear)
For Each rw In rng.Rows
    rw.Clear
Next rw

'now this will paste only empty fields
For Each k In d.Keys
    d(k).Copy
    paste_loc.PasteSpecial xlPasteValues
    Set paste_loc = paste_loc.Offset(1, 0)
Next k

Application.EnableEvents = True

End Sub

Я могу достичь того, что хочу, сохраняя значение каждой ячейки диапазонав массиве или коллекции, а затем распаковать их, но есть ли менее многословный способ?

1 Ответ

0 голосов
/ 15 ноября 2018

Невозможно сохранить Range в переменной (памяти).Это всегда просто ссылка на исходный диапазон, который хранится в переменной.

Но вы можете прочитать значения диапазона в массив:

Dim MyArr As Variant
MyArr = Range("A1:A10").Value

Если вы теперь измените свой диапазон A1: A10, массив все равно будет содержать старые значения.

И, конечно, вы можете записать их обратно в ячейки

Range("A1:A10").Value = MyArr

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

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