2015-02-28 2 views
1

Я хочу, чтобы выполнить эти функции в следующем порядке:
1. Активировать функцию автоматического фильтра
2. В колонке М, отметьте «депозит обратный» и «пустой»
3. Удалите целые строки для ячейки, содержащие «AQ *», «AI *», «BG» в столбце C. (ПРИМЕЧАНИЕ: * обозначает числа после алфавитов)Удаление строк, если ячейка содержит определенный текст

Я пробовал макросъемку с помощью Автофильтра, но только удалять строки до указанного диапазона (которые могут отличаться, если я использую другой набор данных). VBA согласно ниже.

Есть ли способ EASIER/BETTER для этого?

Цените свою помощь!

Sub Macro4() 
' 
' Macro4 Macro 
' 

' 
Rows("1:1").Select 
Application.CutCopyMode = False 
Selection.AutoFilter 
ActiveSheet.Range("$A$1:$N$46437").AutoFilter Field:=13, Criteria1:= _ 
    "=Deposit Reversed", Operator:=xlOr, Criteria2:="=" 
ActiveSheet.Range("$A$1:$N$46437").AutoFilter Field:=3, Criteria1:=Array(_ 
    "AQ", "AQ01E166N", "AQ01E294N", "AQ01E316N", "AQ01E373N"), Operator:= _ 
    xlFilterValues 
Rows("2:2").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Delete Shift:=xlUp 
ActiveSheet.Range("$A$1:$N$46017").AutoFilter Field:=3, Criteria1:=Array(_ 
    "AI", "AI04_MMRASHI_TWT", "AI04E230N", "AI04E269N", "AI04E323N"), Operator:= _ 
    xlFilterValues 
ActiveWindow.SmallScroll Down:=-6 
Rows("10236:10236").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Delete Shift:=xlUp 
ActiveSheet.Range("$A$1:$N$45998").AutoFilter Field:=3, Criteria1:=Array(_ 
    "BG", "BG01A004", "BG01H082", "BG01H106N"), Operator:=xlFilterValues 
ActiveWindow.SmallScroll Down:=-3 
Rows("5:5").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Delete Shift:=xlUp 

End Sub 
+0

, что это должны быть BG * или просто BG? – Jeeped

+0

BG (продолжение по номерам - следовательно, я использовал *). То же самое относится к другим критериям поиска – Siti

+0

@ Jeeped: Может быть, проще использовать формулу excel сначала в столбце A (т.е. = LEFT (C2,2). Если это так, то какой лучший VBA для всего процесса? Критерии поиска: AQ, AI, BG – Siti

ответ

1

Поместите критерии подстановочных фильтров в массив и пройдите через них. Вы не найдете более быстрый метод удаления строк, и он безопасен, если вы проверяете наличие строк для удаления перед их удалением.

Dim c As Long, vCRITC As Variant 
    vCRITC = Array("AQ*", "AI*", "BG*") 
    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 
    With Sheets("Sheet7").Cells(1, 1).CurrentRegion 
     If .AutoFilter Then .AutoFilter 
     With .Resize(.Rows.Count, Columns("A:N").Count) 
      .AutoFilter Field:=13, Criteria1:="=Deposit Reversed", Operator:=xlOr, Criteria2:="=" 
      For c = LBound(vCRITC) To UBound(vCRITC) 
       .AutoFilter Field:=3, Criteria1:=Chr(61) & vCRITC(c) 
       With .Offset(1, 0) 
        If CBool(Application.Subtotal(103, .Columns(3))) Then _ 
         .Rows.Delete 
       End With 
       .AutoFilter Field:=3 
      Next c 
     End With 
     .AutoFilter 
    End With 
    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 

Кажется, что была опечатка в вашем оригинальный вопрос, который не включал звездочка для BG. Это может иметь отношение к редактору композиции, используя звездочки, чтобы отметить курсив. Это сначала устанавливает критерии в столбце M, затем добавляет (и удаляет) каждый критерий подстановки в столбец C, удаляя строки, которые он находит.

+0

Вы были правы, я удалил свой ответ – BrakNicku

+0

Извините, опечатка. Показывает, что выполнение кода ошибки прервано - на 1-м «Конец С», когда я запускал макрос – Siti

+0

У вас, вероятно, нет * Sheet7 *. Я стараюсь держаться подальше от * ActiveSheet *, но должен был заметить, что вам нужно было изменить имя рабочего листа. – Jeeped

0

не требуется использовать автофильтр для таких целей

использование этого

Sub test() 
Dim i& 
i = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row 
With ActiveSheet 
    While i <> 1 
     If .Cells(i, "M").Value = "deposit reversed" Or .Cells(i, "M").Value = "" Then 
      If UCase(.Cells(i, "C").Value) Like "AQ*" Or _ 
       UCase(.Cells(i, "C").Value) Like "AI*" Or _ 
       UCase(.Cells(i, "C").Value) Like "BG*" Then 
       .Rows(i).Delete 
      End If 
     End If 
     i = i - 1 
    Wend 
End With 
End Sub 
+1

Это несколько каноническая практика для работы снизу вверх (или справа налево) при удалении строк или столбцов. Это позволяет избежать конфликтов, когда ячейка, в которой вы сейчас находитесь, и вы перемещаетесь в другую ячейку до циклов цикла. – Jeeped

+1

Из [Как удалить ячейки с помощью цикла «Для каждого ... Далее») (https://support.microsoft.com/kb/291300) - * «Когда Microsoft Excel удаляет строку 3, все ячейки перемещаются вверх Например, ячейка A3 принимает содержимое ячейки A4, ячейка A4 принимает содержимое ячейки A5 и т. д. После того, как для каждого ... Следующий цикл оценивает ячейку, он оценивает следующую ячейку, поэтому, когда ячейки сдвинуты, они могут быть пропущены по циклу ». * – Jeeped

+0

@jeeped thnks, отметил, сообщение обновлено – Vasily

Смежные вопросы