Изменения переменной диапазона во время Worksheet_change, и я не знаю, как

У меня странная проблема, к счастью, у меня почти нет другого кода, поэтому я могу сузить его до источника. Мою проблему легче прочитать из кода, чем из моего описания, но я все равно попробую: -Я пытаюсь запомнить диапазон, который вырезан в моей книге, чтобы позже включить «Отменить» -Я нашел отличную функцию, которая сообщает мне диапазон вырезанных ячеек (возвращается как "GetCopiedRange", функция тоже названа так же) -Функция работает и возвращает правильное значение, но позже в Worksheet_Change диапазон внезапно изменится, и ничто не даст ему новое значение

TL; DR: как CutRange.Address в следующем коде может отличаться, когда я выбираю диапазон и после, когда я изменяю значение в диапазоне?

Dim CutRange As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = xlCut Then
    Call GetCopiedRange 'This function changes value of variable "GetCopiedRange" (Range) to the range that is cut to clipboard
    Set CutRange = GetCopiedRange 'Save the range under a new variable because if I refer straight to GetCopiedRange later, it doesn't work
    MsgBox ("Cut range: " & CutRange.Address)
End If
'This sub works perfectly. If a range is cut to clipboard, Msgbox tells the range correctly
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If Not CutRange Is Nothing Then
    MsgBox CutRange.Address
End If
'This sub works incorrectly(!?) CutRange.address is somehow now the destination of paste instead of where it was cut. How did it change in between?
'Even though when cut-paste operation is carried out, change occurs twice: first to the cut range and then the paste range. Even during the first one, CutRange.Address is somehow already changed to the paste range address
End Sub

РЕДАКТИРОВАТЬ: Я не вижу, как содержимое указанной функции может повлиять на этот результат, я надеюсь, что нам не нужно туда идти, поскольку это скопированная функция намного сложнее, чем я могу понять. Однако, когда я попытался удалить CutRange из всего этого и сразу обратиться к GetCopiedRange в Worksheet_Change, я получил ошибку «не удалось получить данные из буфера обмена», что является сообщением об ошибке внутри функции. Однако, поскольку я использую переменную CutRange, я не вижу, как это можно изменить


person Jupsu    schedule 12.06.2020    source источник


Ответы (2)


Думаю, я нашел ответ на свой вопрос и показал себя новичком или идиотом.

Исправление: когда я сделал строку вместо диапазона для отслеживания диапазона вырезания, значение остается таким, как должно. Поправьте меня, если я ошибаюсь, но кажется, что когда вы УСТАНАВЛИВАЕТ ДИАПАЗОН, чтобы соответствовать другому диапазону, первый автоматически изменится с последним.

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

person Jupsu    schedule 12.06.2020

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

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

Когда вы ссылаетесь на что-то по ссылке, вы просто указываете на этот объект. Следовательно, если что-то изменит значение этого объекта, то все ссылки на этот объект увидят новое значение.

Имеет ли это смысл?

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

Макрос Excel VBA: копирование ячеек по ссылке

Назначение Excel VBA по значению или по ссылке?

person Phil Brown    schedule 22.09.2020