2015-04-20 5 views
2

Я пытаюсь удалить всю строку, если ячейка содержит слово с ошибкой. Если строка удалена, пропускается строка, поэтому отсутствуют любые слова с ошибками, которые могут возникать непосредственно за другим.Excel VBA Delete Row If Misspelled Word

Вот код:

Sub DeleteMispelledCells() 
For Each cl In ActiveSheet.UsedRange 
If Not Application.CheckSpelling(Word:=cl.Text) Then _ 
cl.EntireRow.Delete 
Next cl 
End Sub 

Я понимаю, что проблема заключается в сле не принимая во внимание, что текущая строка была удалена, но я не знаю, как это исправить. Я также знаю, что если цикл пробежал от последней строки до первой, а не от первой до последней, это также было бы исправлено. Однако я не знаю, как это сделать.

ответ

5

Для того, чтобы проходным каждой строки в обратном порядке вы будете делать что-то вроде этого:

Sub DeleteMispelledCells() 
    Dim lRow As Long, cl As Range 

    With ActiveSheet 
    For lRow = .UsedRange.Rows.Count To 1 Step -1 
     For Each cl In .Rows(lRow) 
     If Not IsEmpty(cl) Then 
      If Not Application.CheckSpelling(Word:=cl.Text) Then 
      cl.EntireRow.Delete 
      Exit For 
      End If 
     End If 
     Next cl 
    Next lRow 
    End With 
End Sub 

Я не 100% уверен, что я получил все права синтаксиса, так как я не на компьютер, на котором я могу проверить его, но он должен хотя бы дать вам возможность начать.

+2

'Для каждого cl In .Row (lRow)' должно быть 'Для каждого cl In .Rows (lRow)', и он отлично работает на моей машине. Разница заключается в '.Row' против' .Rows'. – Soulfire

+0

@JoshuaRoss Спасибо за тестирование, исправлено сейчас. – eirikdaude

+0

Нет проблем, я рассматривал только редактирование для вас, но вам нужно изменить более 1 символа^_^ – Soulfire

2

Это классический проблема в этом виде логики с логикой (на любом языке программирования). Если вы повторяете, скажем, 5 строк («# 1..5»), и вы удаляете первую строку, тогда ... теперь есть 4 строки, а то, что раньше было строкой № 2, теперь является строкой № 1 и то, что раньше было строкой № 3, теперь # 2. Итак, цикл переходит к «строке №2» и угадывает, что: вы просто пропустили «прежний ряд № 2», теперь в позиции №1.

Проникновение через список назад, как показано выше, является одним из хороших способов компенсации.

Другим путь, и один, что я лично предпочитаю, чтобы первой проходных пунктов, маркировки те, которые вы решили, что хотите удалить (например, установив флаг-значение в другой колонке). Затем в отдельном (обратном) цикле фактически удалите отмеченные элементы. Это значительно облегчит вам правильную настройку . Отладка логика, которая проверяет эти неверно настроенные wurds. ;-) Сначала решите, что вы хотите сделать, затем вернитесь и сделайте это.