Страницы: 1
RSS
Запомнить адрес предыдущей активной ячейки
 
Всем привет. Уважаемые форумчане, подскажите, как корректно обработать событие вставки в лист данных (копируются с сайта) в определенные ячейки, чтобы после копирования они автоматически транспортировались в другое, определенное место листа. Пример файла приложил.

....Добавлю, не раскрыл суть. Пользователь может проводить и другие операции на листе. Событие не должно наступать, пока пользователь не вставит данные в строго определенный диапазон. При этом нужно запоминать адрес предыдущей активной ячейки - туда и будут транспортироваться данные.
Изменено: Laider - 03.04.2018 20:33:46
 
С одной частью что-то решил. Осталось понять как запомнить предыдущую активную ячейку. В лоб не работает.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
a = ActiveCell.Address
    If Target.Address = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row).Address Then
    
         Range(a).Resize(, 6).Value = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row)
         MsgBox Range(a).Address
    End If
    'a = Target.Address
End Sub
Изменено: Laider - 03.04.2018 20:31:07
 
Создать глобальную переменную и записывать адрес туда
 
Код
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
            Range(a).Resize(, 6).Value = Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row)
            MsgBox Range(a).Address
         End If
    End If
    a = Target.Address
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, спасибо, но не совсем то. Так определяется текущая выделенная ячейка,  а не предыдущая. И данные вставляются в тот же диапазон. Приведу пример, не с сайта, а с другой книги excel - я оттуда копирую данные и вставляю в текущую книгу, при этом активна ячейка A1. Для вставки я естественно активизирую ячейку Q1. Вот ее то и запоминает как предыдущую, а нужно чтобы помнил A1 и соответственно туда транспортировал то, что я вставлю в Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row)
 
Сообщение №3
 
Цитата
Laider написал:
Приведу пример, не с сайта
Ну а что же Вы хотите получать, если примеры приводите не из реальной ситуации?
У меня запоминается ячейка, которая последний раз(до текущего изменения) была изменена в этом листе. Это видно по коду - назначение значения идет уже ПОСЛЕ вставки и при следующей вставке в ней будет адрес ячейки, куда происходила вставка ДО этого.
Цитата
Laider написал:
при этом активна ячейка A1. Для вставки я естественно активизирую ячейку Q1
вообще ничего не понял. Вы сначала вставили данные в А1. Дальше что? Ну активизировали Q1, начали вставку - сработал код. Если вставка была в том же листе, то в переменной a будет адрес А1 на момент запуска кода.
Цитата
Laider написал:
и соответственно туда транспортировал то
Вы для начала логику всю поясните. Вам показали как запомнить - если Вы код непонятно какой привели, который с Вашими требованиями к нему расходится - мы как должны угадать что он должен делать?
Изменено: Дмитрий Щербаков - 04.04.2018 19:24:44
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Вот смотрим на код:
Код
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
Изменено: Дмитрий Щербаков - 04.04.2018 19:43:21
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий  - разжевали спасибо. Осталась проблема еще видимо в том что Range("Q1:Q" & Cells(Rows.Count, 17).End(xlUp).Row).Address запоминается раньше, чем туда производится вставка (в A1:F1 у меня вставилось то, что было в Q1)  и соотвественно End = 1, на не конечный End который получается после вставки. В какой строке поправить момент?
 
Цитата
Laider написал:
В какой строке поправить момент
Не знаю...Вы же не пишите что именно хотите вычислить, в какой момент, что там до этого...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Поменял в msgbox на Target.Address определен верно, Но в A1 траспортировался список единиц из Q1, на не 123456 из Q1:Q6 (скрин).
Дело очевидно не в этом а изменении направления массива с вертикального на горизонтальный.
Изменено: Laider - 04.04.2018 22:38:55
 
Цитата
Laider написал:
Но в A1 траспортировался список единиц из Q1
Да. Я об этом писал еще в посте #8(4 Апр 2018 19:33:02)
Если значения не длинные(не больше 255 символов) - то можно транспонировать встроенными средствами. Ну и последнюю ячейку тоже нет смысла тогда определять - Вы же всегда в 6 столбцов значения записываете...
Код
Range(a).Resize(, 6).Value = application.transpose(Range("Q1:Q6").Value)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Теперь все отлично. Спасибо!
Страницы: 1
Наверх