Нужен макрос чтобы отфильтровать исходные данные. Количество строк непредсказуемо - может быть и 10,000. Некоторые строки имеют закрашенные ячейки. Каждая строка должна сверятся с диапазонами (диапазон задается каждый раз разный)
Цель фильтра 1. Удалить строки, где все ячейки одной строки попадают в указанные диапазоны 2. Удалить строки, где количество закрашенных ячеек 0,1 и 5.
Пример прилагается. В колонке F пояснения к каждой строке, которую надо удалить
Спасибо за помощь. Алина
Добрый день всем.
Нужен макрос чтобы отфильтровать исходные данные. Количество строк непредсказуемо - может быть и 10,000. Некоторые строки имеют закрашенные ячейки. Каждая строка должна сверятся с диапазонами (диапазон задается каждый раз разный)
Цель фильтра 1. Удалить строки, где все ячейки одной строки попадают в указанные диапазоны 2. Удалить строки, где количество закрашенных ячеек 0,1 и 5.
Пример прилагается. В колонке F пояснения к каждой строке, которую надо удалить
Sub Macro1() Dim arrData(), arrDiaps() Dim dic As Object Dim lngLastRow As Long Dim lngCount As Long Dim r As Long, c As Long, i As Long Application.ScreenUpdating = False lngLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 arrData = Range("A1:E" & lngLastRow).Value arrDiaps = Range("I3:J4").Value Set dic = CreateObject("Scripting.Dictionary") For r = UBound(arrData) To 1 Step -1 dic.RemoveAll For c = 1 To 5 For i = 1 To UBound(arrDiaps) If arrData(r, c) >= arrDiaps(i, 1) And arrData(r, c) <= arrDiaps(i, 2) Then If dic.Exists(i) = False Then dic.Add i, "" End If Exit For End If Next Next If dic.Count = 1 Then Rows(r).Delete Else lngCount = 0 For c = 1 To 5 If Cells(r, c).Interior.Color = 255 Then lngCount = lngCount + 1 End If Next Select Case lngCount Case 0, 1, 5 Rows(r).Delete End Select End If Next Application.ScreenUpdating = True End Sub
[/vba]
[vba]
Код
Sub Macro1() Dim arrData(), arrDiaps() Dim dic As Object Dim lngLastRow As Long Dim lngCount As Long Dim r As Long, c As Long, i As Long Application.ScreenUpdating = False lngLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 arrData = Range("A1:E" & lngLastRow).Value arrDiaps = Range("I3:J4").Value Set dic = CreateObject("Scripting.Dictionary") For r = UBound(arrData) To 1 Step -1 dic.RemoveAll For c = 1 To 5 For i = 1 To UBound(arrDiaps) If arrData(r, c) >= arrDiaps(i, 1) And arrData(r, c) <= arrDiaps(i, 2) Then If dic.Exists(i) = False Then dic.Add i, "" End If Exit For End If Next Next If dic.Count = 1 Then Rows(r).Delete Else lngCount = 0 For c = 1 To 5 If Cells(r, c).Interior.Color = 255 Then lngCount = lngCount + 1 End If Next Select Case lngCount Case 0, 1, 5 Rows(r).Delete End Select End If Next Application.ScreenUpdating = True End Sub
изменил макрос,чтобы удалялись строки не целиком макрос запускается кнопкой,которую вы сделали я переменные вернул обратно,т.к. я делал макрос под локальные переменные. у меня работает на этом файле(смотрите прикрепленный файл)
изменил макрос,чтобы удалялись строки не целиком макрос запускается кнопкой,которую вы сделали я переменные вернул обратно,т.к. я делал макрос под локальные переменные. у меня работает на этом файле(смотрите прикрепленный файл)Karataev
протестировала набор данных где удаляемых рядов оказалось намного больше чем тех что должны остаться. Результат -пустая таблица. Пример с датой прилагается. Всего рядов 799, должно остаться 85. Колонка F в фильтре не участвует. Это просто анализ строки (Y/N).
С Уважением, Алина
Уважаемый Karataev,
протестировала набор данных где удаляемых рядов оказалось намного больше чем тех что должны остаться. Результат -пустая таблица. Пример с датой прилагается. Всего рядов 799, должно остаться 85. Колонка F в фильтре не участвует. Это просто анализ строки (Y/N).
Дело не в колмчестве строк. Ячейка, закрашенная условным форматированием, и закрашенная ячейка, далеко не одно и то же. Для макроса Karataev в файле нет ни одной закрашенной ячейки.
Поигрался с фильтром. Дабы не усложнять, таблица должна иметь шапку. [vba]
Код
Sub Мяу() Dim arr, j&, i& Application.ScreenUpdating = False With ActiveSheet arr = [i3:j4].Value If .AutoFilterMode Then .AutoFilter.Range.AutoFilter .Range("A1:E1").AutoFilter
For j = 1 To UBound(arr) For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Criteria1:=">=" & arr(j, 1), _ Operator:=xlAnd, Criteria2:="<=" & arr(j, 2) Next .AutoFilter.Range.Offset(1).Delete Shift:=xlUp For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i Next Next For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Operator:=xlFilterNoFill Next .AutoFilter.Range.Offset(1).Delete Shift:=xlUp For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Criteria1:=RGB(255, 0 _ , 0), Operator:=xlFilterCellColor Next .AutoFilter.Range.Offset(1).Delete Shift:=xlUp For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i Next For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Operator:=xlFilterNoFill Next For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Criteria1:=RGB(255, 0 _ , 0), Operator:=xlFilterCellColor .AutoFilter.Range.Offset(1).Delete Shift:=xlUp .AutoFilter.Range.AutoFilter Field:=i, Operator:=xlFilterNoFill Next .AutoFilter.Range.AutoFilter End With End Sub
[/vba]
Дело не в колмчестве строк. Ячейка, закрашенная условным форматированием, и закрашенная ячейка, далеко не одно и то же. Для макроса Karataev в файле нет ни одной закрашенной ячейки.
Поигрался с фильтром. Дабы не усложнять, таблица должна иметь шапку. [vba]
Код
Sub Мяу() Dim arr, j&, i& Application.ScreenUpdating = False With ActiveSheet arr = [i3:j4].Value If .AutoFilterMode Then .AutoFilter.Range.AutoFilter .Range("A1:E1").AutoFilter
For j = 1 To UBound(arr) For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Criteria1:=">=" & arr(j, 1), _ Operator:=xlAnd, Criteria2:="<=" & arr(j, 2) Next .AutoFilter.Range.Offset(1).Delete Shift:=xlUp For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i Next Next For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Operator:=xlFilterNoFill Next .AutoFilter.Range.Offset(1).Delete Shift:=xlUp For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Criteria1:=RGB(255, 0 _ , 0), Operator:=xlFilterCellColor Next .AutoFilter.Range.Offset(1).Delete Shift:=xlUp For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i Next For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Operator:=xlFilterNoFill Next For i = 1 To 5 .AutoFilter.Range.AutoFilter Field:=i, Criteria1:=RGB(255, 0 _ , 0), Operator:=xlFilterCellColor .AutoFilter.Range.Offset(1).Delete Shift:=xlUp .AutoFilter.Range.AutoFilter Field:=i, Operator:=xlFilterNoFill Next .AutoFilter.Range.AutoFilter End With End Sub