При использовании Worksheet_Change – как я могу получить значение в ячейке перед изменением?

В моем листе Excel у меня есть диапазон «сюжет», который вызывает подпрограмму при изменении. Для этого я использовал следующий код:

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("plot").Address Then auto_save_data (current_plot) ' <- doesn't work restore_data End If End Sub 

Этот код должен сначала сохранить данные с текущего листа в определенный диапазон, определенный current_plot в другом листе (назовем его «DATA»), вызвав auto_save_data (current_plot) .
Затем он восстанавливает данные из определенного диапазона в «DATA», который определяется Range("plot") , вызывая restore_data .

restore_data выше работает так, как ожидалось, но auto_save_data не работает. Проблема в том, что когда пользователь меняет значение «plot», мне нужно как-то узнать, что было значением перед изменением, поэтому я могу сохранить данные в нужном месте до восстановления данных из «DATA» для значения после обновления , и тем самым удаляя данные в текущем листе.

Я попытался использовать событие Worksheet_SelectionChange , как описано здесь :

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim current_plot As Variant If Target.Address = Range("plot").Address Then current_plot = Target.Value End If End Sub 

Но у него есть две проблемы:

  1. Это не сработало. Подпрограмма Worksheet_Change , похоже, не признавала значение переменной current_plot , хотя она не выдавала ошибку.
  2. Я попробовал другой метод из вышеперечисленного вопроса , который сохранил старое значение на скрытом листе. Это сработало, за исключением случаев, когда пользователь меняет значение в «plot», не выбирая сначала другой диапазон (тогда значение в скрытом листе не обновляется).

Поэтому мой вопрос: какой самый простой метод (я очень новичок в VBA), чтобы использовать значение, которое было в Target до того, как была Worksheet_Change рутина Worksheet_Change ?

EDIT: я изменил «график» на один диапазон ячеек ($ P $ 2), чтобы сфокусировать вопрос на реальной проблеме.

Предполагая, что «Сюжет» является диапазоном с одной ячейкой на листе, который имеет Name «ДАННЫЕ», поместите следующий код в модуль кода рабочих Worksheets("DATA") :

 'Declare a variable with global scope, ie accessible in this worksheet 'and in other code modules. Public current_plot As Variant Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("plot").Address Then 'Use "current_plot" whenever the cell is changed MsgBox "Old value: " & current_plot & vbCrLf & _ "New value: " & Target.Value End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = Range("plot").Address Then 'Update "current_plot" whenever the cell is selected current_plot = Target.Value End If End Sub 

и поместите этот код в модуль кода ThisWorkbook :

 Private Sub Workbook_Open() 'Initialise "current_plot" when the workbook is opened Worksheets("DATA").current_plot = Worksheets("DATA").Range("Plot").Value End Sub 

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

 'Declare a variable with global scope, ie accessible in this worksheet 'and in other code modules. Public current_plot As Variant Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("plot").Address Then 'Use "current_plot" whenever the cell is changed MsgBox "Old value: " & current_plot & vbCrLf & _ "New value: " & Target.Value '... '... process whatever needs to be processed '... 'Save the value we used this time current_plot = Target.Value End If End Sub 

и поместите этот код в модуль кода ThisWorkbook :

 Private Sub Workbook_Open() 'Initialise "current_plot" when the workbook is opened Worksheets("DATA").current_plot = Worksheets("DATA").Range("Plot").Value End Sub 
Interesting Posts

Скопировать URL из браузера в Excel

Правильно сохранить ссылку в памяти вместо активации

Удалите несколько строк с нулевыми значениями в фрейме данных, используя python

Нужен обработчик ошибок или обходной путь – ошибка VBA 1004: невозможно получить свойство PivotItems класса PivotField

Данные Excel 2010 -> «Обновить все» медленно

Почему INDIRECT отображает только значение первой ячейки в диапазоне?

Предложить ячейки для чтения строки заголовка таблицы

Excel: копирование данных на отдельном листе

Для перехода требуется около 3 минут, но работающий макрос занимает около 15 минут

Создание отдельных строк с использованием значения ячейки в столбце

Проблема постоянного переформатирования объекта SQL Server Datetime в Excel

Python excel Строки разных строк

Проблемы с выбором PivotItems в vba

Как выбрать дубликаты ячеек на одной и той же строке

Как я могу заменить автоматически генерируемые великие общие значения на разные (Aspose Cells)?

Давайте будем гением компьютера.