В вашем нынешнем виде ваш цикл бесполезен.Вы можете сделать это с точно таким же результатом: Set rng = Worksheets(4).Cells.Find(What:=TelNo, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
Попробуйте:
Function checkDuplicate(ByVal ChangedCell As Range) As Boolean
TelNo = ChangedCell.Value
Range(ActiveCell.Address).Name = "StartCell"
Set rng = ActiveSheet.Cells.Find(What:=TelNo, After:=changedCell LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not rng Is Nothing And rng.Address <> ChangedCell.Address Then checkDuplicate = True
If ActiveSheet.Index < ActiveWorkbook.Worksheets.Count Then
For i = ActiveSheet.Index + 1 To ActiveWorkbook.Worksheets.count
With Worksheets(i)
Set rng = .Cells.Find(What:=TelNo, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not rng Is Nothing Then checkDuplicate = True
End With
Next i
End If
End Function
Обратите внимание, что я добавил .
перед вызовом range.find
.Это для With Worksheets(i)
, чтобы вступить в силу.Это также причина, по которой я удалил Worksheets(i).Activate
, поскольку он не нужен при полной квалификации листов.
Еще один момент, на который следует обратить внимание: Range(ActiveCell.Address).Name = "StartCell"
неявно вызывается на ActiveSheet
.
Вам следуетизбегайте использования ActiveSomething
в вашем коде в целом, так как это может вызвать множество ошибок.