2016-09-21 3 views
1

Я пытаюсь очистить набор данных и заметил что-то странное с функцией vba. Entirerow.delete Следующий код, как и предполагалось, удалит всю строку, если она в формате strikethrough, но пропустят строки сразу после него, если они также находятся в этом формате. Кажется, что он берет строку, которая не находится в зачеркнутом формате, чтобы «сбросить» возможность удалять больше строк. Кто-нибудь знает, почему, или что я могу сделать, чтобы отладить это?«entirerow.delete» пропускает записи в For loop

For Each rng In rng1 
'Check each character in the cell 
    For i = 1 To Len(rng.Value) 
'If any letter is Strikethrough,delete entire column 
     If rng.Characters(i, 1).Font.Strikethrough = True Then 
      rng.Select 'just serves the purpose of observing which rows are being selected 
      rng.EntireRow.Delete 
     GoTo NextRng 
     End If 
    Next i 
NextRng: 
Next rng 

Я должен сказать, что я нашел обходной путь, используя другой подход, но это очень медленно:

'Delete cells that have the strikethrough format - works but is super slow! 
ws2.Range("B2").Activate 
Do Until ActiveCell.Value = "" 
    If ActiveCell.Font.Strikethrough = True Then 
     ActiveCell.EntireRow.Delete 
     Else: ActiveCell.Offset(1, 0).Activate 
    End If 
Loop 

Если у кого есть альтернативный способ решения этого вопроса, который также быстро, я 'также очень благодарен за ваш вклад.

+3

Loop назад, если вы удаляете строки. – Comintern

+1

Вы никогда не должны удалять строки в таком цикле. Используйте обратный контур. Поиск stackoverflow. Я ответил на сообщение до –

+0

см. Мой [сообщение] (http://stackoverflow.com/questions/19241905/vba-conditional-delete-loop-not-working). Вы также можете использовать объект диапазона для определения строк, которые вы хотите удалить. Это намного быстрее, чем удаление строк в цикле –

ответ

1

Благодаря всем вашим быстрым ответам я понял это. Особая благодарность @Siddarth разгромить за подталкивая меня к (чуть-чуть) быстрый метод на эту тему здесь: VBa conditional delete loop not working Вот рабочий код в случае, если кому-то интересно:

Dim delRange As Range 
Dim ws2 As Worksheet 
Dim i As Long 

'Find Lastrow in ws2 
LastRow2 = ws2.Cells.Find(What:="*", _ 
       After:=Range("A1"), _ 
       LookAt:=xlPart, _ 
       LookIn:=xlFormulas, _ 
       SearchOrder:=xlByRows, _ 
       SearchDirection:=xlPrevious, _ 
       MatchCase:=False).Row 
With ws2 
    For i = 1 To LastRow2 
     If .Cells(i, 2).Font.Strikethrough = True Then 
'This if statement adds all the identified rows to the range that will be deleted 
      If delRange Is Nothing Then 
       Set delRange = .Rows(i) 
      Else 
       Set delRange = Union(delRange, .Rows(i)) 
      End If 
     End If 
    Next i 

    If Not delRange Is Nothing Then delRange.Delete 
End With 
+0

++ Хорошая работа при достижении решения :) –

0

Найти конец вашего диапазона:

Dim wSheet As Worksheet : Set wSheet = ThisWorkbook.Worksheets("Sheetname") 
Dim lastRow 
' gets the last row in col 1, adjust as required 
lastRow = wSheet.Cells(wSheet.Rows.Count, 1).End(xlUp).Row 

Теперь выполнить цикл, в обратном направлении. Проблема, с которой вы сталкиваетесь, заключается в том, что при удалении строки данные перемещаются вверх (например: строка 56 удаляется, строка 57 становится равной 56). Решение состоит в том, чтобы удалить снизу вверх.

For myLoop = lastRow to 2 Step -1 ' or to 1 if you've no header row 
    Set myRange = wSheet.Range("A" & myLoop) 
    For mySubLoop = 1 To Len(myRange.Value) 
     'If any letter is strikethrough,delete entire row 
     If myRange.Characters(mySubLoop, 1).Font.Strikethrough = True Then 
      myRange.EntireRow.Delete 
      Exit For ' skip out of this inner loop and move to the next row 
     End If 
    Next 
Next 
+2

У вас есть опечатка в вашей петле. Он должен прочитать «Шаг -1». –

+0

@ThomasInzina Спасибо за уловку, очень ценим! – Dave

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