Страницы: 1
RSS
Перемещение строки на другой лист по условию, Помогите прикрутить макрос по переносу строк в списке задач по статусу "завершено"
 
Пол вечера искал решение, скачал кучу макросов, но вот прикрутить их к своему файлу увы не смог.
Необходимо при изменении статуса задачи на значение "завершено" при нажатии кнопки "удалить" перемещать строку (задачу) на лист "завершенные" в конец таблицы!
А при снятии статуса "завершено" на листе "завершенные" при нажатии кнопки "вернуть" перемещение строки обратно на лист "список задач".
Прошу при написании кода подробно описать логику работы макроса, что бы можно было использовать его в других проектах не очень опытными пользователями.
За ранее спасибо за помощь!
 
В прикрепленном файле есть решение выше поставленной задачи. Но перенести его в свой файл мне никак не удается.  :(  
Изменено: trainee - 29.03.2020 22:03:59
 
Цитата
trainee написал:
Необходимо при изменении статуса задачи на значение "завершено" при нажатии кнопки "удалить" перемещать строку (задачу) на лист "завершенные" в конец таблицы!
это сделал, обратно думаю сами сделаете.
 
Спасибо огромное! Но не могли бы вы подробно расписать смысл всех строк! Не могу сообразить как это работает!
Код
Sub delete() 'название макроса
    lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row
    If Sheets("Завершенные").Cells(4, 2) = "" Then
        lr = 4
    Else: lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row + 1
    End If
    For i = 4 To Cells(Rows.Count, 4).End(xlUp).Row
        If Cells(i, 4) = "Завершено" Then
           Range("B" & CStr(i) & ":J" & i).Copy Sheets("Завершенные").Range("B" & lr)
           Rows(i).delete
        End If
    Next
End Sub
Изменено: trainee - 29.03.2020 23:27:25 (по требованию модератора)
 
trainee,
Что-то я сомневаюсь в правильной работе макроса.
Цикл надо делать от последней строки до 4 с шагом -1
Код
For i =  Cells(Rows.Count, 4).End(xlUp).Row To 4 Step -1
 
trainee, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.
 
По одной строке перемещает отлично, но при множественном выборе на соседнем листе появляется только одна строка, а остальные просто исчезают  :(
Код
Sub Delete()
    lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row
    If Sheets("Завершенные").Cells(4, 2) = "" Then
        lr = 4
    Else: lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row + 1
    End If
    For i = Cells(Rows.Count, 4).End(xlUp).Row To 4 Step -1 'цикл от последней строки до четвертой с шагом -1
        If Cells(i, 4) = "Завершено" Then
           Range("B" & CStr(i) & ":J" & i).Copy Sheets("Завершенные").Range("B" & lr)
           Rows(i).Delete
        End If
    Next
End Sub
Изменено: trainee - 29.03.2020 23:28:16 (по требованию модератора)
 
trainee,
Вы копируете диапазон
Код
Range("B" & CStr(i) & ":J" & i).Copy 

в
Код
Sheets("Завершенные").Range("B" & lr)

при этом переменную lr не изменяете и у вас все копируется в одну строку
После удаления строки
Код
Rows(i).Delete

добавьте
Код
lr=lr + 1
 
Большое спасибо! Код поправил, и все заработало!
Последняя просьба, проверьте правильно ли я понял работу макроса и как работает копирование строки для меня по прежнему загадка.
Ещё раз спасибо, вы очень мне помогли!
Код
Sub Delete() 'удаляет завершенные задачи
    
    'присваивает переменной lr номер последней строки во втором (В) столбце на листе завершенные
    lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row
    'присваивает lr номер четвертой строки при условии что она пустая на листе завершенные
    If Sheets("Завершенные").Cells(4, 2) = "" Then
        lr = 4
    'присваивает lr номер первой пустой строки во втором (В) столбце при условии что 4 заполнена
    Else: lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row + 1
    End If
    'цикл от последней строки в четвертом столбце до четвертой с шагом -1
    For i = Cells(Rows.Count, 4).End(xlUp).Row To 4 Step -1
        'если в ячейках четвертого столбца значение "завершено", то
        If Cells(i, 4) = "Завершено" Then
           'как работает следующая строка?
           ' создает массив между В и J столбцами и как то копирует
           Range("B" & CStr(i) & ":J" & i).Copy Sheets("Завершенные").Range("B" & lr)
           'удаление строки i
           Rows(i).Delete
           'изменение номера строки на следующую
           lr = lr + 1
        End If
    Next
End Sub
Изменено: trainee - 30.03.2020 00:39:20
 
В целом с кодом разобрался, но не могу никак понять как работает эта строчка:
Код
           ' создает массив между В и J столбцами и как то копирует?
           Range("B" & CStr(i) & ":J" & i).Copy Sheets("Завершенные").Range("B" & lr)

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

За ранее всем откликнувшимся огромное спасибо!

 
Да, извиняюсь. Дело было вечером...не учел что может быть сразу несколько завершенных задач.
Данная строка копирует диапазон от B до J при этом строка которая будет скопирована зависит от значения переменной i. Указанный диапазон копируется на лист "Завершенные" в ячейку B & Lr, где Lr - следующая свободная ячейка
 
trainee, написал
Цитата
Расшифруйте пожалуйста синтаксис этой строчки,
Код
Range("B" & i & ":J" & i).Copy
   
Для i=4 это Range("B4:J4").Copy и этот диапазон копируется на лист Sheets("Завершенные")
Можно использовать конструкцию типа
Код
Range(Cells(i, "B"), Cells(i, "J")).Copy
 
Большое спасибо Андрею и Кузьмичу за участие в создании макросов.
Сам я бы не справился  :( !
Финальная версия макросов выглядит так, думаю она обязательно кому-нибудь пригодится:
Код
Sub Delete_1() 'Перенос строки на другой лист по условию (удаляет завершенные задачи)
Application.ScreenUpdating = False 'отключает автообновление экрана

'Присваивает переменной "lr" номер строки на листе "завершенные" куда будет перемещена строка
    
    'присваивает переменной lr номер последней строки во втором (В) столбце на листе завершенные
    lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row
    'присваивает lr номер четвертой строки при условии что она пустая на листе завершенные
    If Sheets("Завершенные").Cells(4, 2) = "" Then
        lr = 4
    'либо присваивает lr номер первой пустой строки во втором (В) столбце при условии что 4 заполнена
    Else: lr = Sheets("Завершенные").Cells(Rows.Count, 2).End(xlUp).Row + 1
    End If

'Проверяет ячейки заданного столбца на листе "список дел" на выполнение условия

    'цикл от последней строки в четвертом столбце до четвертой с шагом -1
    For i = Cells(Rows.Count, 4).End(xlUp).Row To 4 Step -1
        'если в ячейках четвертого столбца значение "завершено", то
        If Cells(i, 4) = "Завершено" Then
           ' создает диапазон между В и J столбцами в строке "i"
           ' диапазон копируется на лист заверешнные в ячейку "B & Lr", где Lr - следующая свободная ячейка
           Range(Cells(i, "B"), Cells(i, "J")).Copy Sheets("Завершенные").Range("B" & lr)
           'обращение к строке номер - i с последующим её удалением
           Rows(i).Delete
           'изменение номера строки листа "завершенные" на последующую пустую строчку
           lr = lr + 1
        End If
    Next
Application.ScreenUpdating = True 'включает автообновление экрана
End Sub

Sub Delete_2() 'Перенос строки на другой лист по условию (возвращает завершенные задачи)
Application.ScreenUpdating = False
    lr = Sheets("Список дел").Cells(Rows.Count, 2).End(xlUp).Row
    If Sheets("Список дел").Cells(4, 2) = "" Then
        lr = 4
    Else: lr = Sheets("Список дел").Cells(Rows.Count, 2).End(xlUp).Row + 1
    End If
    
    For i = Cells(Rows.Count, 4).End(xlUp).Row To 4 Step -1
        If Cells(i, 4) = "Планирование" Or Cells(i, 4) = "В ожидании" Or Cells(i, 4) = "В работе" Then
           Range(Cells(i, "B"), Cells(i, "J")).Copy Sheets("Список дел").Range("B" & lr)
           Rows(i).Delete
           lr = lr + 1
        End If
    Next
Application.ScreenUpdating = True
End Sub
Страницы: 1
Наверх