Добрый вечер уважаемые форумчане!!! Сложная для меня задача ((((( просто жесть. Сидел смотрел как эти макросы пишутся. Решил рискнуть а вдруг получится (после просмотренных видео уроков соответственно). Потому как понимаю МАКРОС это просто СУПЕРСКАЯ ВЕЩЬ и ее то-ж нужно знать хоть чуток как и эксель. Пожалуйста посмотрите мой файл. Я походу что то накосячил (((( потому как не пойму чет он не работает. Задумка из прошлых ГОРЯЧИХ ТЕМ My WebPage решил дополнить данный файл еще одним макросом УСЛОВИЕ: Если в столбце N4>4 и O4>4, то при активации макроса. Он должен найти в столбце D4:M4 самое наибольшее число и удалить, до тех пор пока в ячейке N4<=4. А также самое наименьшее число и удалять, до тех пор пока в ячейке O4<=4. Что я не так сделал???? [moder]Название темы должно отражать суть вопроса. Переименуйте. Исправлено[/moder]
Добрый вечер уважаемые форумчане!!! Сложная для меня задача ((((( просто жесть. Сидел смотрел как эти макросы пишутся. Решил рискнуть а вдруг получится (после просмотренных видео уроков соответственно). Потому как понимаю МАКРОС это просто СУПЕРСКАЯ ВЕЩЬ и ее то-ж нужно знать хоть чуток как и эксель. Пожалуйста посмотрите мой файл. Я походу что то накосячил (((( потому как не пойму чет он не работает. Задумка из прошлых ГОРЯЧИХ ТЕМ My WebPage решил дополнить данный файл еще одним макросом УСЛОВИЕ: Если в столбце N4>4 и O4>4, то при активации макроса. Он должен найти в столбце D4:M4 самое наибольшее число и удалить, до тех пор пока в ячейке N4<=4. А также самое наименьшее число и удалять, до тех пор пока в ячейке O4<=4. Что я не так сделал???? [moder]Название темы должно отражать суть вопроса. Переименуйте. Исправлено[/moder]lebensvoll
Модератор, если не занят помоги разобраться что я сделал не так. Макрос прописывал как показывают в видео уроках "Запись макроса". Но почему у меня не получилось то(((((
Модератор, если не занят помоги разобраться что я сделал не так. Макрос прописывал как показывают в видео уроках "Запись макроса". Но почему у меня не получилось то(((((lebensvoll
Да я вроде не так и сложную то взял. Тем более что включаешь запись макроса и начинаешь выполнять все те действия которые тебе нужны. Я вроде бы так и сделал. Попробовал лишь на на одной строке. Так я понял нужно попытаться этот макрос разбить (т.е переписать) на несколько макросов. Уж лучше пусть будет их несколько но за то правильно. ТАК!!!???
Да я вроде не так и сложную то взял. Тем более что включаешь запись макроса и начинаешь выполнять все те действия которые тебе нужны. Я вроде бы так и сделал. Попробовал лишь на на одной строке. Так я понял нужно попытаться этот макрос разбить (т.е переписать) на несколько макросов. Уж лучше пусть будет их несколько но за то правильно. ТАК!!!???lebensvoll
Ну и конечно, только видеоурока "маловато будет". Нужно будет какую нибудь книжечку полистать, для начала, там-же и примеры простые присмотреть. Простая запись макрорекордера - это полуфабрикат а не макрос. Так-же как обрезки курицы от котлеты по киевски, отличаются.
Ну и конечно, только видеоурока "маловато будет". Нужно будет какую нибудь книжечку полистать, для начала, там-же и примеры простые присмотреть. Простая запись макрорекордера - это полуфабрикат а не макрос. Так-же как обрезки курицы от котлеты по киевски, отличаются.al-Ex
Сообщение отредактировал al-Ex - Понедельник, 04.04.2016, 22:21
Public Sub check1() Dim rng1 As Range, unoCell As Range Dim maxV(1 To 3) As Long
With Worksheets("Лист1") If rng1 Is Nothing Then Set rng1 = .Range("D4:M4") i = .Range("N4").Value2 Do While (i > 4) For Each unoCell In rng1 If unoCell.Value >= maxV(1) Then maxV(1) = unoCell.Value maxV(2) = unoCell.Row maxV(3) = unoCell.Column End If Next .Cells(maxV(2), maxV(3)).Value = "" .Range("N4").Select Selection.Calculate i = .Range("N4").Value2 maxV(1) = 0 Loop i = .Range("O4").Value2 maxV(1) = 1000 Do While (i > 4) For Each unoCell In rng1 If unoCell.Value <= maxV(1) Then maxV(1) = unoCell.Value maxV(2) = unoCell.Row maxV(3) = unoCell.Column End If Next .Cells(maxV(2), maxV(3)).Value = "" .Range("O4").Select Selection.Calculate i = .Range("O4").Value2 maxV(1) = 1000 Loop End With End Sub
[/vba]
Если правильно понял задание [vba]
Код
Public Sub check1() Dim rng1 As Range, unoCell As Range Dim maxV(1 To 3) As Long
With Worksheets("Лист1") If rng1 Is Nothing Then Set rng1 = .Range("D4:M4") i = .Range("N4").Value2 Do While (i > 4) For Each unoCell In rng1 If unoCell.Value >= maxV(1) Then maxV(1) = unoCell.Value maxV(2) = unoCell.Row maxV(3) = unoCell.Column End If Next .Cells(maxV(2), maxV(3)).Value = "" .Range("N4").Select Selection.Calculate i = .Range("N4").Value2 maxV(1) = 0 Loop i = .Range("O4").Value2 maxV(1) = 1000 Do While (i > 4) For Each unoCell In rng1 If unoCell.Value <= maxV(1) Then maxV(1) = unoCell.Value maxV(2) = unoCell.Row maxV(3) = unoCell.Column End If Next .Cells(maxV(2), maxV(3)).Value = "" .Range("O4").Select Selection.Calculate i = .Range("O4").Value2 maxV(1) = 1000 Loop End With End Sub
Раз уж человек сам решил написать макрос, я не стал делать полностью решение за него. Вот в коде некий конструктор наскоро набросал: Две функции, Одна находит максимальное значение в диапазоне, другая минимальное. и две процедуры с их применением. Одна удаляет (однократно) максимальное значение из выделенного диапазона, другая минимальное. Это для начала. Вдруг пригодится.
[vba]
Код
Public Sub DeL_min_Find() 'Удаляет однократно минимальное значение из выделенного диапазона Dim ggg As Range Set ggg = Selection min_Find(ggg).Value = 0 End Sub
Public Sub DeL_max_Find() 'Удаляет однократно максимальное значение из выделенного диапазона Dim ggg As Range Set ggg = Selection max_Find(ggg).Value = 0 End Sub
Function max_Find(trg As Range) As Range 'находит максимальное значение в диапазоне "trg" On Error GoTo error0 Set max_Find = trg.Cells(1) Dim cl As Range For Each cl In trg If cl.Value > max_Find.Value Then Set max_Find = cl Next cl Exit Function error0: MsgBox "Error max_Find" End Function
Function min_Find(trg As Range) As Range 'находит мминимальное значение в диапазоне "trg" On Error GoTo error0 Set min_Find = max_Find(trg) Dim cl As Range For Each cl In trg If cl.Value > 0 Then If cl.Value < min_Find.Value Then Set min_Find = cl End If Next cl Exit Function error0: MsgBox "Error min_Find" End Function
[/vba]
Раз уж человек сам решил написать макрос, я не стал делать полностью решение за него. Вот в коде некий конструктор наскоро набросал: Две функции, Одна находит максимальное значение в диапазоне, другая минимальное. и две процедуры с их применением. Одна удаляет (однократно) максимальное значение из выделенного диапазона, другая минимальное. Это для начала. Вдруг пригодится.
[vba]
Код
Public Sub DeL_min_Find() 'Удаляет однократно минимальное значение из выделенного диапазона Dim ggg As Range Set ggg = Selection min_Find(ggg).Value = 0 End Sub
Public Sub DeL_max_Find() 'Удаляет однократно максимальное значение из выделенного диапазона Dim ggg As Range Set ggg = Selection max_Find(ggg).Value = 0 End Sub
Function max_Find(trg As Range) As Range 'находит максимальное значение в диапазоне "trg" On Error GoTo error0 Set max_Find = trg.Cells(1) Dim cl As Range For Each cl In trg If cl.Value > max_Find.Value Then Set max_Find = cl Next cl Exit Function error0: MsgBox "Error max_Find" End Function
Function min_Find(trg As Range) As Range 'находит мминимальное значение в диапазоне "trg" On Error GoTo error0 Set min_Find = max_Find(trg) Dim cl As Range For Each cl In trg If cl.Value > 0 Then If cl.Value < min_Find.Value Then Set min_Find = cl End If Next cl Exit Function error0: MsgBox "Error min_Find" End Function
Ну и я заморочился что-то. Специально писал попроще (но раза в 3-4 подлиннее) и с комментариями. [vba]
Код
Sub tt() Dim d_ As Range 'd - массив ячеек Application.ScreenUpdating = 0 'отключаем обновление экрана r1_ = Range("D" & Rows.Count).End(xlUp).Row 'последняя заполненная строка в столбце D r0_ = 4 'первая строка n_ = 10 'кол-во столбцов For i = r0_ To r1_ 'цикл по строкам Set d_ = Range("D" & i).Resize(, n_) 'говорим, что d будет n ячеек вправо от столбца D i-ой строки x1_ = 0 x2_ = 0 For j = 1 To n_ ' цикл от одного до n (больше, чем n ячеек удалить просто не получится) 'блок 1 If x1_ = 0 Then 'если x1_=0, то mx_ = WorksheetFunction.Max(d_) 'ищем максимум по d mn_ = WorksheetFunction.Min(d_) 'ищем минимум по d On Error Resume Next 'пропускаем ошибку (на случай, если все значения пусты или =0) av_ = WorksheetFunction.Average(d_) 'ищем среднее по d e1_ = Err.Number ' присваиваем e значение ошибки (для деления на 0 ошибка 1004, иначе - false) On Error GoTo 0 'убираем пропуск ошибок z1_ = (mx_ - av_ <= 4) + e1_ = 0 'mx_ - av_ <= 4 даст true или false и плюс e 'даст 0 тогда, когда уже не нужно удалять лишнее If z1_ Then ' если z1 не 0, то n1_ = WorksheetFunction.Match(mx_, d_, 0) 'ПОИСКПОЗом ищем позицию максимума в d Range("D" & i).Offset(, n1_ - 1).ClearContents 'стираем ее Else 'если z1 = 0, то x1_ = 1 'присваиваем х1 единицу If x2_ Then 'если при этом и х2 тоже единица, то Exit For 'выход из цикла End If End If End If 'блок 2 аналогично блоку 1 If x2_ = 0 Then mn_ = WorksheetFunction.Min(d_) On Error Resume Next av_ = WorksheetFunction.Average(d_) e2_ = Err.Number On Error GoTo 0 z2_ = (av_ - mn_ <= 4) + e2_ = 0 If z2_ Then n2_ = WorksheetFunction.Match(mn_, d_, 0) Range("D" & i).Offset(, n2_ - 1).ClearContents Else x2_ = 1 If x1_ Then Exit For End If End If End If Next j Next i End Sub
[/vba]
Ну и я заморочился что-то. Специально писал попроще (но раза в 3-4 подлиннее) и с комментариями. [vba]
Код
Sub tt() Dim d_ As Range 'd - массив ячеек Application.ScreenUpdating = 0 'отключаем обновление экрана r1_ = Range("D" & Rows.Count).End(xlUp).Row 'последняя заполненная строка в столбце D r0_ = 4 'первая строка n_ = 10 'кол-во столбцов For i = r0_ To r1_ 'цикл по строкам Set d_ = Range("D" & i).Resize(, n_) 'говорим, что d будет n ячеек вправо от столбца D i-ой строки x1_ = 0 x2_ = 0 For j = 1 To n_ ' цикл от одного до n (больше, чем n ячеек удалить просто не получится) 'блок 1 If x1_ = 0 Then 'если x1_=0, то mx_ = WorksheetFunction.Max(d_) 'ищем максимум по d mn_ = WorksheetFunction.Min(d_) 'ищем минимум по d On Error Resume Next 'пропускаем ошибку (на случай, если все значения пусты или =0) av_ = WorksheetFunction.Average(d_) 'ищем среднее по d e1_ = Err.Number ' присваиваем e значение ошибки (для деления на 0 ошибка 1004, иначе - false) On Error GoTo 0 'убираем пропуск ошибок z1_ = (mx_ - av_ <= 4) + e1_ = 0 'mx_ - av_ <= 4 даст true или false и плюс e 'даст 0 тогда, когда уже не нужно удалять лишнее If z1_ Then ' если z1 не 0, то n1_ = WorksheetFunction.Match(mx_, d_, 0) 'ПОИСКПОЗом ищем позицию максимума в d Range("D" & i).Offset(, n1_ - 1).ClearContents 'стираем ее Else 'если z1 = 0, то x1_ = 1 'присваиваем х1 единицу If x2_ Then 'если при этом и х2 тоже единица, то Exit For 'выход из цикла End If End If End If 'блок 2 аналогично блоку 1 If x2_ = 0 Then mn_ = WorksheetFunction.Min(d_) On Error Resume Next av_ = WorksheetFunction.Average(d_) e2_ = Err.Number On Error GoTo 0 z2_ = (av_ - mn_ <= 4) + e2_ = 0 If z2_ Then n2_ = WorksheetFunction.Match(mn_, d_, 0) Range("D" & i).Offset(, n2_ - 1).ClearContents Else x2_ = 1 If x1_ Then Exit For End If End If End If Next j Next i End Sub
Блин а я и так и этак (((( а вы уже и ответы выложили ))))) ну вы ПРОСТО ГЕНИИИ я только начал понимать. Сначала разбил на группы данный макрос. Понял как это делается (но напрямую прописывать ЭТО БЯДА, поэтому пользуюсь ЗАПИСЬ МАКРОСА - ПРИМИТИВ но сам!!!). И не смог завязать кнопку ((((( ну ни как. Затем задумался за удаление значения (((( это воообще прям мозги потекли ((((( уффффф. Еще раз ТЫСЯЧУ БЛАГОДАРНОСТЕЙ ВАМ. Но я буду стараться я вам обещаю. За книжки спасибо буду читать. И ЧЕ Я В ШКОЛЕ НЕ УЧИЛСЯ
Блин а я и так и этак (((( а вы уже и ответы выложили ))))) ну вы ПРОСТО ГЕНИИИ я только начал понимать. Сначала разбил на группы данный макрос. Понял как это делается (но напрямую прописывать ЭТО БЯДА, поэтому пользуюсь ЗАПИСЬ МАКРОСА - ПРИМИТИВ но сам!!!). И не смог завязать кнопку ((((( ну ни как. Затем задумался за удаление значения (((( это воообще прям мозги потекли ((((( уффффф. Еще раз ТЫСЯЧУ БЛАГОДАРНОСТЕЙ ВАМ. Но я буду стараться я вам обещаю. За книжки спасибо буду читать. И ЧЕ Я В ШКОЛЕ НЕ УЧИЛСЯ lebensvoll
Всем привет! У меня примерно такой же вопрос. Необходимо удалить максимальное и минимальное значения в столбце, в каждом диапазоне между определенными ячейками (или строками), содержащими слово Март. Заранее благодарен.
Всем привет! У меня примерно такой же вопрос. Необходимо удалить максимальное и минимальное значения в столбце, в каждом диапазоне между определенными ячейками (или строками), содержащими слово Март. Заранее благодарен.Russt