2014-01-30 2 views
1

Я пытаюсь удалить Строки имеют только количество «0», используя VBA, но код, который я использую, удаляет все, что имеет «0» в количестве. например, 600 будет удаляться, потому что у него есть «0»Excel Удаление строк с количеством только нулевым

Этот код приведен ниже.

Sub DeleteRows() 
    Dim c As Range 
    Dim SrchRng 

    Set SrchRng = ActiveSheet.Range("G1", ActiveSheet.Range("G65536").End(xlUp)) 
    Do 
     Set c = SrchRng.Find("0", LookIn:=x1Values) 
     If Not c Is Nothing Then c.EntireRow.Delete 
    Loop While Not c Is Nothing 
End Sub 
+0

Как @mehow, обнаруженный в моем ответе (который начинался с копирования/вставки из вашего кода), у вас есть 'x1Values' (номер 1) вместо' xlV alues' (буква L) в вашем 'LookIn: = x1Values'. Если вы не установите «Option Explicit», он спокойно установит новую переменную в значение, равное нулю. Не уверен, что это делает с командой поиска. Еще одна причина, по которой вам нужно «Option Explicit», чтобы поймать опечатки. – Floris

ответ

3

Изменить это:

Set c = SrchRng.Find("0", LookIn:=x1Values)

К этому (добавить LookAt аргумент и исправить опечатку в LookIn аргумента):

Set c = SrchRng.Find("0", LookIn:=xlValues, LookAt:=xlWhole)

Documentation for the Range.Find method, предоставляет некоторую информацию о дополнительных аргументах.

Однако, я считаю, что метод range.find дорог. Простая итерация может быть быстрее:

Sub DeleteRows() 
    Dim c As Range 
    Dim i as Long 
    Dim SrchRng 

    Set SrchRng = ActiveSheet.Range("G1", ActiveSheet.Range("G65536").End(xlUp)) 
    Application.ScreenUpdating = False 
    For i = SrchRng.Cells.Count to 1 Step -1 
     Set c = SrchRng.Cells(i) 
     If c.Value = "0" Then c.EntireRow.Delete 
    Next 
    Application.ScreenUpdating = True 
End Sub 
+0

Ah - избили меня до этого ... – Floris

+0

Его давая мне ошибку времени выполнения 9: Подстрочный код за пределами диапазона – Gabriel

+0

@Gabriel Я предполагаю, что вы пытаетесь использовать второй метод. Какая строка вызывает ошибку? –

1

Вы должны добавить опцию:

Set c = SrchRng.Find("0", LookIn:=xlValues, LookAt:=xlWhole) 

Чтобы посмотреть на «всю» клетку

+1

@mehow хороший catch на опечатке. ', это может случиться (и спокойно дать неправильный результат -' LookAt: = 0' ... Я понятия не имею, что это будет делать. – Floris

0

Если у вас есть большие наборы данных это быстро

Sub DeleteRows() 

Application.DisplayAlerts = False 

Dim ws As Excel.Worksheet 
Dim lCol As Long 
Dim lRow As Long 

Set ws = ThisWorkbook.Sheets("mySheetName") 

lCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column 
lRow = ws.Range("G" & ws.Rows.Count).End(xlUp).Row 

With ws 
    .AutoFilterMode = False 
    .Range("A1", Cells(lRow, lCol)).Cells.AutoFilter 
    .Range("A1", Cells(lRow, lCol)).Cells.AutoFilter Field:=7, Criteria1:="0" 
    .UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.Rows.Count - 1).Rows.Delete 
    .AutoFilterMode = False 
    .Range("A1").End(xlDown).Offset(1).Resize(ActiveSheet.UsedRange.Rows.Count).EntireRow.Delete 
End With 

Application.DisplayAlerts = True 

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