【问题标题】:Write a for loop to find a value from the active row to the end of last worksheet编写一个 for 循环以查找从活动行到最后一个工作表末尾的值
【发布时间】:2019-05-21 12:36:32
【问题描述】:

我有一个包含 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

但是,它似乎甚至无法在活动单元格下方的行中找到重复的值。

【问题讨论】:

  • 'TelNo' 是否初始化为一个值?你有没有通过调试器运行它来检查它在寻找什么?
  • 是的,我使用了 MsgBox 并验证它可以显示值
  • 你能多加一点代码吗?就像变量的初始化一样。

标签: excel vba


【解决方案1】:

就目前而言,您的循环是无用的。您可以使用完全相同的结果执行此操作: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,因为它会导致大量错误。

【讨论】:

  • 它似乎总是返回true...是因为我正在寻找的值也在同一个工作表中吗?谢谢!
  • 我试过了,但只要那里只有一个唯一值,它仍然会返回真......我认为逻辑应该是正确的,但我不知道哪里出错了。
  • 我的错,我的编辑出错了。现在应该修好了。代码在ChangedCell 之后检查ActiveSheet 上的重复项,然后遍历以下工作表并检查每个工作表。它在第一次找到后返回True,但仍然继续使用代码。您可以在If Not rng Is Nothing Then checkDuplicate = True 的行上添加: Exit Function 以立即退出该功能。
  • @George 我再次修改了我的答案,应该可以解决总是返回True 的问题。刚才我意识到Find() 在到达指定范围的末尾时会环绕到它正在查看的范围的开头。
  • 谢谢,我解决了这个问题。请注意,条件“And rng.Address ChangedCell.Address”应放在第一个 .find 方法中,以避免检查 activesheet 中的 changedcell。
猜你喜欢
  • 2016-02-09
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
相关资源
最近更新 更多