2015-06-12 2 views
0

Следующий код слишком сильно удаляет первый лист, а затем не зацикливается на втором листе? Ошибка, появляющаяся в инструкции .FindNext.Код не зацикливается через листы

Sub FindAndExecute3() 
Dim Loc As Range 
Dim sh As Worksheet 
For Each sh In ThisWorkbook.Worksheets 
    With sh.UsedRange 
     Set Loc = .Cells.Find(What:="AUTO.WHSE.") 
     If Not Loc Is Nothing Then 
      Do Until Loc Is Nothing 
      Rows(ActiveCell.Row & ":" & (ActiveCell.Row + 2)).Delete 
      Set Loc = .FindNext(Loc) 
      Loop 
     End If 
    End With 
    Set Loc = Nothing 
Next 
End Sub 
+1

Как мы можем знать, что не правильно, если вы не скажете, что бы вы хотели достичь с помощью своего кода? И можете ли вы предоставить текст ошибки? – moffeltje

ответ

0

Вы должны полностью квалифицировать ваш Range s. Эта проблема появляется один раз и снова (например, this).

Что это значит? Не используйте Cells, Range, Rows или Columns без указания, какой Worksheet они принадлежат, если вы специально не хотите, чтобы сделать это (и даже в этом случае явно с помощью ActiveSheet улучшает читаемость и уменьшает вероятность ошибок, схожую с использованием Option Explicit) , Например, заменить

Rows(ActiveCell.Row & ":" & (ActiveCell.Row + 2)).Delete 

с

sh.Rows(sh.<something>.Row & ":" & (sh.<something>.Row + 2)).Delete 

Я предполагаю, что Range будут удалены пролеты номера взяты из чего-то, связанного с sh.

Примечание 1: В этом случае, даже без квалификации Range, код продолжает выполнение, и ошибка может остаться незамеченной, так как она дает действительный результат. В других случаях, код не полностью квалифицированных Range с сгенерирует ошибку (например, с чем-то вроде sheet1.Range(Cells(..., когда sheet1 не ActiveSheet) **

Примечание 2:. Вы можете работать с ActiveCell только тогда, когда Worksheet, что он находится на ActiveSheet [MSDN].

+0

Вам также необходимо записать первый найденный адрес и проверить, когда вы вернетесь к нему, иначе цикл Do ... Loop будет продолжен. https://msdn.microsoft.com/en-us/library/office/ff839746.aspx –

+0

Благодарим всех вас за ваши вопросы и усилия. Я немного обновил код. Он перемещается по листам, но когда есть 2 экземпляра AUTO.WHSE, он действует только на первый. – user5003326

+0

Не знаете, как ввести этот код, извините, новый для стека. [код] Sub DeleteRows() Dim WS Как Worksheet On Error Resume Next Application.ScreenUpdating = False For Each WS В ActiveWorkbook.Worksheets ws.Activate Cells.Find (Что: = "AUTO.WHSE.", После того, как: = ActiveCell, Lookin: = _ xlFormulas, LookAt: = xlPart, SearchOrder: = xlByRows, SearchDirection: = _ xlNext, MatchCase: = False, SearchFormat: = False) .Activate Ряды (ActiveCell.Row & " : «& (ActiveCell.Row + 2)). Удалить Далее ws Application.ScreenUpdating = True End Sub [/ code] – user5003326

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