Привет, народ. Была "умная таблица", где при создании новой строки формулы прекрасно переносились на новую строчку. Стал необходим общий доступ к документу, умные таблицы использовать нельзя. А формулы руками каждый раз протягивать неудобно. В прищепке вырезанный кусок, добавляю данные в 15 строку, а то что там протянуто, хотелось бы чтобы протягивалось автоматом только на новые строки. Поиск по форуму не дал результата. Сможет кто помочь?
Привет, народ. Была "умная таблица", где при создании новой строки формулы прекрасно переносились на новую строчку. Стал необходим общий доступ к документу, умные таблицы использовать нельзя. А формулы руками каждый раз протягивать неудобно. В прищепке вырезанный кусок, добавляю данные в 15 строку, а то что там протянуто, хотелось бы чтобы протягивалось автоматом только на новые строки. Поиск по форуму не дал результата. Сможет кто помочь?ЮрийБ
sboy, такой вариант я знаю, к сожалению, он не избавляет от протягивания как такового, лишь визуально скрывает лишние строки. В любом случае спасибо за ответ. Интересен именно вариант с автоматическим копированием с предыдущей строки.
sboy, такой вариант я знаю, к сожалению, он не избавляет от протягивания как такового, лишь визуально скрывает лишние строки. В любом случае спасибо за ответ. Интересен именно вариант с автоматическим копированием с предыдущей строки.ЮрийБ
[/vba], встаешь мышой после точки в первой строке и, держа мышу нажатой, тянешь на другую строку до послеточки. Вот так Range(Cells(dat_ - 2, 1), Cells(dat_ - 2, 6)).Select Selection.Copy И жмешь на делит. Получается вот так[vba]
[/vba], а потом делаешь проверку с выходом из макроса[vba]
Код
If Not Intersect(Target, Range("G" & dat_)) Is Nothing Then Exit Sub
[/vba]. Если проверку не прошли, то кто будет включать EnableEvents обратно? Как раз вот здесь в коде ошибка. Остальное так, не критично
5. Когда определяешь dat_, то ты прибавляешь единицу[vba]
Код
dat_ = Cells(Rows.Count, 7).End(xlUp).Row + 1
[/vba], а ниже везде в коде у тебя dat_ - 2 и dat_ - 1 Если единицу не прибавлять, то dat_ - 2 станет dat_ - 1, а dat_ - 1 станет dat_. Более того, копировать формулы можно не из строки выше, а из второй строки, тогда dat_ - 2 (которая стала dat_ - 1) вообще не нужна
6. Проверку на то, что изменяемая ячейка одна, можно не делать (а можно и сделать). А вот проверку на то, что изменяемая ячейка не пустая, можно. Кстати, заодно можно и проверку на дату сделать. Можно написать очень похожий код, но для множественного ввода в столбец G, но это уже в другой раз
В итоге получаем что-то типа
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim dat_&, t_ As Range dat_ = Cells(Rows.Count, 7).End(xlUp).Row Set t_ = Intersect(Target, Range("G" & dat_)) If t_ Is Nothing Then Exit Sub If IsDate(t_) Then Application.EnableEvents = False Cells(dat_ - 1, 1).Resize(1, 6).Copy Cells(dat_, 1) Range("Y" & dat_ - 1).Copy Range("Y" & dat_) Application.EnableEvents = True End If End Sub
[/vba], встаешь мышой после точки в первой строке и, держа мышу нажатой, тянешь на другую строку до послеточки. Вот так Range(Cells(dat_ - 2, 1), Cells(dat_ - 2, 6)).Select Selection.Copy И жмешь на делит. Получается вот так[vba]
[/vba], а потом делаешь проверку с выходом из макроса[vba]
Код
If Not Intersect(Target, Range("G" & dat_)) Is Nothing Then Exit Sub
[/vba]. Если проверку не прошли, то кто будет включать EnableEvents обратно? Как раз вот здесь в коде ошибка. Остальное так, не критично
5. Когда определяешь dat_, то ты прибавляешь единицу[vba]
Код
dat_ = Cells(Rows.Count, 7).End(xlUp).Row + 1
[/vba], а ниже везде в коде у тебя dat_ - 2 и dat_ - 1 Если единицу не прибавлять, то dat_ - 2 станет dat_ - 1, а dat_ - 1 станет dat_. Более того, копировать формулы можно не из строки выше, а из второй строки, тогда dat_ - 2 (которая стала dat_ - 1) вообще не нужна
6. Проверку на то, что изменяемая ячейка одна, можно не делать (а можно и сделать). А вот проверку на то, что изменяемая ячейка не пустая, можно. Кстати, заодно можно и проверку на дату сделать. Можно написать очень похожий код, но для множественного ввода в столбец G, но это уже в другой раз
В итоге получаем что-то типа
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim dat_&, t_ As Range dat_ = Cells(Rows.Count, 7).End(xlUp).Row Set t_ = Intersect(Target, Range("G" & dat_)) If t_ Is Nothing Then Exit Sub If IsDate(t_) Then Application.EnableEvents = False Cells(dat_ - 1, 1).Resize(1, 6).Copy Cells(dat_, 1) Range("Y" & dat_ - 1).Copy Range("Y" & dat_) Application.EnableEvents = True End If End Sub
после проработки комментариев _Boroda_, за что ему отдельное огромное спасибо получилось вот что [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim dat_& dat_ = Cells(Rows.Count, 7).End(xlUp).Row + 1 Application.EnableEvents = False If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("G" & dat_)) Is Nothing Then Exit Sub Range(Cells(dat_ - 2, 1), Cells(dat_ - 2, 6)).Copy Range(Cells(dat_ - 1, 1), Cells(dat_ - 1, 6))
Range("Y" & dat_ - 2).Copy Range("Y" & dat_ - 1)
Application.EnableEvents = True End Sub
[/vba] [offtop]и ведь, что удивительно, РАБОТАЕТ!!!!!!!!
после проработки комментариев _Boroda_, за что ему отдельное огромное спасибо получилось вот что [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim dat_& dat_ = Cells(Rows.Count, 7).End(xlUp).Row + 1 Application.EnableEvents = False If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("G" & dat_)) Is Nothing Then Exit Sub Range(Cells(dat_ - 2, 1), Cells(dat_ - 2, 6)).Copy Range(Cells(dat_ - 1, 1), Cells(dat_ - 1, 6))
Range("Y" & dat_ - 2).Copy Range("Y" & dat_ - 1)
Application.EnableEvents = True End Sub
[/vba] [offtop]и ведь, что удивительно, РАБОТАЕТ!!!!!!!!китин
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
Сообщение отредактировал китин - Среда, 01.03.2017, 11:11
Игорь, еще раз внимательно перечитай п.4 - это важно и п.5 - это не очень важно, но зачем делать лишние вычисления в коде? Конкретно здесь это почти никакой разницы не даст, а если все это в огромном цикле будет? п.3 - кому как нравится, но с Ресайзом феншуйнее, да и обращений к листу меньше, что тоже на времени выполнения в больших циклах может сказаться
Игорь, еще раз внимательно перечитай п.4 - это важно и п.5 - это не очень важно, но зачем делать лишние вычисления в коде? Конкретно здесь это почти никакой разницы не даст, а если все это в огромном цикле будет? п.3 - кому как нравится, но с Ресайзом феншуйнее, да и обращений к листу меньше, что тоже на времени выполнения в больших циклах может сказаться_Boroda_
мне же надо отследить изменения в первой незаполненной ячейке
Чей-то вдруг? Ты ж ее только что заполнил датой. Тебе нужна последняя заполненная строка
[vba]
Код
Application.EnableEvents = False
[/vba]нужно ставить так, чтобы между ним и [vba]
Код
Application.EnableEvents = False
[/vba]были только те строки, где при изменении в коде макрос лишний раз пытается вывалиться в обработчик событий. Иногда этим пренебрегают (типа, у нас будет два лишних перепрыгивания в обработчик, ну и хрен с ними) , но лучше так не делать. И уж точно ставим после последнего принудительного выхода из макроса. Или делаем обработчик такого выхода с включением EnableEvents
мне же надо отследить изменения в первой незаполненной ячейке
Чей-то вдруг? Ты ж ее только что заполнил датой. Тебе нужна последняя заполненная строка
[vba]
Код
Application.EnableEvents = False
[/vba]нужно ставить так, чтобы между ним и [vba]
Код
Application.EnableEvents = False
[/vba]были только те строки, где при изменении в коде макрос лишний раз пытается вывалиться в обработчик событий. Иногда этим пренебрегают (типа, у нас будет два лишних перепрыгивания в обработчик, ну и хрен с ними) , но лучше так не делать. И уж точно ставим после последнего принудительного выхода из макроса. Или делаем обработчик такого выхода с включением EnableEvents_Boroda_
ведь отслеживать изменения именно в первой пустой ячейке
Нет. Target - это тот диапазон, в котором ты УЖЕ что-то сделал (в нашем случае вставил дату). Он не пустой, там уже дата, которую ты только что ввел.
А то, что "работать не хочет" - предположу, что ты внизу в коде так и оставил -2 и -1. А я про что писал? Что -2 становится -1, а -1 становится нулем Вот это [vba]
ведь отслеживать изменения именно в первой пустой ячейке
Нет. Target - это тот диапазон, в котором ты УЖЕ что-то сделал (в нашем случае вставил дату). Он не пустой, там уже дата, которую ты только что ввел.
А то, что "работать не хочет" - предположу, что ты внизу в коде так и оставил -2 и -1. А я про что писал? Что -2 становится -1, а -1 становится нулем Вот это [vba]