У меня есть 5 макросов. И нужно чтобы они по порядку включались: 1) Module5 2) Module6 3) Module7 4) Module8 5) Module1 6) Возврат к первому пункту, и так по кругу должен выполняться пока в листе с названием "Jabloki" столбец A не станет пустым. Как только столбец A стал пустым, код останавливается.
PS: Module1 - он удаляет последнюю строку в нескольких листах.
Здравствуйте, помогите пожалуйста.
Мне нужно чтобы по кругу выполнялся код.
У меня есть 5 макросов. И нужно чтобы они по порядку включались: 1) Module5 2) Module6 3) Module7 4) Module8 5) Module1 6) Возврат к первому пункту, и так по кругу должен выполняться пока в листе с названием "Jabloki" столбец A не станет пустым. Как только столбец A стал пустым, код останавливается.
PS: Module1 - он удаляет последнюю строку в нескольких листах.stalber
В качестве первого совета - пишите всё в одному модуле. Куча одноименных процедур в разных модулях - нонсенс!
Упакуйте повторяющуюся обработку в процедуру с параметрами и вызывайте ее из главной процедуры с разными исходными данными: [vba]
Код
Sub mainRun() io_param "jabloki", "A1:C3", 3 'из Module5 io_param "jabloki", "D1:F3", -3 'из Module6 io_param "jabloki", "G1:I3", 3 'из Module7 io_param "jabloki", "J1:L3", -3 'из Module8 End Sub
Sub io_param(ByVal sheetName As String, ByVal rangeAddr As String, ByVal colOffset As Integer) Dim cell As Range For Each cell In Worksheets(sheetName).Range(rangeAddr).Cells If cell = 1 Then cell.ClearContents cell.Offset(0, colOffset).ClearContents End If Next cell End Sub
[/vba] Поместите это всё в Module1 после имеющейся там процедуры DelStr и запускайте mainRun.
В остальном (с удалением строк, пока столбец A не очистится) логики пока не понимаю от слова "совсем". Но давайте по шагам делать. Освойте пока то, что написал. Дальше можно будет в mainRun добавлять нужные действия.
В качестве первого совета - пишите всё в одному модуле. Куча одноименных процедур в разных модулях - нонсенс!
Упакуйте повторяющуюся обработку в процедуру с параметрами и вызывайте ее из главной процедуры с разными исходными данными: [vba]
Код
Sub mainRun() io_param "jabloki", "A1:C3", 3 'из Module5 io_param "jabloki", "D1:F3", -3 'из Module6 io_param "jabloki", "G1:I3", 3 'из Module7 io_param "jabloki", "J1:L3", -3 'из Module8 End Sub
Sub io_param(ByVal sheetName As String, ByVal rangeAddr As String, ByVal colOffset As Integer) Dim cell As Range For Each cell In Worksheets(sheetName).Range(rangeAddr).Cells If cell = 1 Then cell.ClearContents cell.Offset(0, colOffset).ClearContents End If Next cell End Sub
[/vba] Поместите это всё в Module1 после имеющейся там процедуры DelStr и запускайте mainRun.
В остальном (с удалением строк, пока столбец A не очистится) логики пока не понимаю от слова "совсем". Но давайте по шагам делать. Освойте пока то, что написал. Дальше можно будет в mainRun добавлять нужные действия.Gustav
В остальном (с удалением строк, пока столбец A не очистится) логики пока не понимаю от слова "совсем"
дополнил файл 1) нужно запустить mainRun 2) затем запустить код который удаляет нижнюю строку в list1 list2 3) возврат к первому пункту, и так процедуру делать до тех пор пока List1 и List2 не станут полностью пустыми, как только они стали пустыми, код останавливается.
Цитата
В остальном (с удалением строк, пока столбец A не очистится) логики пока не понимаю от слова "совсем"
дополнил файл 1) нужно запустить mainRun 2) затем запустить код который удаляет нижнюю строку в list1 list2 3) возврат к первому пункту, и так процедуру делать до тех пор пока List1 и List2 не станут полностью пустыми, как только они стали пустыми, код останавливается.stalber
Ну, допустим, так (прямо как в шахматы играем ) - новая редакция mainRun: [vba]
Код
Sub mainRun() Dim iLastRow As Integer, i As Integer iLastRow = WorksheetFunction.Max(Sheets("list1").Cells(Rows.Count, 1).End(xlUp).Row, _ Sheets("list2").Cells(Rows.Count, 1).End(xlUp).Row) For i = iLastRow To 1 Step -1 io_param "jabloki", "A1:C3", 3 io_param "jabloki", "D1:F3", -3 io_param "jabloki", "G1:I3", 3 io_param "jabloki", "J1:L3", -3 'следующие две строки мягко заменяют удаление Sheets("list1").Rows(i).ClearContents Sheets("list2").Rows(i).ClearContents Next i End Sub
[/vba]
Ну, допустим, так (прямо как в шахматы играем ) - новая редакция mainRun: [vba]
Код
Sub mainRun() Dim iLastRow As Integer, i As Integer iLastRow = WorksheetFunction.Max(Sheets("list1").Cells(Rows.Count, 1).End(xlUp).Row, _ Sheets("list2").Cells(Rows.Count, 1).End(xlUp).Row) For i = iLastRow To 1 Step -1 io_param "jabloki", "A1:C3", 3 io_param "jabloki", "D1:F3", -3 io_param "jabloki", "G1:I3", 3 io_param "jabloki", "J1:L3", -3 'следующие две строки мягко заменяют удаление Sheets("list1").Rows(i).ClearContents Sheets("list2").Rows(i).ClearContents Next i End Sub
Ну, ёлки зелёные... Мы же проходили уже эту ситуацию борьбы с красными строками в редакторе кода после вставки несколько дней назад здесь. Напомню: надо удалить в красных строках (а может и не только в них) начальные отступы, т.е. клавишей Backspace удалить отступ до начала строки, а потом восстановить отступы клавишей Tab. Код совсем без отступов - моветон, его очень сложно читать. Возможно, в короткой программе (до 10 строк) совсем без отступов - это не так страшно, но лучше не привыкать.
И процедуру io_param зачем удалили-то? Я же сказал - новая редакция mainRun. Т.е. заменяем одну процедуру mainRun, остальные не трогаем. Т.е. надо было заменить содержимое только фрагмента между строкой Sub mainRun() и ближайшей ниже следующей строкой End Sub.
Ну, ёлки зелёные... Мы же проходили уже эту ситуацию борьбы с красными строками в редакторе кода после вставки несколько дней назад здесь. Напомню: надо удалить в красных строках (а может и не только в них) начальные отступы, т.е. клавишей Backspace удалить отступ до начала строки, а потом восстановить отступы клавишей Tab. Код совсем без отступов - моветон, его очень сложно читать. Возможно, в короткой программе (до 10 строк) совсем без отступов - это не так страшно, но лучше не привыкать.
И процедуру io_param зачем удалили-то? Я же сказал - новая редакция mainRun. Т.е. заменяем одну процедуру mainRun, остальные не трогаем. Т.е. надо было заменить содержимое только фрагмента между строкой Sub mainRun() и ближайшей ниже следующей строкой End Sub.Gustav