Написать цикл for, чтобы найти значение от активной строки до конца последнего листа - PullRequest
0 голосов
/ 20 мая 2019

У меня есть рабочая книга, которая содержит 4 рабочих листа, каждый на один квартал в 2019 году.
Я хотел бы написать функцию, чтобы проверить, является ли ввод активной ячейки дубликатом от строки активной ячейки до конца строки.последний лист.

Function checkDuplicate(ByVal ChangedCell As Range) As Boolean
     TelNo = ChangedCell.Value

     Range(ActiveCell.Address).Name = "StartCell"
     For i = ActiveSheet.Index To ActiveWorkbook.Worksheets.count
        Worksheets(i).Activate
        With Worksheets(i)
            Set rng = Cells.Find(What:=TelNo, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
        End With
Next i
Application.Goto "StartCell"
If rng Is Nothing Then
    checkDuplicate = False
Else
    checkDuplicate = True
End If

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

1 Ответ

1 голос
/ 20 мая 2019

В вашем нынешнем виде ваш цикл бесполезен.Вы можете сделать это с точно таким же результатом: 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 в вашем коде в целом, так как это может вызвать множество ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...