2015-08-14 35 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