Excel 编写for循环以查找从活动行到最后一个工作表末尾的值
我有一份包含4张工作表的工作簿,每张工作表用于2019年的一个季度。Excel 编写for循环以查找从活动行到最后一个工作表末尾的值,excel,vba,Excel,Vba,我有一份包含4张工作表的工作簿,每张工作表用于2019年的一个季度。 我想写一个函数来检查活动单元格的输入是否是从活动单元格行到最后一个工作表末尾的重复 Function checkDuplicate(ByVal ChangedCell As Range) As Boolean TelNo = ChangedCell.Value Range(ActiveCell.Address).Name = "StartCell" For i = ActiveSheet.Ind
我想写一个函数来检查活动单元格的输入是否是从活动单元格行到最后一个工作表末尾的重复
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
但是,它似乎在活动单元格下面的行中甚至找不到重复的值。就目前而言,您的循环是无用的。您可以使用完全相同的结果执行此操作:
Set rng=Worksheets(4).Cells.Find(What:=TelNo,LookIn:=xlValues,LookAt:=xlother,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
函数checkDuplicate(ByVal ChangedCell作为范围)作为布尔值
TelNo=ChangedCell.Value
范围(ActiveCell.Address).Name=“StartCell”
Set rng=ActiveSheet.Cells.Find(What:=TelNo,After:=changedCell LookIn:=xlValues,LookAt:=xlother,SearchOrder:=xlByRows,SearchDirection:=xlNext,MatchCase:=False)
如果Not rng为Nothing且rng.Address已更改Cell.Address,则选中Duplicate=True
如果ActiveSheet.Index
注意,我在范围之前添加了一个
。find
调用。也就是说,带有工作表(i)的将生效。这也是我删除工作表(I)的原因。激活,因为完全限定工作表时不需要它。
另外需要注意的是:Range(ActiveCell.Address)。Name=“StartCell”
在ActiveSheet
上隐式调用
一般来说,您应该避免在代码中使用ActiveSomething
,因为它会导致大量错误。是否用值初始化了“TelNo”?你有没有通过调试器运行它来检查它在寻找什么?是的,我使用了MsgBox和veirfied,它可以显示值。你可以添加更多的代码吗?就像变量的初始化一样。它似乎总是返回true。。。是否因为我要查找的值也在同一工作表中?谢谢我试过了,但只要有一个唯一的值,它仍然返回真的。。。。我认为逻辑应该是正确的,但我不知道哪里出了问题。糟糕的是,我在编辑中犯了一个错误。现在应该修好了。代码检查ChangedCell
之后的ActiveSheet
上是否存在重复项,然后循环检查以下工作表并检查每个工作表。它在第一次查找后返回True
,但仍会继续执行代码。您可以在两个行上添加:Exit Function
,如果不是rng,则选中duplicate=True
立即退出该函数。@George我再次修改了我的答案,这应该可以解决始终返回True
的问题。我刚才意识到一个事实,Find()
在到达指定范围的末尾时,会环绕到它正在查看的范围的开头。谢谢,我解决了这个问题。请注意,条件“和rng.Address ChangedCell.Address”应该放在第一个.find方法中,以避免在activesheet中检查ChangedCell。