2015-08-14 37 views
0
Sub Macro1() 

    Dim ws As Worksheet 

    For Each ws In ActiveWorkbook.Worksheets 

    Cells.Find(What:="abc", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ 
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ 
    , SearchFormat:=False).Activate 
    ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate 
    ActiveCell.Value = "xyz" 

    Next ws 

    End Sub 

我通过循环遍历Excel工作簿中的所有工作表来使用以下代码。我想在工作表中查找“abc”。如果我在特定的工作表上找到“abc”,我希望它下面的单元格的值设置为“xyz”。 如果在Worksheet1的单元格A2上发现“abc”,我希望单元格A3为“xyz”。同样,如果在Worksheet2的单元格B4上找到“abc”,我希望单元格B5为“xyz”。这必须为整个工作簿完成。但是,循环遍历整个工作簿不会发生,代码只是在工作表1中循环。当Cells.Find执行代码时,VBA循环工作表失败

+0

您使用'ActiveCell'可能会导致意外结果的方式存在一些问题,但是我没有看到会导致循环无法运行的任何问题。你是否收到任何类型的错误消息?工作簿中是否有多个工作表? (图表不包含在“工作表”集合中) – CBRF23

+0

我的工作簿中有多个工作表(不包括图表)。正如在Answers中user5228244所提到的,在Workbook循环中使用ws.Activate使代码正常工作。 –

回答

0
For Each ws In ActiveWorkbook.Worksheets 
    ws.Activate 

Cells.Find(What:="abc", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ 
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ 
, SearchFormat:=False).Activate 
ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate 
ActiveCell.Value = "xyz" 

Next ws 
+0

完美工作。谢谢! –

+0

如果找不到匹配项,这将引发错误。当找不到匹配时,从'.Find'返回的结果是空(空引用指针),所以试图直接在返回时使用'.Activate'会给你一个未找到对象或null引用的运行时错误。除此之外,即使没有找到匹配,使用'activecell.offset'也会在某个单元格中写入'123'。最后,请参阅[如何避免使用select(或activate)](http://%20http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – CBRF23

+0

当然,但Rejoy Mathews纠正它(我希望) – user5228244