Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 编写for循环以查找从活动行到最后一个工作表末尾的值_Excel_Vba - Fatal编程技术网

Excel 编写for循环以查找从活动行到最后一个工作表末尾的值

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

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

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

就目前而言,您的循环是无用的。您可以使用完全相同的结果执行此操作:
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。