Вот смотрим на код:
Код |
---|
Range(a).Resize(, 6).Value = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row) |
что он должен сделать? Записать в диапазон А1:F1 данные из одного столбца Q? Уверены, что это нужная логика?
Плюс очевидно не хватает отключения отслеживания событий листа, иначе можно либо зациклить выполнение, либо естественным образом получить "не ту предыдущую ячейку" в итоге.
Попробуйте провести эксперимент. Вставьте в модуль листа код:
Код |
---|
Private Sub Worksheet_Change(ByVal Target As Range)
Static a As String
If Target.Address = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row).Address Then
If a <> "" Then
Application.EnableEvents = 0
Range(a).Resize(, 6).Value = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row).Value
Application.EnableEvents = 1
MsgBox Range(a).Address
End If
End If
a = Target.Address
End Sub |
выделите ячейку A1 и нажмите Enter. Теперь скопируйте что-то откуда-то и вставьте в столбец Q. Посмотрите - данные чудесным образом будут записаны в A1:F1(значение только ячейки Q1 - фиг знает как реально надо, это Ваш код с небольшой добавкой в виде Value, без которого будет работать не так, как Вы предполагали).
После этого появится сообщение с адресом А1. А потом переменной a будет назначен адрес последней измененной ячейки.
Что не так?
Если Вы хотите запомнить именно активную ячейку, которая была до вставки данных(событие SelectionChange) - то здесь все чуть сложнее. Ведь перед вставкой данных выделение тоже происходит. Теоретически, если привязаться к диапазону Q - наверное, хотелка-запоминалка может выглядеть так:
Код |
---|
Option Explicit
Dim a As String
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row).Address Then
If a <> "" Then
Application.EnableEvents = 0
Range(a).Resize(, 6).Value = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row).Value
Application.EnableEvents = 1
MsgBox Range(a).Address
End If
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("Q:Q")) Is Nothing Then
a = Target.Address
End If
End Sub |