Переменная диапазона VBA исчезла после сокращения - PullRequest
0 голосов
/ 03 января 2019

424 ошибка. Кто-нибудь будет достаточно любезен, чтобы сказать мне, почему переменная диапазона пропала после вырезания?

with sheets(1)
Dim des as range
set des = .range("A15")
.range("A1:A3").cut des
msgbox(des.row+5)
end with

Ответы [ 2 ]

0 голосов
/ 03 января 2019

A Range объект хранит ссылку на определенные ячейки, а не на конкретный адрес.Когда указанные ячейки перемещаются, объект Range будет следовать.Например, если вы храните Range("B1") и затем вставляете столбец между A и B, ваша переменная теперь будет иметь Range("C1"), потому что ваши B1 сместились вправо.

Когда отслеживаемые ячейки перестаютсуществует, экземпляр Range становится непригодным для использования.

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

Примечательным исключением является случай, когда вы уничтожаете только часть Range.В этом случае Range принимает новые ячейки и сохраняет свою форму.Например, если вы сохранили Range("A15:A20") и обрезали Range("A1:A3") над A15, результирующий диапазон все равно будет A15:A20.

0 голосов
/ 03 января 2019

Похоже, что .paste очищает переменную диапазона по причине @GSerg.

Использование этого кода работает, но если вы прервете его в конце, переменная существует, пока не произойдет вставка.

With Sheets(1)
    Set des = .Range("A15")
    .Range("A1:A3").Cut
    des.Cells(1, 1).Select
    MsgBox (des.Row + 5)
    ActiveSheet.Paste
End With

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

Я проведу еще несколько исследований.Объект des все еще существует как range, но просто не заселен.

Этот метод также делает то, что вырезал бы

Dim src As Range
Dim des As Range

With Sheets(1)

    Set src = .Range("a1:a3")
    Set des = .Range("a15")
    des.Resize(src.Rows.Count, src.Columns.Count).Value = src.Value
    src.Clear

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